백준 1913 - 달팽이

Updated:

Java

1913 번 - 달팽이

문제

접근 방법

중심 점에서 이동하는 방향을 보니, 위로 1칸 -> 오른쪽 1칸 -> 아래로 2칸 -> 왼쪽 2칸 -> 위로 3칸 ….
의 방법으로 한번 방향을 바꿀 때 까지 [1, 1, 2, 2, 3, 3, 4, 4, 5, 5…]칸의 이동을 한다는 패턴을 발견하였다.
따라서, 위의 패턴대로 구상하여 해결

코드

import java.util.*;
import java.io.*;

public class Main {
	static int n, result, k;
	public static void main(String[] args) throws IOException {
		//System.setIn(new FileInputStream("res/mainInput.txt"));	//제출 할 때 주석해야함
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    	n = stoi(br.readLine());
    	k = stoi(br.readLine());

    	int[][] snail = new int[n][n];
    	int cnt = 1;
    	int y = n / 2;	// 처움 중심 점
    	int x = n / 2;	// 처움 중심 점
    	int rY = 0, rX = 0;
    	// 상 우 하 좌
    	int[] dy = {-1,0,1,0};
    	int[] dx = {0,1,0,-1};

    	boolean next = false;
    	int dirBrdr = 1;		// 현재 방향으로 최대 몇 칸 까지 이동할 수있는가
    	int dirCngCnt = 0;		// 현재 방향으로 지금까지 몇칸 갔는지
    	int dirIdx = 0;			// 현재 방향
    	while(cnt <= n * n) {
    		snail[y][x] = cnt;
    		if(cnt == k) {
    			rY = y;
    			rX = x;
    		}

    		cnt++;

    		y += dy[dirIdx];
    		x += dx[dirIdx];

    		dirCngCnt++;
    		if(dirBrdr == dirCngCnt) {	// 만약 현재 방향으로 갈 수있는 만큼 이동 하였을 때
    			dirCngCnt = 0;
    			dirIdx = (dirIdx + 1) % 4;	// 방향 전환

    			if(!next) {
    				next = true;
    			}
    			else {		// 짝수번 만큼 이동
    				dirBrdr++;	// 다음 번의 방향에서는 한번 더 움직일 수 있다.
    				next = false;
    			}
    		}
    	}
    	// 결과 출력
    	StringBuilder sb = new StringBuilder();
    	for(int i = 0; i < n; i++) {
    		for(int j = 0; j < n; j++) {
    			sb.append(snail[i][j]).append(" ");
    		}
    		sb.append("\n");
    	}
    	sb.append(rY + 1).append(" ").append(rX + 1);
    	System.out.println(sb.toString());

    	br.close();
	}

	static int stoi(String str) {
    	return Integer.parseInt(str);
    }
}

총평

후기

간단한 탐색 문제였다.

개선할 점