코딩테스트/BOJ

[BOJ] 1913 달팽이 - JAVA

5월._. 2023. 4. 15.
728x90

1. 문제

 

1913번: 달팽이

N개의 줄에 걸쳐 표를 출력한다. 각 줄에 N개의 자연수를 한 칸씩 띄어서 출력하면 되며, 자릿수를 맞출 필요가 없다. N+1번째 줄에는 입력받은 자연수의 좌표를 나타내는 두 정수를 한 칸 띄어서

www.acmicpc.net

홀수인 자연수 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'.. 이 표정으로 몇 분간 앉아있었당..

댓글