728x90
반응형
( 월간 코드 챌린지 시즌1 / 삼각 달팽이 )
[문제]
문제 설명
정수 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] |
[풀이]
n과 등차수열의 합 공식을 통해서 삼각형 배열의 최댓값을 구합니다. (현재 상황에서의 등차수열의 합 공식 : n * (n + 1) / 2)
상 하 좌 우 에 대하여 인덱스로 사용할 변수 top, bottom, left, right를 설정합니다.
왼쪽변 -> 오른쪽 변 -> 왼쪽 변과 같은 순서로 삼각형 배열을 채워나가면 됩니다.
[코드]
class Solution {
fun solution(n: Int): IntArray {
var top = 0
var left = 0
var bottom = n - 1
var right = n - 1
var num = 1
var idx = 0
// 등차수열의 합 공식으로 최댓값을 미리 구합니다.
val max = (n + 1) * n / 2
val answer = IntArray(max)
// 삼각형 모양의 2차원 배열 선언
val arr = Array(n){ IntArray(it + 1) }
while(num <= max){
// 왼쪽 변의 숫자 계산
for(i in top..bottom) arr[i][left] = num++
if(num > max) break
// 왼쪽 변에대한 계산이 끝났음으로 다음 왼쪽 벽과 다음 위쪽 벽을 설정
left++
top++
// 밑쪽 변의 숫자 게산
for(i in left..right) arr[bottom][i] = num++
if(num > max) break
// 밑쪽 변에대한 계산이 끝났음으로 다음 밑쪽 벽과 다음 오른쪽 벽을 설정
bottom--
right--
// 오른쪽변은 전체의 길이가 밑에서부터 위로 갈수록 점점 좁아짐으로 idx를 감소시키면서 오른쪽 변의 숫자 계산
idx = right
for(i in bottom downTo top) arr[i][idx--] = num++
if(num > max) break
// 오른쪽 변에대한 계산이 끝났음으로 다음 오른쪽 벽과 다음 위쪽 벽을 설정
right--
top++
}
idx = 0
// 위에서부터 결과를 answer에 저장
arr.forEach{ i -> i.forEach{ answer[idx++] = it } }
return answer
}
}
코딩테스트 연습 - 삼각 달팽이
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
제가 잘못 알고 있거나 잘못된 부분이 있을 경우 알려주시고 추가로 궁금한 점 있으신 분들도 댓글이나 메일 주시면 성실히 답변해 드리겠습니다.🧑🏻💻
감사합니다~😄
728x90
'Algorithm > level2' 카테고리의 다른 글
[ 프로그래머스 - Java & Kotlin ] [ 1차 ] 프렌즈4블록 ( 자바 & 코틀린 ) (0) | 2021.09.22 |
---|---|
[ 프로그래머스 - Kotlin ] 2개 이하로 다른 비트 ( 코틀린 ) (0) | 2021.09.22 |
[ 프로그래머스 - Java & Kotlin ] 영어 끝말잇기 ( 자바 & 코틀린 ) (0) | 2021.09.20 |
[ 프로그래머스 - Java & Kotlin ] 주식가격 ( 스택 / 큐 ) (0) | 2021.09.20 |
[ 프로그래머스 - Java & Kotlin ] 구명보트 ( 자바 & 코틀린 ) (0) | 2021.09.20 |