백준 1913번: 달팽이


문제 설명

  • 2차원 배열을 원하는 순서대로 순회해 봅시다.

접근법

  • 아래 -> 오른쪽 -> 위 -> 왼쪽 -> ...의 움직임이 반복됩니다.
    • 4개가 반복되기 때문에 나머지 연산을 사용하면 효율적입니다.
  • 방향을 바꾸는 경우는 다음과 같습니다.
    • 다음 칸이 board를 벗어날 때
    • 다음 칸에 0 이외의 숫자가 들어있을 때

정답

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

public class Main {
	public static void main(String[] args) throws NumberFormatException, IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int N = Integer.parseInt(br.readLine()); 
		int k = Integer.parseInt(br.readLine());
		int[][] board = new int [N][N];
		int[][] direction = {{1,0},{0,1},{-1,0},{0,-1}};
		int cnt = N*N;
		int x = 0;
		int y = 0;
		int d = 0;
		int[] answer = new int[2];
		while (cnt>0) {
			if (cnt == k) {
				answer[0] = x;
				answer[1] = y;
			}
			board[x][y] = cnt--;
			// 다음으로 나아갈 수 있으면 그대로 이동
			if (0<= x+direction[d][0] && x+direction[d][0] < N && 0<= y+direction[d][1] && y+direction[d][1] < N && board[x+direction[d][0]][y+direction[d][1]] ==0) {
				x += direction[d][0];
				y += direction[d][1];
			}else { // 나아갈 수 없으면 방향을 바꿔서 이동
				d =(d+1)%4;
				x += direction[d][0];
				y += direction[d][1];
				
			}
			
		}
		StringBuilder sb = new StringBuilder();
		for (int i = 0; i < N; i++) {
			for (int j = 0; j < N; j++) {
				sb.append(board[i][j]+" ");
			}
			sb.append("\n");
		}
		System.out.print(sb.toString());
		System.out.println((answer[0]+1)+" "+(answer[1]+1));
	}

}

기타

  • 한번에 직선을 쭉 가는걸로 생각했는데 한칸 씩 생각해야 설계가 더 깔끔하다.
  • 나는 못풀었는데 이게 쉬운문제라고 해서 슬펐다.

좋은 웹페이지 즐겨찾기