Algorithm/BOJ
BOJ 10157 자리배정
wow
2021. 3. 8. 22:38
문제 분석
- 하/우/상/좌 방향으로 반복하여 숫자를 찾는다.
- 위의 방향으로 한 바퀴를 돌면 끝 값을 -1해주면서 갈 수 있는 최대 숫자까지 접근한다.
문제 풀이
1) dr/dc 배열을 통해 하/우/상/좌 방향으로 이동할 수 있도록 값을 담는다.
2) 최대값까지 갈 수 있도록 4방향을 반복한다.
3) 원하는 값에 도달하면 해당 좌표 위치를 출력한다.
cf) 방문 여부를 판단하여 방문하였을 경우 길이를 줄인다. (길이는 R과 C로 판단하고, 한 바퀴를 돌고 안 쪽 사각형으로 들어갈 경우 visited를 활용하여 다 돌았는지 확인한다.)
★ 출력 형식에 주의해야한다. ★
배열로 받아서
0,0 / 0,1 / 0,2 / 0,3 / 0,4 / 0,5 / 0,6
1,0 / 1,1 / 1,2 / 1,3 / 1,4 / 1,5 / 1,6
2,0 / 2,1 / 2,2 / 2,3 / 2,4 / 2,5 / 2,6
3,0 / 3,1 / 3,2 / 3,3 / 3,4 / 3,5 / 3,6
4,0 / 4,1 / 4,2 / 4,3 / 4,4 / 4,5 / 4,6
5,0 / 5,1 / 5,2 / 5,3 / 5,4 / 5,5 / 5,6
로 저장되면서 하우상좌방향으로 움직이는데 42의 경우 r c로 출력하게되면 3, 4(r+1, c+1)로 출력된다.그러나 프로그램에서 원하는 출력 형식은 4,3이다.
즉, c와 r이 같은 대각선을 기준으로 대칭되어 출력해야한다.
배열의 c와 r값으로 출력해야 올바른 출력형식대로 출력된다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
private static int[][] map;
private static boolean[][] visited;
private static int[] dr = { 1, 0, -1, 0 };
private static int[] dc = { 0, 1, 0, -1 };
private static int C, R, K, nr, nc, r, c, goal;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
C = Integer.parseInt(st.nextToken());
R = Integer.parseInt(st.nextToken());
K = Integer.parseInt(br.readLine());
map = new int[R][C];
visited = new boolean[R][C];
// 다 돌고도 못찾았을 때 최종 끝점
goal = R * C;
// 초기값 설정
map[0][0] = 1;
visited[0][0] = true;
if (K > goal) {// 구하는 자리가 좌표의 최대값보다 크면 바로 0출력
System.out.println(0);
} else {
chk(1, R, C);
}
}// main
private static void chk(int start, int R, int C) {
for (int k = 0; k < 4; k++) {
while (true) {
if (start == K) {
System.out.println((c + 1) + " " + (r + 1));
System.exit(0);
}
nr = r + dr[k];
nc = c + dc[k];
if (nr < 0 || nr >= R || nc >= C || nc < 0)
break;
if (!visited[nr][nc]) {
map[nr][nc] = ++start;
visited[nr][nc] = true;
r = nr;
c = nc;
} else {
break;
}
}
}
chk(start, R - 1, C - 1);
}// chk
}// class-end