728x90
반응형
n진수 게임에 이어서 Level 2짜리 문제를 풀었는데
제한사항을 잘 보고 풀어야한다는걸 다시 한 번 느끼게 되는 것 같다.
programmers.co.kr/learn/courses/30/lessons/68645
문제 설명
정수 n이 매개변수로 주어집니다. 다음 그림과 같이 밑변의 길이와 높이가 n인 삼각형에서 맨 위 꼭짓점부터 반시계 방향으로 달팽이 채우기를 진행한 후, 첫 행부터 마지막 행까지 모두 순서대로 합친 새로운 배열을 return 하도록 solution 함수를 완성해주세요.
제한사항
- n은 1 이상 1,000 이하입니다.
입출력 예
n | result |
4 | [1,2,9,3,10,8,4,5,6,7] |
5 | [1,2,12,3,13,11,4,14,15,10,5,6,7,8,9] |
6 | [1,2,15,3,16,14,4,17,21,13,5,18,19,20,12,6,7,8,9,10,11] |
입출력 예 설명
입출력 예 #1
- 문제 예시와 같습니다.
입출력 예 #2
- 문제 예시와 같습니다.
입출력 예 #3
- 문제 예시와 같습니다.
※ 접근 방식
(1) 제한사항을 보면 1이상으로 명시되어있다. n이 1인 경우도 리턴을 해줘야한다.
(2) 이동방향(dir)은 i와 j값의 영향을 받게 되어있다. 끝에 도달하거나 그 다음 칸이 0이 아니라면 방향을 바꿔줘야 한다.
(3) i와 j값은 방향을 따라간다. ↙방향이면 행을 증가시키고, → 방향이면 행은 감소, 열은 증가시키고, ↖ 방향이면 열을 감소시킨다.
(4) return되는 answer 배열에 값을 넣을 때는 size를 점층적으로 늘려주는 방식으로 한다.
ex) size : 1일때 1층. 1층일 땐 값 한번만 넣어주고 size를 1 증가. size : 2일때 값을 2번 넣어주는 식으로 생각한다.
package triangleSnail;
import java.util.Arrays;
public class TriangleSnail {
public static void main(String[] args) {
Solution s = new Solution();
System.out.println(Arrays.toString(s.solution(4)));
System.out.println(Arrays.toString(s.solution(5)));
System.out.println(Arrays.toString(s.solution(6)));
}
}
class Solution {
public int[] solution(int n) {
if(n == 1) {
int[] arr1 = {1};
return arr1;
}
int[][] arr = new int[n][n];
int num = 0, i = 0, j = 0;
int dir = 0; // ↙ : dir == 0, → : dir == 1, ↖ : dir == 2
boolean cir = true;
while(cir) {
// 값 대입
if(arr[i][j] == 0) arr[i][j] = num + 1;
else break;
// 방향전환
if(dir == 0 && (i == n-1 || (i < n-1 && arr[i+1][j] != 0))) {
dir++;
} else if(dir == 1 && ((i == 0 && j == n-1) || ((i > 0 && j < n) && arr[i-1][j+1] != 0))) {
dir++;
} else if(dir == 2 && (j == 0 || (j > 0 && arr[i][j-1] != 0))) {
dir = 0;
}
// 칸 이동
if(dir == 0) i++;
else if(dir == 1) {
i--; j++;
} else j--;
num++;
}
int[] answer = new int[num];
int size = 0, idx = 0, originI = 0;
i = 0; j = 0;
// 1층 -> 값 1개, 2층 -> 값 2개, 3층 -> 값 3개 ... 이런 식으로 생각하기
while(size < n) {
i = originI;
for (int k = 0; k <= size; k++) {
answer[idx++] = arr[i][j];
i--; j++;
}
size++; j = 0; originI++;
}
return answer;
}
}
728x90
반응형
'코딩테스트 > 프로그래머스' 카테고리의 다른 글
[프로그래머스/java] 이진 변환 반복하기 (0) | 2021.03.12 |
---|---|
[프로그래머스/java] 피보나치 수 - 동적 프로그래밍 DP(Dynamic Programming - top- down, bottom-up) (0) | 2021.03.11 |
[프로그래머스/java] 2018 KAKAO BLIND RECRUITMENT [3차] n진수 게임 (0) | 2021.03.09 |
[프로그래머스/java] 체육복(탐욕법) (0) | 2021.01.29 |
[프로그래머스/java] 2021 KAKAO BLIND RECRUITMENT신규 아이디 (0) | 2021.01.28 |
댓글