[백준 1913번] 달팽이 with Java

guswls·2024년 5월 6일
0

알고리즘

목록 보기
22/39
post-custom-banner

문제


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



코드


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

class Main {
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int N = Integer.parseInt(br.readLine());
		int find = Integer.parseInt(br.readLine());

		int[][] arr = new int[N][N];
		int max = N * N;
		int x = N / 2;
		int y = N / 2;
		int value = 0;
		int limit = 1;
		while (true) {
			for (int i = 0; i < limit; i++) {
				arr[y][x] = ++value;
				--y;
			}

			if (value == max) {
				break;
			}

			for (int i = 0; i < limit; i++) {
				arr[y][x] = ++value;
				++x;
			}

			++limit;

			for (int i = 0; i < limit; i++) {
				arr[y][x] = ++value;
				++y;
			}

			for (int i = 0; i < limit; i++) {
				arr[y][x] = ++value;
				--x;
			}

			++limit;

		}

		StringBuilder sb1 = new StringBuilder();
		StringBuilder sb2 = new StringBuilder();
		for (int i = 0; i < N; i++) {
			for (int j = 0; j < N; j++) {
				sb1.append(arr[i][j]).append(" ");

				if (arr[i][j] == find) {
					sb2.append(i + 1).append(" ").append(j + 1);
				}
			}
			sb1.append(System.lineSeparator());

		}
		sb1.append(sb2);
		System.out.println(sb1);
	}

}


문제 이해


  • 문제대로 출력하고, 두번째 입력으로 들어온 값이 어느 좌표에 존재하는지 출력하는 문제이다.


풀이 방법


  • 이 문제를 해결하려면 아래 규칙을 이해해야 한다.
  • 좌측 최상단에서 반시계방향으로 돌며 초기화하는 방법도 있긴 하나, 위 규칙을 이용하는 것이 가장 쉽다.
  • 상, 우, 하, 좌 순서대로 수를 출력하되 상, 우, 하, 좌 두 동작으로 나누어 출력되는 수의 범위를 1씩 늘리면 된다.
  • 세세한 부분은 위 규칙을 찾은 후, 구현을 하면서 조금씩 조정하면 해결할 수 있다.


핵심 포인트


  • 위 그림의 규칙을 파악하고, 코드로 옮기는 것이 중요하다. 위 규칙을 파악하지 못하면 상당히 어려워진다.


보완할 점 / 느낀 점


  • 처음 문제를 접근할 때는 바깥에서부터 출력하도록 구현하려 했는데, 구현이 너무 까다로워졌다.
  • 그 후 구글링을 통해 위 규칙을 찾아내고 난 후 코드로 구현하여 문제를 해결할 수 있었다.
  • 그림을 그리고 규칙을 파악하는 것이 중요한 것 같다. 하지만 역시 쉽지 않다. 더 연습해야겠다.


참고자료


profile
안녕하세요
post-custom-banner

0개의 댓글