[Unsolved][JAVA] SWEA 1954 달팽이 숫자
2022. 8. 3.
반응형

https://swexpertacademy.com/main/code/problem/problemDetail.do

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

1. 서론

 

D2... 그러니까 쉬운 문제인데 나한텐 어려웠다.... 사고력이 때문인지 뭔지 ㅎ 삼성에서 좋아하는 배열 가지고 노는 문제인데 2차원 배열 안을 빙글빙글 도는 로직...

 

2. 문제 풀이

 

문제 자체는 간단하다. 숫자를 입력받고 그 크기의 2차원 배열을 만들고 그 값들을 0,0부터 빙글빙글 돌면서 값을 채워주는 것이다.

근데 어떻게 조건을 줘야 방향을 적절하게 바꾸는지를 모르겠는 것이다... 예전에도 딱 이런 문제는 아니더라도 빙글빙글 돌면서 값을 처리해줘야 하는 문제를 만난 적이 있는데 그때도 못 풀었던 것 같은데 또 생각이 안 나서 (사람은 안 바뀐다) 결국 인터넷에 검색해봤다.

 

https://stupids.tistory.com/entry/C언어-2차원-배열-달팽이-알고리즘

 

[C언어] 2차원 배열 - 달팽이 알고리즘 -

먼저 소스를 보여드리기에 앞서, 달팽이 알고리즘에 대해 설명해드릴게요. 1 2  3           1 2 3 4           1 2  3 4  5  8 9  4          12 13 14  5      ..

stupids.tistory.com

 

역시나 한 눈에는 모르겠고 읽어보니 그렇게 동작한다는 것만 알겠고 스스로는 짜지 못할 것 같다... 외우자 ㅎ

가장 놀랐던 점은 빙글빙글 돌면서 값을 쓰는동안 범위가 같은 부분이 딱 2개씩이라는 것이다.

 

ex)

4x4 배열이라면

1 2 3 4 | 5 6 7  | 8 9 10 | 11 12 | 13 14 | 15 | 16

이런 식인데 4 3 3 2 2 1 1 이기 때문에 이 값을 바꾸는 과정을

4 (여기) 3에 넣어준다. 그러면

4 3

3 2

2 1

1

이런 식으로 작동하면서 값을 넣어줄 수 있다. 그리고 값을 적어 넣으면서 -1을 곱해서 방향을 바꿔준다.

 

지금은 그냥 값을 적는 것에 그치지만 나중에는 이렇게 빙글빙글 탐색하는 문제도 만나게 되겠지... 그때를 위해 잘 기억해 두도록 하자!

 

3. 코드 설명

 

import java.util.*;

public class Solution {

	public static void main(String[] args) {
		Scanner s = new Scanner(System.in);
		
		int t = s.nextInt();
		
		for (int k = 1; k <= t; k++) {
			int n = s.nextInt();
			
			int[][] a = new int[n][n];

			int z = n, x = 0, y = -1, turn = 1, num = 1;
			while(z != 0) {
				for (int i = 0; i < z; i++) {
					y += turn;
					a[x][y] = num++;
				}
				
				z--; //배열 값 채우는 수 조절
				
				for (int i = 0; i < z; i++) {
					x += turn;
					a[x][y] = num++;
				}
				
				turn *= -1; // 방향 조절
			}
			
			System.out.println("#" + k);
			for (int i = 0; i < n; i++) {
				for (int j = 0; j < n; j++)
					System.out.print(a[i][j] + " ");
				System.out.println();
			}
		}	
	}
}

 

위에서 말했던 것처럼 z로 배열의 값을 채우는 범위를 조절하고 turn으로 도는 방향을 조절한다.

z가 0이면 배열을 다 돈 것이므로 반복문을 빠져나온다.

 

 

 

 

 

반응형
myoskin