728x90
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부터 (n*(n+1)/2) 까지 이다.
채우는 방향은 하, 우, 상 이 반복된다.
하 : x 좌표 증가, y 좌표 그대로
우 : y 좌표 증가, x 좌표 그대로
상 : x 좌표 감소, y 좌표 감소
n*n 크기의 2차원 배열을 생성한 후 x, y 좌표를 증감해가며 숫자를 채운다.
만약 n이 5라면, 1~15 까지 이며
1~5 (5개) 하 -> 6~9 (4개) 우 -> 10~12 (3개) 상 -> 13~14 (2개) 하 -> 15 (1개) 우 과정으로 채우게 된다.
이중 loop를 돌려 mod 연산을 이용하여 하, 우, 상을 반복하며 숫자를 채운다
결과를 반환할 1차원 배열에 2차원 배열의 숫자를 순서대로 넣는다
class Solution {
public int[] solution(int n) {
int num_max = n*(n+1)/2, num = 1, i, j, x = -1, y = 0, idx = 0;
int a[][] = new int[n][n];
int ans[] = new int[num_max];
for( i = 0; i < n; i++ ) {
for( j = 0; j < n-i; j++ ) {
if( i % 3 == 0 ) x++;
if( i % 3 == 1 ) y++;
if( i % 3 == 2 ) { x--; y--; }
a[x][y] = num++;
}
}
for( i = 0; i < n; i++ )
for( j = 0; j < i+1; j++ )
ans[idx++] = a[i][j];
return ans;
}
}
반응형
'코딩 문제 풀기 ( Algorithm problem solving ) > 프로그래머스 ( Programmers )' 카테고리의 다른 글
[프로그래머스(Programmers)][자바(java)] (Lv2) 최댓값과 최솟값 (0) | 2020.10.15 |
---|---|
[프로그래머스(Programmers)][자바(java)] (Lv2) 숫자의 표현 (0) | 2020.10.15 |
[프로그래머스(Programmers)][자바(java)] (Lv1) 폰켓몬 <찾아라 프로그래밍 마에스터> (0) | 2020.10.15 |
[프로그래머스(Programmers)][자바(java)] (Lv2) 땅따먹기 (0) | 2020.10.15 |
[프로그래머스(Programmers)][자바(java)] (Lv2) 다음 큰 숫자 (0) | 2020.10.15 |