https://programmers.co.kr/learn/courses/30/lessons/68645?language=java
코딩테스트 연습 - 삼각 달팽이
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]
programmers.co.kr
문제의 설명 자체가 굉장히 심플했다. 입력 받은 n에 대해 반시계 방향으로 값을 채운 후, 그 결과를 1차원 배열로 출력하면 되는 문제였다. 나는 방향을 기준으로 ↓, →, ↖ 이렇게 3개로 나누어서 각각 방향에 맞게 구현했다.
1. 달팽이 채우기에 필요한 최대 값(end)을 구하고, 필요한 변수들을 선언한다.
1-1. temp : 임시로 사용하는 2차원 배열(전체 배열의 반만큼 공간을 사용)
1-2. value : 최대 end값까지 늘어나면서 배열의 값을 +1 해준다.
1-3. gijun : 각각 배열 값이 늘어나는 방향 ↓, →, ↖ 와 대응시키는 1, 0, -1을 이용해 방향을 설정한다.
1-4. cnt : 현재 방향으로 늘어나고 있는 개수로, 최대 max개까지 늘어나게 된다.
1-5. max : cnt의 종료조건에 해당하는 변수로, 방향이 바뀔떄마다 -1 해준다.
2. 현재 배열 값(value)이 최대 값(end)에 도달하기 전까지 아래의 루프를 반복한다.
2-1. gijun이 1일 경우(↓) : 종료조건 값(max)에 도달하기 전까지 아래로 값(value)을 증가시키고, 다음 진행방향(gijun)을 →로 변경
2-2. gijun이 0일 경우(→) : 종료조건 값(max)에 도달하기 전까지 오른쪽으로 값(value)을 증가시키고, 다음 진행방향(gijun)을 ↖로 변경
2-3. gijun이 0일 경우(↖) : 종료조건 값(max)에 도달하기 전까지 왼쪽 위로 값(value)을 증가시키고, 다음 진행방향(gijun)을 ↓로 변경
문제 및 입출력
코드
class Solution
{
public static int[] solution(int n)
{
int[][] temp = new int[n][n];
int end = ((n*(n+1))/2)+1; // 마지막 배열의 수
int value = 1; // 현재 배열의 수
int gijun = 1; // 배열 값이 늘어나는 방향(1, 0, -1)
int cnt = 0; // 현재 방향의 개수(최대 max개)
int max = n; // 최대 경계범위(방향이 바뀔떄마다 -1)
// 배열의 현재 좌표(방향이 바뀔떄마다 값 갱신)
int x = 0;
int y = 0;
while(value!=end)
{
if(gijun==1) // ↓ 방향
{
while(cnt!=max)
{
temp[x+cnt][y] = value;
cnt++;
value++;
}
x = x+cnt-1;
gijun = 0; // → 방향으로 변경
max--;
cnt = 0;
y++;
}
else if(gijun==0) // → 방향
{
while(cnt!=max)
{
temp[x][y+cnt] = value;
cnt++;
value++;
}
y = y+cnt-1;
gijun = -1; // ↖ 방향으로 변경
max--;
cnt = 0;
x--;
y--;
}
else if(gijun==-1) // ↖ 방향
{
while(cnt!=max)
{
temp[x-cnt][y-cnt] = value;
cnt++;
value++;
}
x = x-cnt+1;
y = y-cnt+1;
gijun = 1; // ↓ 방향으로 변경
max--;
cnt = 0;
x++;
}
}
int[] answer = new int[value-1];
value = 0;
for(int i=0; i<temp.length; i++)
{
for(int j=0; j<temp[0].length; j++)
{
if(temp[i][j]!=0)
{
answer[value] = temp[i][j];
value++;
}
}
}
return answer;
}
}
'[ 다먹살 ] > - Coding' 카테고리의 다른 글
[프로그래머스] 레벨3 정수 삼각형 (0) | 2021.09.24 |
---|---|
[백준] 7568 덩치 (0) | 2021.09.23 |
[프로그래머스] 레벨1 없는 숫자 더하기 (0) | 2021.09.22 |
[백준] 15552 빠른 A+B (0) | 2021.09.22 |
[프로그래머스] 위클리챌린지 6주차 복서 정렬하기 (0) | 2021.09.21 |
댓글