티스토리 뷰
문제설명은 더보기를 눌러주세요
더보기
문제링크 : programmers.co.kr/learn/courses/30/lessons/68645
문제 설명
정수 n이 매개변수로 주어집니다. 다음 그림과 같이 밑변의 길이와 높이가 n인 삼각형에서 맨 위 꼭짓점부터 반시계 방향으로 달팽이 채우기를 진행한 후, 첫 행부터 마지막 행까지 모두 순서대로 합친 새로운 배열을 return 하도록 solution 함수를 완성해주세요.
제한사항
- n은 1 이상 1,000 이하입니다.
입출력 예
n / result4 | [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차원 어레이를 생성한다
2. 한 번 방향을 회전할 때, 이동하는 거리가 1씩 줄어든다.
(n, n-1, n-2, ... 1)
3. 위 -> 아래 / 왼쪽 -> 오른쪽 / 오른쪽 - > (대각선)위
3가지 경우로 생각해서 푼다.
4. 위 -> 아래는 2차원 배열에서도 위->아래로
왼쪽 -> 오른쪽은 2차원 배열에서도 왼쪽->오른쪽
오른쪽 -> (대각선)위는 2차원 배열에서 대각선 이동
-코드-
class Solution {
fun solution(n: Int): IntArray {
val max = (n*(n+1))/2
var answer = IntArray(max)
var arr = Array(n) {IntArray(n)}
var type = 0
var cx = 0
var cy = 0
var idx = 1
for(i in n downTo 1){
if(type == 0) { // 위 -> 아래
for(j in 1..i){
arr[cx++][cy] = idx++
}
cx-- // 다음 위치 맞춰주기
cy++
} else if(type == 1) { // 왼 -> 오
for(j in 1..i){
arr[cx][cy++] = idx++
}
cy-=2
cx--
} else { // 오-> 위
for(j in 1..i){
arr[cx--][cy--] = idx++
}
cx+=2
cy++
}
type++
if(type == 3) type = 0
}
idx = 0
for(i in 0..n-1){
for(j in 0..n-1){
if(arr[i][j] != 0) {
answer[idx++] = arr[i][j]
}
}
}
return answer
}
}
'PS > 프로그래머스' 카테고리의 다른 글
[C++, Swift][프로그래머스] 입국심사 (0) | 2021.02.19 |
---|---|
[C++, Swift][프로그래머스] 순위 (1) | 2021.02.19 |
[C++][프로그래머스] 블록 이동하기 (0) | 2020.09.11 |
[C++][프로그래머스] 파일명 정렬 (0) | 2020.08.28 |
[C++][프로그래머스] 오픈채팅방 (0) | 2020.08.28 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday