https://swexpertacademy.com/main/code/problem/problemDetail.do
1. 서론
D2... 그러니까 쉬운 문제인데 나한텐 어려웠다.... 사고력이 때문인지 뭔지 ㅎ 삼성에서 좋아하는 배열 가지고 노는 문제인데 2차원 배열 안을 빙글빙글 도는 로직...
2. 문제 풀이
문제 자체는 간단하다. 숫자를 입력받고 그 크기의 2차원 배열을 만들고 그 값들을 0,0부터 빙글빙글 돌면서 값을 채워주는 것이다.
근데 어떻게 조건을 줘야 방향을 적절하게 바꾸는지를 모르겠는 것이다... 예전에도 딱 이런 문제는 아니더라도 빙글빙글 돌면서 값을 처리해줘야 하는 문제를 만난 적이 있는데 그때도 못 풀었던 것 같은데 또 생각이 안 나서 (사람은 안 바뀐다) 결국 인터넷에 검색해봤다.
https://stupids.tistory.com/entry/C언어-2차원-배열-달팽이-알고리즘
역시나 한 눈에는 모르겠고 읽어보니 그렇게 동작한다는 것만 알겠고 스스로는 짜지 못할 것 같다... 외우자 ㅎ
가장 놀랐던 점은 빙글빙글 돌면서 값을 쓰는동안 범위가 같은 부분이 딱 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이면 배열을 다 돈 것이므로 반복문을 빠져나온다.
'Algorithm > Unsolved' 카테고리의 다른 글
[Unsolved][JAVA] SWEA 1244 최대 상금 (0) | 2022.08.17 |
---|---|
[Unsolved][JAVA] 백준 1074 Z (0) | 2022.08.12 |
[Unsolved][JAVA] SWEA 1249 보급로 (0) | 2022.07.20 |
[Unsolved][C++] 프로그래머스 가장 큰 수 (0) | 2022.06.18 |
[Unsolved][C++] 프로그래머스 여행경로 (0) | 2022.06.17 |