일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- with recursive
- spring cloud
- 파이썬
- JVM
- Coroutine
- 백준 16236
- 백준 16719
- spring security
- 백준 16235
- 백준 19238
- re.split
- sql 기술면접
- MySQL
- 백준 17779
- java 기술면접
- 백준 파이썬
- 웹어플리케이션 서버
- Spring
- JPA
- Kotlin
- MSA
- spring oauth
- 백준 17626
- 백준 15685
- 프로그래머스
- java
- 백준
- springboot
- 프로래머스
- Spring Boot
- Today
- Total
시작이 반
[프로그래머스] 삼각 달팽이(Java 자바) 본문
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] |
import java.util.*;
class Solution {
public int[] solution(int n) {
int[] answer = {};
int answerLen = 0;
for(int i = 1; i <= n; i++){
answerLen += i;
}
answer = new int[answerLen];
int i = 1; //채울 수
int cycle = 0; //사이클 몇번돌았는지
int idx = 0;
int jumpCount = n;
while(true){
if(i > answerLen) break;
//왼쪽 대각선
int leftIdxCal = 0;
for(int j = 0; j < n; j++){
idx = idx + leftIdxCal + cycle;
answer[idx] = i;
leftIdxCal++;
i++;
}
n--;
//마지막
for(int j = 0; j < n; j++){
idx += 1;
answer[idx] = i;
i++;
}
n--;
//오른쪽 대각선
int rightIdxCal = jumpCount;
for(int j = n; j > 0; j--){
idx = idx - rightIdxCal;
answer[idx] = i;
rightIdxCal--;
i++;
}
n--;
jumpCount--;
cycle+= 2;
}
return answer;
}
}
핵심 코드, 하는법:
인덱스를 계산해주면된다.
왼쪽 대각선, 아래쪽, 오른쪽 대각선 3부분으로 나눠서 계산한다.
한 변당 n회 계산
한 변을 계산할때마다 n-1을 해준다.
ex )
왼쪽 대각선 계산 : 현재 인덱스 + ( 0, 1, 2....) + 사이클 횟수*2
아래부분 계산 : 현재 인덱스 +1
x = n
오른쪽 대각선 계산 : 현재 인덱스 - (x, x-1, x-2....)
x--
왼쪽 대각선 인덱스 계산
현재 인덱스, 0부터 1씩증가하는수 (0, 1, 2 ...), 사이클 횟수 = 0
n = 4
index = 0 + 0 + 0 = 0
index = 0 + 1 + 0 = 1
index = 1 + 2 + 0 = 3
index = 3 + 3 + 0 = 6
아래부분 인덱스 계산
n = 3
index = 6 + 1 = 7
index = 7 + 1 = 8
index = 8 + 1 = 9
오른쪽 대각선 인덱스 계산
n = 2
index = 9 - 4 = 5
index = 5 - 3 = 2
한 싸이클 끝
---------------
왼쪽 대각선 인덱스 계산
현재 인덱스, 0부터 1씩증가하는수 (0, 1, 2 ...), 사이클 횟수 = 1
n = 1
index = 2 + 0 + 1*2 = 4
말로 설명하려니 어렵다.....................
'알고리즘 > Programmers' 카테고리의 다른 글
[프로그래머스] 주식가격(Java 자바) (0) | 2021.10.15 |
---|---|
[프로그래머스] 영어 끝말잇기(Java 자바) (0) | 2021.10.13 |
[프로그래머스] 2개 이하로 다른 비트(Java 자바) (0) | 2021.10.09 |
[프로그래머스] 프렌즈4블록(Java 자바) (1) | 2021.10.08 |
[프로그래머스] 큰 수 만들기(Java 자바) (1) | 2021.09.15 |