1. 문제
홀수인 자연수 N이 주어지면, 다음과 같이 1부터 N2까지의 자연수를 달팽이 모양으로 N×N의 표에 채울 수 있다.
N이 주어졌을 때, 이러한 표를 출력하는 프로그램을 작성하시오. 또한 N2 이하의 자연수가 하나 주어졌을 때, 그 좌표도 함께 출력하시오. 예를 들어 N=5인 경우 6의 좌표는 (4,3)이다.
2. 풀이
int x,y | 현재 숫자 저장할 위치 |
int ansx,ansy | M 저장되어있는 위치 |
int[][] delta | yx순서로, 시계방향 이동값 |
int d | 다음에 옮길 방향 |
int level | 한 방향으로 몇 번 움직여야하는지 저장 |
int cnt | 현재 한 방향으로 움직인 횟수 |
1. i=1부터 N*N까지 돌면서 숫자를 시계방향으로 저장한다. 이때, i==M이라면 그때의 x,y값을 +1씩 해서(문제 인덱스가 1부터 시작) ansx, ansy에 저장한다.
2. board[y][x]에 i를 저장한다.
3. cnt+1한 값이 level과 크거나 같다면
3-1. cnt = 0, d = (d+1)%5한다.
3-2. 만약 d값이 0이 된다면
3-2-1. 한 바퀴 모두 돈 것이므로 level +=2한다. 이전 level에서 그린 동그라미보다 오른쪽+1, 왼쪽+1만큼 커져야 하기 때문이다.
3-2-2. x,y를 다음 값으로 만들고 d+1한 다음 continue한다. delta[0]은 한 바퀴를 다 돌았을 때 위로 한 칸 올라가기 위한 용도다. 따라서 d+1을 해서 바로 다음 방향으로 넘어가야 한다.
4. x,y값을 다음 값으로 만든다.
5. StringBuilder로 board,ansy,ansx를 모아서 출력한다.
import java.io.*;
public class BOJ_1913_달팽이 {
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(in.readLine());
int M = Integer.parseInt(in.readLine());
int[][] board = new int[N][N];
int x = N/2, y = N/2; //i 저장할 위치
int ansx = 0, ansy = 0; //M저장돼있는 위치
int[][] delta = {{-1,0},{0,1},{1,0},{0,-1},{-1,0}};//yx순서로, 시계방향
int d = 4, level = 0, cnt = 0; // d:다음에 옮길 방향
// level : 한 방향으로 몇 번 움직여야하는지
// cnt : 현재 한 방향으로 움직인 횟수
for(int i=1;i<=N*N;i++){
if(i==M){
ansx = x+1;
ansy = y+1;
}
board[y][x] = i;
if(++cnt>=level) {
cnt = 0;
d = (d+1)%5;
if(d==0) {
level+=2;
x += delta[d][1];
y += delta[d][0];
d++;
continue;
}
}
x += delta[d][1];
y += delta[d][0];
}
StringBuilder sb = new StringBuilder();
for(int i=0;i<N;i++){
for(int j=0;j<N;j++){
sb.append(board[i][j]).append(' ');
}
sb.append('\n');
}
sb.append(ansy).append(' ').append(ansx);
System.out.print(sb);
}
}
3. 결과
종종 구현 문제도 풀어야겠다. 오랜만에 풀었더니 '0'.. 이 표정으로 몇 분간 앉아있었당..
'코딩테스트 > BOJ' 카테고리의 다른 글
[BOJ] 17266 어두운 굴다리 - JAVA (0) | 2023.04.20 |
---|---|
[BOJ] 2725 보이는 점의 개수 - JAVA (0) | 2023.04.19 |
[BOJ] 14465 소가 길을 건너간 이유 5 - JAVA (0) | 2023.04.13 |
[BOJ] 20291 파일정리 - JAVA (1) | 2023.04.12 |
[BOJ] 12919 A와 B 2 - JAVA (0) | 2023.04.11 |
댓글