일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- dfs
- 배열
- 스타트업
- IntelliJ
- 이직
- 자료구조
- 프로그래머스
- 구현
- 해시맵
- 스프링부트
- 문자열
- HashMap
- spring
- bfs
- 백엔드
- 명령어
- 인텔리제이
- spring boot
- 해결
- Linux
- docker
- 스프링 부트
- Java
- 개발자
- 주니어
- 구름LEVEL
- 스프링
- 도커
- 코딩테스트
- HTTP
- Today
- Total
마이의 개발 블로그
[프로그래머스] 삼각 달팽이 (Java) 본문
접근 방식
n * n 크기 이차원 배열의 (0, 0)에서 시작하여 아래, 오른쪽, 위쪽(왼쪽 대각선 위)의 세 가지 방향으로 번갈아가며 숫자를 순차적으로 입력하면 되는 문제이다. 두 가지 방식의 답안을 기록으로 남기고자 하는데, 2번은 내가 구현으로 풀어낸 예제이고 1번은 답안 제출 후 발견한 다른 사람의 접근방법을 한 번 본 후에 다시 적어본 코드이다. 프로그래머스에서 제시한 풀이방식도 따로 있기는 한데 2번 방식을 좌표변환 배열을 활용하여 while문 한 개로 간결하게 만든 버전이고 딱히 직관적이거나 시간을 투자할만한 가치가 있는지는 잘 모르겠어서 기록하지는 않았다. 1번과 2번 풀이 사이에는 기억해야할 차이점 한 가지가 있다. 각 방향마다 저장해야하는 숫자의 개수를 알 수 있다는 점을 활용하여 종료조건을 매번 체크할 필요 없이 필요한만큼만 방향전환 하며 동작하도록 만들었다는 점이다(아래로 n개, 우측으로 n-1개, 위로 n-2개... 마지막 1개). 이 점을 고려하여 1번 풀이의 로직을 풀어서 설명하려고 한다.
로직 설명
- n * n 크기의 이차원 배열 arr 선언
- x, y 좌표 선언: 첫 동작을 포함시켜야 하므로 (0, -1)에서 시작, 숫자 변수 num 선언
- 이중 for문 선언 (i = 0일 때 n번 동작, i = 1일 때 n-1번 동작..):
1) i % 3 으로 방향 결정 (0: 아래, 1: 오른쪽, 2: 위쪽)
2) arr[x][y]에 num 저장 후 num 증가
- 답변배열 생성 후(배열크기: 최종 num - 1) 0을 제외한 숫자 저장하기
Note
- 이것저것 생각하면서 스쳐지나갔던 로직이였는데 이렇게 쉽게 풀어내기 못한 게 너무 아쉽다.
정답코드 1 (내가 생각하는 모범 답안)
class Solution {
public int[] solution(int n) {
int[][] arr = new int[n][n];
int x = 0, y = -1, num = 1;
for(int i = 0; i < n; i++){
for(int j = i; j < n; j++){
switch(i % 3){
case 0:
y++;
break;
case 1:
x++;
break;
case 2:
x--;
y--;
break;
}
arr[x][y] = num++;
}
}
int[] answer = new int[num - 1];
int idx = 0;
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
if(arr[j][i] == 0){
break;
}
answer[idx++] = arr[j][i];
}
}
return answer;
}
}
정답코드 2 (최초 풀이)
class Solution {
public int[] solution(int n) {
int[] answer = {};
int[][] arr = new int[n][n];
int sum = 0;
for(int i = 1; i <= n; i++){
sum += i;
}
int col = 0, row = 0;
int num = 1;
while(true){
//아래로 이동
while(row != n && arr[col][row] == 0){
arr[col][row++] = num++;
}
row--;
col++;
if(row >= n || col >= n || arr[col][row] != 0){
break;
}
//오른쪽으로 이동
while(col != n && arr[col][row] == 0){
arr[col++][row] = num++;
}
col -= 2;
row--;
if(row >= n || col >= n || arr[col][row] != 0){
break;
}
//위로 이동
while(col != 0 && row != 0 && arr[col][row] == 0){
arr[col--][row--] = num++;
}
col++;
row += 2;
if(row >= n || col >= n || arr[col][row] != 0){
break;
}
}
//답변배열 생성 후 숫자 입력
answer = new int[sum];
int index = 0;
for(int i = 0; i < arr.length; i++){
for(int j = 0; j < arr[0].length; j++){
if(arr[j][i] == 0){
break;
}
answer[index++] = arr[j][i];
}
}
return answer;
}
}
'코딩테스트 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 네트워크 (Java) (0) | 2023.09.18 |
---|---|
[프로그래머스] 행렬의 곱셈 (0) | 2023.06.23 |
[프로그래머스] 교점에 별 만들기 (Java) (0) | 2023.05.28 |
[프로그래머스] 점 찍기 (Java) (0) | 2023.05.28 |
[프로그래머스] 공원 산책 (Java) (0) | 2023.04.20 |