문제#
- 링크로 대체
풀이 및 주저리..
SSAFY에서 자바 오프라인 수업 첫날 남는 시간에 풀어보라고 추천을 해주셔서 풀어본 문제이다. 지금까지 배운 내용은 배열까지라 간단하게 생각하고 시도했다가 꽤 생각을 오래하게 된 문제이다. 먼저 for
문을 사용해서 풀어볼 것이냐.. while
을 쓸 것이냐.. 이런 저런 고민과 테두리를 0부터 N-1까지로 네부분으로 쪼개면서 풀어도 어떻게 잘하면 풀 수 있을 것 같은 다양한 풀이방식중에 하나를 선택하는 것이 고민이였다. 처음에는 네부분으로 쪼개면서 풀어보려했지만.. 실패하고 말았다. 과거 백준 문제중에 게리맨더링인가? 하는 선거 구역을 나누는 문제가 있었는데 거기서도 이런 비슷한 개념이 사용된 것 같은데.. 결국 못풀었지만 아무튼..
풀이로 가장 중요한 것은 코드상의 while문 안의 어마어마한 조건식.. 이였던 것 같다. 전체 크기의 안쪽이면서 방향에 따라 처리를 해주기 위해서 조건식이 길어지게 되었고 한쪽방향의 끝까지 가줘야하다보니 좀 지저분해지는 느낌이 있었다. 네방향 처리를 해주는것도 조금 맘에 걸렸지만.. 더 좋은 코드가 생각나질 않아서.. 더 좋은 코드가 생각난다면? 돌아올수도 있다.
코드
package ssafy.swexpert.d2;
import java.util.Scanner;
public class Problem1954 {
static final int[] dx = {0, 1, 0, -1}, dy = {1, 0, -1, 0};
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int iT = sc.nextInt();
for (int i = 1; i <= iT; i++) {
int N = sc.nextInt();
int[][] answerMap = new int[N][N];
// 0 0
int x = 0;
int y = 0;
int dir = 0;
int num = 1;
int temp = 0;
//처음 시작 처리
answerMap[x][y] = num++;
// 4방향이 모두막혔다면 게임은 끝나야한다.
while (temp != 4) {
// 범위의 안쪽이면서 하나씩 진행해 나간다. 처음 방향은 오른쪽
while (x + dx[dir] < N && x + dx[dir] >= 0 && y + dy[dir] < N && y + dy[dir] >= 0 && answerMap[x + dx[dir]][y + dy[dir]] == 0) {
// 마지막에 4방향을 확인해줘야하니 여기에 들어왔으면 temp 를 초기화.
temp = 0;
//하나 전진한 칸을 num++ 하면서 넣어준다.
answerMap[x + dx[dir]][y + dy[dir]] = num++;
// x 와 y의 값을 이동.
x = x + dx[dir];
y = y + dy[dir];
}
// 한쪽끝에 도달했으면 방향을 틀어준다 오 -> 밑 -> 왼 -> 위 -> 오
dir = dir + 1 >= 4 ? 0 : dir + 1;
// 방향을 틀어줬다면 temp를 1더해준다.
temp += 1;
}
// 출력
System.out.println("#" + i);
for (int r = 0; r < N; r++) {
for (int c = 0; c < N; c++) {
System.out.printf(answerMap[r][c] + " ");
}
System.out.println();
}
}
}
}
기억에 남길 것!
- 확실한 풀이방법을 빠르게 결정하자.