728x90
반응형
삼각 달팽이
정수 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
- 문제 예시와 같습니다.
📍 기존 풀이
import java.util.*;
class Solution {
public int[] solution(int n) {
int [] dy={1,0,-1};
int [] dx={0,1,-1};
int num = 1;
int[][] arr = new int [n][n];
int x=0, y=0;
while(true){
// 1. 아래로 이동
while(true){
arr[y][x]= num++;
int ny = y+dy[0];
int nx = x+dx[0];
if (ny==n || arr[ny][x] !=0) break;
x=nx;
y=ny;
}
if (x+1==n || arr[y][x+1] !=0) break;
//오른쪽으로 한칸 이동
x+=1;
// 2. 오른쪽으로 이동
while(true){
arr[y][x]= num++;
int ny = y+dy[1];
int nx = x+dx[1];
if (nx==n || arr[y][nx] !=0) break;
x=nx;
y=ny;
}
if (y-1==-1 || x-1== -1 || arr[y-1][x-1] !=0) break;
y-=1;
x-=1;
// 3. 대각선 위로 이동
while(true){
arr[y][x]= num++;
int ny = y+dy[2];
int nx = x+dx[2];
if (arr[ny][nx] != 0 || ny==-1 || nx == -1) break;
x=nx;
y=ny;
}
if (arr[y+1][x] != 0 || y+1==n ) break;
y+=1;
}
int[] answer = new int [num-1];
int count=0;
for (int i=0; i< n; i++){
for (int j=0; j<n; j++){
if (arr[i][j]!=0){
answer [count++] = arr[i][j];
}
}
}
return answer;
}
}
👍더 나은 풀이👍
<aside> 📌 세 방향을 따로하는 것이 아니라 , 방향 벡터를 이용해서 한번에 처리하도록 함 0(아래) → 1(오른쪽 ) → 2(왼쪽 위)
// 2를 넘어가게 되면 다시 0으로 돌아올 수 있도록 나머지 연산자 사용 d=(d+1)%3
import java.util.*;
class Solution {
private static final int []dx={0,1,-1};
private static final int []dy={1,0,-1};
public int[] solution(int n) {
int d=0; // 방향처리 변수
int num = 1;
int[][] arr = new int [n][n];
int x=0, y=0;
while(true){
arr[y][x]=num++;
int nx = x+dx[d];
int ny = y+dy[d];
if (nx == n || ny == n|| nx == -1||ny == -1 || arr[ny][nx]!=0) {
d =(d+1) % 3;
nx = x+dx[d];
ny = y+dy[d];
if (nx == n || ny == n|| nx == -1|| ny == -1|| arr[ny][nx]!=0) break;
}
x=nx;
y=ny;
}
int [] answer = new int [num - 1];
int index =0;
for (int i=0; i<n; i++){
for (int j=0; j<=i; j++){
answer[index++] = arr[i][j];
}
}
return answer;
}
}
</aside>
728x90
'Algorithm' 카테고리의 다른 글
[프로그래머스] 1️⃣ 시저 암호 (JAVA) (0) | 2024.06.28 |
---|---|
[프로그래머스] 1️⃣ 자연수 뒤집어 배열로 만들기 (JAVA) (0) | 2024.06.27 |
[프로그래머스 ] 2️⃣ 전화번호 목록 (JAVA) (0) | 2023.06.26 |
[프로그래머스] 2️⃣ 카펫(JAVA) (0) | 2023.03.20 |
[프로그래머스] 2️⃣ 뒤에 있는 큰 수 찾기(JAVA) (0) | 2023.03.04 |