반응형
https://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
- 문제 예시와 같습니다.
풀이
풀이 과정
반시계 방향으로 삼각형을 채우는 규칙을 살펴보면 대각선 왼쪽 아래, 가로, 대각선 왼쪽 위 방향으로 반복하며 총 n회 실시한다
삼각형의 각 칸을 좌표로 표현하면 아래와 같이 나타낼 수 있다
[0, 0] | [0, 1] | [0, 2] | [0, 3] |
[1, 0] | [1, 1] | [1, 2] | [1, 3] |
[2, 0] | [2, 1] | [2, 2] | [2, 3] |
[3, 0] | [3, 1] | [3, 2] | [3, 3] |
삼각형을 채우는 규칙과 각 칸의 좌표들을 함께 살펴보면 다음과 같다
- 대각선 아래로 이동할 때는 x좌표가 증가
- 가로로 이동할 때는 y좌표가 증가
- 대각선 위로 이동할 때는 x,y좌표가 감소
이 규칙을 이용하여 삼각형의 좌표에 해당하는 값을 저장할 [n][n]크기의 배열을 선언하고 [0, 0] 좌표부터 달팽이 채우기한 값을 넣어준다
int[][] tri = new int[n][n];
int x = -1; // x 좌표
int y = 0; // y 좌표
int num = 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 if(i % 3 == 2) { // 대각선 위
x--;
y--;
}
tri[x][y] = num++;
}
}
마지막으로 정답을 반환할 배열을 만들고 삼각형의 윗줄의 값부터 차례대로 넣어준다
이때 삼각형 칸의 값이 0인 경우에는 삼각형에 포함되는 범위가 아니기 때문에 제외한다
int[] answer = new int[n*(n+1) / 2]; // 삼각형의 크기 ( 1 ~ n 까지 합)
int index = 0;
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
if(tri[i][j] == 0) break;
answer[index++] = tri[i][j];
}
}
return answer;
최종 코드
class Solution {
public int[] solution(int n) {
int[] answer = new int[n*(n+1) / 2]; // 삼각형의 크기 ( 1 ~ n 까지 합)
int[][] tri = new int[n][n];
int x = -1; // x 좌표
int y = 0; // y 좌표
int num = 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 if(i % 3 == 2) { // 대각선 위
x--;
y--;
}
tri[x][y] = num++;
}
}
int index = 0;
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
if(tri[i][j] == 0) break;
answer[index++] = tri[i][j];
}
}
return answer;
}
}
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 주식가격 - Java (0) | 2021.12.12 |
---|---|
[프로그래머스] 영어 끝말잇기 - Java (0) | 2021.12.11 |
[프로그래머스] 큰 수 만들기 -Java (0) | 2021.12.09 |
[프로그래머스] 카펫 - Java (0) | 2021.12.08 |
[프로그래머스] H-Index - Java (0) | 2021.12.07 |