본문 바로가기

ALGORITHM

백준 1913 달팽이 (Java)

1. 문제 링크

 

1913번: 달팽이

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

www.acmicpc.net

 

2. 문제 및 입출력예제

 

 

3. 문제 풀이

흔히 생각하는 달팽이의 역순 진행이다.

제일 큰 숫자부터 돌면서 방향 벡터를 이용해 숫자를 채웠다.

표를 벗어나거나 이미 숫자가 들어간 자리라면 방향을 바꾼다.

그리고 출력은 꼭 StringBuilder로 해야 하는 것 같다. System.out.print로 모든 것을 출력하니까 시간 초과가 나왔다.

 

4. 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) throws IOException{
       BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
       StringBuilder sb = new StringBuilder();
     
       int N = Integer.parseInt(br.readLine());
       int target = Integer.parseInt(br.readLine());
       int findX = 0, findY = 0;
       int[][] map = new int[N][N];
       int[] dx = {1, 0, -1, 0};
       int[] dy = {0, 1, 0, -1};
       
       int d= 0;
       int x = 0;
       int y = 0;
       map[0][0] = N*N;
       for(int i=N*N-1;i>0;) {
    	   
    	   x += dx[d];
    	   y += dy[d];
    	   if((x<0||x>=N)||(y<0||y>=N)|| map[x][y]!=0) {
    		   x-=dx[d];
    		   y-=dy[d];
    		   d++;
    		   if(d==4) d=0;
    	   }
    	   else {
    		   if(i==target) {
    			   findX = x;
    			   findY = y;
    		   }	
    		   map[x][y] = i--;
    	   }
       }
       for(int i=0;i<N;i++) {
    	   for(int j=0;j<N;j++) {
    		   sb.append(map[i][j]+" ");
    	   }
    	   if(i!=N-1) {
    		   sb.append("\n");
    	   }
       }
       System.out.println(sb);
       System.out.println((findX+1)+" "+(findY+1));
	}
}