728x90
반응형
https://programmers.co.kr/learn/courses/30/lessons/68645?language=swift
코딩테스트 연습 - 삼각 달팽이
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
주어진 그림을 보면 규칙은 다음과 같다.
이렇게 구성한 뒤에 각 행을 이어 붙이면 정답이 된다!
[[1],[2,9],[3,10,8],[4,5,6,7]]
이에 우선은 방향이 세 가지 있다는 것을 알 수 있다.
1. 상단에서 좌측 하단으로
2. 좌측에서 우측으로
3. 우측하단에서 상단으로
이렇게 방향을 반복하게 된다.
방향은 아래와 같이 세팅해두고 인덱스로 접근하여 사용하면 된다.
// dx[0]dy[0] = 좌측 상단에서에서 좌측 하단으로
// dx[1]dy[1] = 좌측에서에서 우측으로
// dx[2]dy[2] = 우측 하단에서 좌측 상단으로
let dx = [1,0,-1]
let dy = [0,1,-1]
자 이제 방향에 맞게 숫자를 채워나가는 흐름을 그려보자.
1. 방향설정, 현재 행/열/숫자 초기화
2. 빈 배열 생성
3. 각 삼각형의 끝부분은 별도로 처리해준다. (아래 설명 참고)
4. 각 배열을 flat하게 펼쳐준다.
보면 노란색(3) + 빨강(1)이 첫번째 방향을 채우고, 그 다음 초록색(2) + 빨강(1)이 두 번째 방향을 채우고, 다음으로 보라색(1) + 빨강(1)이 세 번째 방향을 채우고 마지막으로는 빨강(1)로 차는 것을 볼 수 있다.
빨간색의 경우 전체 for문을 돌면서 처리해줄 예정이고, 이외의 색깔들은 n에 따라서 1씩 줄면서 숫자를 채워주게 된다.
import Foundation
func solution(_ n:Int) -> [Int] {
// 방향
// dx[0]dy[0] = 좌측 상단에서에서 좌측 하단으로
// dx[1]dy[1] = 좌측에서에서 우측으로
// dx[2]dy[2] = 우측 하단에서 좌측 상단으로
let dx = [1,0,-1]
let dy = [0,1,-1]
// 초기값 세팅
var row = 0, col = 0, dir = 0, num = 1
// 비어있는 피라미드 만들기
var arr = (1...n).map { Array(repeating: 0, count: $0) }
// n = 4일 경우 3개 1개 > 2개 1개 > 1개 1개 > 1개 채움
for i in stride(from: n, to: 0, by: -1) {
// 빨간색이 아닌 블록 채우는 역할
for _ in 0..<i-1 {
arr[row][col] = num
row += dx[dir]
col += dy[dir]
num += 1
}
// 빨간색 부분 채워주는 역할
arr[row][col] = num
num += 1
// 다음 방향으로 전환 + 이동
dir = (dir + 1) % 3
row += dx[dir]
col += dy[dir]
}
return arr.flatMap {$0}
}
소용돌이 모양처럼 바깥에서 안쪽으로 돌면서 채워지는 배열을 구해보았다.
일련의 규칙을 찾는게 까다로웠던 문제!
비슷한 문제들로 Spiral Matrix 같은 유형이 있을 것 같다.
728x90
반응형