문제 설명
https://school.programmers.co.kr/learn/courses/30/lessons/68645

제한 사항

입출력 예

풀이
class Solution {
public int[] solution(int n) {
int[] answer = new int[(1 + n) * n / 2];
int tempN = n;
int[][] nums = new int[n][];
for (int i = 0; i < n; i++) nums[i] = new int[i + 1];
int[][] start = new int[3][];
start[0] = new int[] { 0, 0 };
start[1] = new int[] { n - 1, 1 };
start[2] = new int[] { n - 2, n - 2 };
int count = 1;
int check = 0;
while (n != 0) {
check %= 3;
for (int i = 0; i < n; i++) {
switch (check) {
case 0:
nums[start[0][0] + i][start[0][1]] = count++;
break;
case 1:
nums[start[1][0]][start[1][1] + i] = count++;
break;
case 2:
nums[start[2][0] - i][start[2][1] - i] = count++;
}
}
switch (check) {
case 0:
start[0][0] += 2;
start[0][1] += 1;
break;
case 1:
start[1][0] -= 1;
start[1][1] += 1;
break;
case 2:
start[2][0] -= 1;
start[2][1] -= 2;
}
check++;
n--;
}
int index = 0;
for (int i = 0; i < tempN; i++) {
for (int j = 0; j < nums[i].length; j++) {
answer[index++] = nums[i][j];
}
}
return answer;
}
}
후기
뭔가 어디서 본 듯한 문제의 삼각형 버전이다. 그 문제는 x축과 y축을 이용해서 풀 수 있는데 이 문제는 그렇기 풀기 어렵기 때문에 나는 N번 째 행의 M번 째라고 생각하고 풀었다. 풀이의 큰 가닥만 잡아보자면 진행 방향은 총 세 가지 방향이 있다. 좌하향, 우향, 좌상향 이렇게가 삼각형을 그리는 한 사이클이고 크기가 한 칸씩 작아지면서 반복한다. 반복되는 것에도 규칙이 있기 때문에 일단 세 방향의 시작 지점을 지정해놓고, 다음 해당 방향이 진행될 곳을 미리 계산해서 시작 방향을 고쳐놓는다. 이렇게 하면 크게 어렵지 않게 풀 수 있다. 이제 생각한 것을 어떻게 코드로 구현할 것인가가 관건이다.

'코딩테스트 (프로그래머스) > Java' 카테고리의 다른 글
| [프로그래머스][Java][Lv. 2] 큰 수 만들기 (0) | 2024.02.06 |
|---|---|
| [프로그래머스][Java][Lv. 1] 가장 많이 받은 선물 (0) | 2024.02.02 |
| [프로그래머스][Java][Lv. 2] 두 큐 합 같게 만들기 (0) | 2024.01.31 |
| [프로그래머스][Java][Lv. 2] 소수 찾기 (0) | 2024.01.30 |
| [프로그래머스][Java][Lv. 2] 다리를 지나는 트럭 (0) | 2024.01.23 |