백준 1959번: 달팽이2


문제 설명

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

접근법

  • 오른쪽 -> 아래 -> 왼쪽 -> 위 -> ...의 움직임이 반복됩니다.
    • 4개가 반복되기 때문에 나머지 연산을 사용하면 효율적입니다.
  • 방향을 바꾸는 경우는 다음과 같습니다.
    • 다음 칸이 board를 벗어날 때
    • 다음 칸에 0 이외의 숫자가 들어있을 때
  • while문 안에서의 구현을 이렇게 생각하면 편합니다.
    1.일단 board[x][y]를 채웁니다.
    2.그 다음 어느방향으로 움직일지를 결정합니다.
    • 검증된 xy가 들어오기 때문에 1번에서 일단 board[x][y]를 채우는게 가능합니다.

정답

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));
		String[] s = br.readLine().split(" ");
		int M = Integer.parseInt(s[0]);
		int N = Integer.parseInt(s[1]);
		int x = 0;
		int y = 0;
		int[][] board = new int[M][N];
		int[][] direction = {{0,1},{1,0},{0,-1},{-1,0}};
		int d = 0;
		int cnt = 0;
		int answer = 0;
		while (cnt<M*N) {
			board[x][y] = ++cnt;
			if (0<=x+direction[d][0] && x+direction[d][0]<M && 0<=y+direction[d][1] && y+direction[d][1]<N && board[x+direction[d][0]][y+direction[d][1]] == 0) {
			}else {
				d = (d+1)%4;
				answer ++;
			}
			x+=direction[d][0];
			y+=direction[d][1];			
			
		}
		System.out.println(answer-1);
				

	}
}

좋은 웹페이지 즐겨찾기