초코딩(chocoding)

[CodeUp / java] [기초-배열연습] 2차원 배열 달팽이 채우기 4-1 본문

[Java] 알고리즘 문제풀이

[CodeUp / java] [기초-배열연습] 2차원 배열 달팽이 채우기 4-1

sweetychocoding 2023. 9. 10. 16:05
728x90

난이도 급상승.................

처음에 접근할 때, 어쨋든 컴퓨터는 왼쪽에서 오른쪽으로, 위에서 아래로 출력하기 때문에

숫자간의 관계를 생각해봤다.

뭐... 관계성이 있기는 했는데 내가 억지로 끼워맞춘 감이 없지 않아 있었다.

근데 숫자의 관계성으로만 접근하기에는 너무 한계가 많다고 느꼈고

이 방법이 아닌 .. 느낌이 들어서 chatGPT한테 힌트 좀 달라고 했다.

 

지피티가 준 힌트는 바로 바로

고로쿠만.... 고로케였구만..... (🥯 고로케 임티 없네)

숫자의 연관성을 고려해서 왼쪽에서 오른쪽으로, 위에서 아래로 출력하는 것이 아니라

진짜 숫자 순서대로 (달팽이 모양으로) 찍는 것이었어!!!!!!!!!!

 

힌트를 보고 나서

힌트를 보지 않았으면 평생 문제를 풀 수 없었겠다... 라는 생각이 들었다

(언젠가... 풀 수 있었을까? 접근법 자체부터가 달랐는데.........)

.

.

.

 

힌트를 얻고 작성한 코드는 아래와 같다.

package example01;

import java.util.Scanner;

public class Ex04_Chapter6 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt(); // 2차원 배열의 행
		int m = sc.nextInt(); // 2차원 배열의 열
		int[][] arr = new int[n][m]; // 입력받은 n, m의 크기만큼 배열 정의
		int value = 1; // 출력될 숫자
		int row = 0, col = 0; // 2차원 배열의 행과 열 설정을 위한 변수
		int direction = 0; // 방향을 설정하기 위한 변수
						   // 오른쪽: 0, 아래: 1, 왼쪽: 2, 위: 3

		sc.close();

		while (value <= n * m) {
			arr[row][col] = value++;
			switch (direction) {
			case 0: // 오른쪽
				if (col + 1 < m && arr[row][col + 1] == 0) {
					//
					col++;
				} else {
					direction = 1;
					row++;
				}
				break;

			case 1: // 아래
				if (row + 1 < n && arr[row + 1][col] == 0) {
					row++;
				} else {
					direction = 2;
					col--;
				}
				break;

			case 2: // 왼쪽
				if (col - 1 >= 0 && arr[row][col - 1] == 0) {
					col--;
				} else {
					direction = 3;
					row--;
				}
				break;

			case 3: // 위
				if (row - 1 >= 0 && arr[row - 1][col] == 0) {
					row--;
				} else {
					direction = 0;
					col++;
				}
				break;
			} // switch
		} // while

		for (int i = 0; i < n; i++) {
			for (int j = 0; j < m; j++) {
				System.out.printf("%s%d  ", arr[i][j]/10 >= 1 ? "" : " ",arr[i][j]);
			}
			System.out.println();
		}
	}

}

달팽이 모양은 "오른쪽으로 이동 -> 아래로 이동 -> 왼쪽으로 이동 -> 위로 이동"을 계속해서 반복하기 때문에

switch문을 통해서 네가지의 상황을 만들어주었다.

 

그리고 마지막 for문을 통해서 2차원 배열을 출력해주었는데

코드업에서는 자릿수 상관없이 무조건 숫자를 출력했다.

 

하지만 나는 가독성을 더 좋게 하기 위해 두자리 숫자까지만 정렬해서 출력할 수 있도록

삼항식을 써서 자릿수에 따른 공백을 설정해주었다.

 

출력된 형태는 다음과 같다.

 

이러한 접근법을 바로 생각해낸 사람이 있다면.....

진짜 리스펙이다

 

사람들은 왤케 똑똑할까?

그리고 똑똑한 사람은 왤케 많을까?

 

근데 그 많고 많은 사람들 중에

왜 난 포함되지 않을까..................ㅋ

 

참 슬프군....

 

 

자아성찰까지 하게 해준 코드업...문제였다..

 

728x90