프로그래머스 코딩테스트_도서실습
[코딩테스트_도서실습] 문자열 - 삼각달팽이 - Lv2
러쉬봠
2023. 7. 8. 18:38
문제 설명
정수 n이 매개변수로 주어집니다. 다음 그림과 같이 밑변의 길이와 높이가 n인 삼각형에서 맨 위 꼭짓점부터 반시계 방향으로 달팽이 채우기를 진행한 후, 첫 행부터 마지막 행까지 모두 순서대로 합친 새로운 배열을 return 하도록 solution 함수를 완성해주세요.
제한사항
- n은 1 이상 1,000 이하입니다.
입출력 예 설명
nresult
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] |
나의 풀이
class Solution {
public int[] solution(int n) {
int[] answer = new int[n*(n+1)/2];
int[][] matrix = new int[n][n];
int x = -1;
int y = 0;
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--;
}
matrix[x][y] = num ++;
}
}
int k = 0;
for(int i = 0; i < n; i ++){
for(int j = 0; j < n; j ++){
if(matrix[i][j] == 0){
break;
}
answer[k++] = matrix[i][j];
}
}
return answer;
}
}
다른사람 풀이 - 1
// 프로그래머스 삼각 달팽이 문제
class Solution {
public int[] solution(int n) {
int max = n * (n + 1) / 2;
int[][] matrix = new int[n][n];
int[] answer = new int[max];
// 시작 지점 초기화
int x = 0, y = 0;
int value = 1;
matrix[0][0] = 1;
while (value < max) {
// 왼쪽 - 위에서 아래로
while (x + 1 < n && matrix[x + 1][y] == 0) {
matrix[++x][y] = ++value;
}
// 아래 - 왼쪽에서 오른쪽으로
while (y + 1 < n && matrix[x][y + 1] == 0) {
matrix[x][++y] = ++value;
}
// 오른쪽 아래에서 대각선 위로
while (y - 1 > 0 && x - 1 > 0 && matrix[x - 1][y - 1] == 0) {
matrix[--x][--y] = ++value;
}
}
int idx = 0;
for(int i = 0; i < matrix.length; i++) {
for (int j = 0; j <= i; j++) {
answer[idx] = matrix[i][j];
idx++;
}
}
return answer;
}
}
다른사람 풀이 - 2
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;
}
}