기록하는 개발자

[백준][JAVA] 1913 : 달팽이 본문

Algorithm

[백준][JAVA] 1913 : 달팽이

밍맹030 2023. 1. 10. 16:26
728x90

https://www.acmicpc.net/problem/1913

 

1913번: 달팽이

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

www.acmicpc.net

 

구현 부분 코드

int[][] arr = new int[n][n];
int value =1,move =1;
int x = n/2, y=n/2;		
        
while(true) {
	for(int i=0; i<move; i++) {
		arr[y--][x] = value++;
	}
	if(value == n*n+1) break;
            
	for(int i=0; i<move; i++) {
		arr[y][x++] = value++;
	}
	move++;
            
	for(int i=0; i<move; i++) {
		arr[y++][x] = value++;
	}
			
	for(int i=0; i<move; i++) {
		arr[y][x--] = value++;
	}
	move++;
}

N = 3      arr[1][1] = 1

N = 5      arr[2][2] = 1

N = 7      arr[3][3] = 1

 

→ arr [ N/2 ][ N/2 ] = 1

 

[ N이 7인 경우 ]

1 : 첫 번째 for 문 / 2 : 두 번째 for문 /.../ 4 : 네 번째 for문 / 노란숫자 : 현재 move 값

찾아보니 가장 바깥쪽 (0,0) 부터 n*n값을 넣고 안쪽으로 돌면서 1까지 채우는 방법도 있었다.

나는 가장 안쪽 1부터 바깥쪽으로 채워나가는 방법을 선택했다.

 

매 바퀴마다 3번의 방향 변화(위→오른쪽→아래→왼쪽)가 있고, 이는 for문을 통해 처리한다.

네 방향을 모두 돌면 while문 한 바퀴 순회가 끝난다.

 

N이 7이므로 arr [ N/2 ][ N/2 ] 인 arr[3][3]에서 시작한다.

 

 

1     arr[3][3] = 1

 

2     arr[3][3] = 2

move = 2

 

3     arr[3][3] = 3

      arr[3][3] = 4

 

4     arr[3][3] = 5

      arr[3][3] = 6

move=3

 

→ 오른쪽에서 아래로 방향이 바뀔 때, 왼쪽에서 위로 방향이 바뀔 때

move(기록해야 할 숫자 개수)가 1씩 늘어난다.

 

최종 제출 코드

import java.io.*;
class Main{
	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int n = Integer.parseInt(br.readLine());
		int c = Integer.parseInt(br.readLine());
		solve(n,c);		
	}
	static void solve(int n, int c){
		int[][] arr = new int[n][n];
		int value =1,move =1;
		int x = n/2, y=n/2;		
        
		while(true) {
			for(int i=0; i<move; i++) {
				arr[y--][x] = value++;
			}
			if(value == n*n+1) break;
            
			for(int i=0; i<move; i++) {
				arr[y][x++] = value++;
			}
			move++;
            
			for(int i=0; i<move; i++) {
				arr[y++][x] = value++;
			}
			
			for(int i=0; i<move; i++) {
				arr[y][x--] = value++;
			}
			move++;
		}
		
		StringBuilder sb = new StringBuilder();
		int cx=0, cy=0;
		for(int i=0; i<n; i++) {
			for(int j=0; j<n; j++) {
				if(c == arr[i][j]) {
					cy=i+1;
					cx=j+1;
				}
				sb.append(arr[i][j] +" ");
			}
			sb.append("\n");
		}
		sb.append(cy+" "+cx);
		System.out.println(sb.toString());
	}

}
728x90