[백준] 1913 달팽이

jyleever·2022년 7월 22일
0

알고리즘

목록 보기
13/26

풀이

달팽이가 이동하는 패턴은 안쪽부터 위로 1칸, 오른쪽으로 1칸, 밑으로 2칸, 왼쪽으로 2칸, 위로 3칸, 오른쪽으로 3칸과 같이 상 -> 우 -> 하 -> 좌 로 이동한다는 것을 알 수 있다.

또한 방향을 2번 전환할때마다 이동하는 최대거리가 1씩 증가하는 것을 확인할 수 있다.
위로 1칸 오른쪽으로 1칸 밑으로 2칸 왼쪽으로 2칸
위로 3칸 오른쪽으로 3칸 밑으로 4칸 왼쪽으로 4칸
이런 식...

코드

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

/**
 * 
 * 상 -> 우 -> 하 -> 좌
상 :
우 :
하 : 상, 우 보다 1번 더 많음
좌 : 상, 우보다 1번 더 많음 
즉 두 번 방향을 전환할 때마다 이동하는
최대거리가 1씩 증가한다


int next : 이동하려는 방향과 관련
int count : 같은 방향으로 이동할 때 횟수

int max : 최대 이동 횟수
int ls : 방향 전환 횟수

for ( int i = 1 ~ n^n )
  배열에 숫자 표시

  현재 방향으로 한 칸 이동
  이 때 현재 위치 + dx[next % 4] 
  next는 계속 증가하므로 4씩 나눠준 나머지로 생각
  같은 방향 이동 횟수++

  방향 전환 (최대 이동 횟수만큼 그 방향으로 이동했다면)
  if(count == max)
    next++
    count = 0 // 같은 방향 이동횟수 초기화
    ls++ // 방향 전환 횟수

   //방향 전환 2번 될 때마다('하'로 바뀔때마다) 최대이동횟수++
   -> 하, 좌로 이동할 때는 상, 우보다 + 1만큼 이동할 수 있기 때문
   if(ls == 2)
     max++
     ls = 0; // 방향 전환 횟수 0으로 초기화
 
 */
public class Main {

	static int[] dx = {-1, 0, 1, 0};
	static int[] dy = {0, 1, 0, -1};
	
	static int N;
	static int X;
	static int[][] arr;
	public static void main(String[] args) throws IOException{
		// TODO Auto-generated method stub

		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		N = Integer.parseInt(br.readLine());
		X = Integer.parseInt(br.readLine());
		
		arr = new int[N][N];
		
		int ansRow = 0;
		int ansCol= 0; // 정답 행, 열
		
		StringBuilder sb = new StringBuilder();
		
		solution();
		
		for(int i=0; i<N; i++) {
			for(int j=0; j<N; j++) {
				sb.append(arr[i][j] + " ");
				if(arr[i][j] == X) {
					ansRow = i+1;
					ansCol = j+1;
				}
			}
			sb.append("\n");
		}
		
		sb.append(ansRow + " " + ansCol);
		System.out.println(sb);
	}
	
	public static void solution() {
		int row = N/2;
		int col = N/2; // 시작 좌표
		
		int next = 0; // 방향 이동
		int count = 0; // 같은 방향 이동 횟수
		int max = 1; // 초기 최대 이동 가능 횟수
		int ls = 0; // 방향 전환 횟수
		
		for(int i=1; i<=N*N; i++) {
			
			arr[row][col]  = i;
			
			// 방향 이동
			row += dx[next % 4];
			col += dy[next % 4];
			
			count++; // 방향 횟수 + 1
			
			if(count == max) {
				// 최대 이동 횟수에 걸린다면
				count = 0;
				next++; // 그 다음 방향
				ls++; // 방향 전환이 2번 되면 '하'로 감
			}
			
			if(ls == 2) {
				// '하'로 가야할 때
				max++;
				ls = 0;
			}
		}
	}

}

0개의 댓글