https://programmers.co.kr/learn/courses/30/lessons/68645
코딩테스트 연습 - 삼각 달팽이
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]
programmers.co.kr
풀이
쉬운 문제처럼 보였으나 규칙성을 찾는데 생각보다 오래걸렸다...
수학 규칙을 추론하고 검증하는데 조금 무뎌진거 같은 느낌이었다.
기본적으로 전체 큰 삼각형의 특성을 살펴보면 된다.
왼쪽아래 대각선으로 내려오거나(Down)
오른쪽으로 지나가거나(Side)
왼쪽위 대각선으로 올라가거나(Up)
세 가지 중 하나이다.
그리고 각 방향의 길이는 n, n-1, n-2, ... ,1 까지 반복된다.
즉, 그림으로 표현하면 다음과 같다.
정리하면 로직은 다음과 같다.
- 각 단계(stg)는 Down(0) - Side(1) - Up(2) 순으로 반복된다
- 단계의 길이는 n에서부터 1까지 작아진다.
- 각 단계별로 값(val)은 1씩 증가
- 값을 입력할 위치(idx)는 방향에 따라 달라짐(Down-> 특정값(cnt)더하기 / Side -> 1 더하기 / Up -> 특정값(cnt) 빼기)
class Solution {
public int[] solution(int n) {
int[] answer = new int[(n* (n+1))/2];
// n번 내려가기 / n-1번 옆으로가기 / n-2번 올라가기
// n-3번 내려가기 / n-4번 옆으로가기 / n-5번 올라가기...
// n-n번이 될때까지
int val = 1; int idx = 0; int cnt = 0;
int stg = 0; // 0 Down 1 Side 2 Up
int stg_n = n;
while(n>0){
// Down
if(stg == 0){
idx = idx + cnt;
answer[idx] = val++;
cnt++;
stg_n--;
// Down -> Side
if(stg_n == 0){
stg = 1; // Side
stg_n = --n;
}
}
// Side
else if(stg == 1){
answer[++idx] = val++;
stg_n--;
// Side -> Up
if(stg_n == 0){
stg = 2; // Up
stg_n = --n;
}
}
// Up
else{
idx = idx - cnt;
answer[idx] = val++;
cnt--;
stg_n--;
// Up -> Down
if(stg_n == 0){
stg = 0; // Down
stg_n = --n;
}
}
}
return answer;
}
}
'Archived(CSE Programming) > 알고리즘(Java)' 카테고리의 다른 글
프로그래머스 - 카카오프렌즈 컬러링북(Java, 2017카카오) (0) | 2020.10.21 |
---|---|
프로그래머스 - 문자열 압축(Java, 2020 카카오) (0) | 2020.10.21 |
프로그래머스 - 스킬트리(Java, LV2) (0) | 2020.10.20 |
프로그래머스 - 124 나라의 숫자(Java, LV2) (0) | 2020.10.19 |
프로그래머스 - 경주로 건설(Java, LV3, 2020 카카오) (2) | 2020.10.19 |