[문제 설명]
정수 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] |
>문제 풀이
삼각형 모양을 배열에 왼쪽 정렬로 담는다고 생각합니다.
그럼 아래 그림의 우측 그림처럼 값이 들어가야겠죠.
이렇게 되면, 3가지 동작으로 이동하면서 idx++값이 들어가게 됩니다.
이동 횟수는 dx[0][0]~dx[5][0]까지 6번 아래로, 5칸 오른쪽, 대각선 4칸, 아래 3칸, 오른쪽 2칸, 대각선 1칸으로 n--로 반복하게 됩니다.
>전체 코드
class Solution {
public int[] solution(int n) {
int[] answer = new int[n*(n+1)/2];
int[][] mat= new int[n][n];
int x=-1, y=0, idx=1;
for(int i=0; i<n; i++){
for(int j=i; j<n; j++){
if(i%3==0){ //아래로
x++;
}else if(i%3==1){//오른쪽으로
y++;
}else{//대각선으로
x--;
y--;
}
mat[x][y]= idx++;
}
}
idx=0;
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
if(mat[i][j]==0) break;
answer[idx++]= mat[i][j];
}
}
return answer;
}
}
https://programmers.co.kr/learn/courses/30/lessons/68645
*참고한 블로그
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스]level 2: 영어 끝말잇기_Java (0) | 2021.08.03 |
---|---|
[프로그래머스]level 2: [1차]뉴스 클러스터링_Java (0) | 2021.08.03 |
[Programmers] level 2: 튜플_Java (0) | 2021.07.03 |
[Programmers] level2 : 게임 맵 최단거리_Java (0) | 2021.07.03 |
[프로그래머스] level 2: 예상 대진표_Java (0) | 2021.06.30 |