프로그래머스 LV2. 삼각 달팽이
✅ 프로그래머스 LV2. 삼각 달팽이
아주 오래걸린 문제였다.
여러가지 방법이 있었는데, 처음에는 배열을 [ [], [], [], [] ] 이런 식으로 세팅해 두어서 insert와 append로 알고리즘을 작성하니까 너무나도 어려웠다.
근데 그냥 n = 3이라고 가정하면, [ [0,0,0], [0,0,0], [0,0,0] ] 이렇게 세팅하고 푸니까 우선 훨씬 쉬워질 수 있었다.
왜냐하면 index를 [row][col]로 접근할 수 있어서!!
문법적으로는 2가지를 보면 된다.
1. 2차원 배열을 크기를 주어서 만드는 방법과
2. flatMap을 사용한 부분
🟠 알고리즘을 떠올리는 과정
이걸 곰곰이 생각해보니까,
[ 1 ]
[ 2, 9 ]
[ 3 ,10 ,8 ]
[ 4, 5, 6, 7 ]
이렇게 생겼는데, 패턴을 찾을 수 있었다.
🟠 내가 발견한 패턴
위에서 아래로 이동한다. -> row만 변경한다.
왼쪽에서 오른쪽으로 이동한다. -> col만 변경한다.
(왼 + 위)로 이동한다. -> row, col 둘다 변경한다.
이렇게 놓고 보니 풀 자신감이 생김. enum으로 pattern에 대한 정의를 만들어서 사용하려고 했으나, 그렇지 않아도 풀릴거 같길래 그냥 품.
✅ 코드와 알고리즘 설명
코드를 하나하나 따라가면서 그림을 그려보자. 그럼 쉽게 파악할 수 있다.
func solution(_ n:Int) -> [Int] {
var matrix: [[Int]] = [[Int]](repeating: Array(repeating: 0,count: n), count: n)
let sum = n * (n+1) / 2 // 등차수열의 합
var row = -1
var col = 0
var i = n
var j = 0
var currentNumber = 0
while i > 0 {
j = 0
while (j < i) {
row += 1
currentNumber += 1
matrix[row][col] = currentNumber
j += 1
}
j = 0
while (j < i-1) {
col += 1
currentNumber += 1
matrix[row][col] = currentNumber
j += 1
}
j = 0
while (j < i-2) {
col -= 1
row -= 1
currentNumber += 1
matrix[row][col] = currentNumber
j += 1
}
i -= 3
}
return matrix.flatMap { $0.filter{ $0 != 0 } }
}
'알고리즘 문제 풀이' 카테고리의 다른 글
[Swift] 프로그래머스 LV2. 튜플 (0) | 2022.04.01 |
---|---|
[Swift] 프로그래머스 LV. 2 N개의 최소공배수 (0) | 2022.04.01 |
[Swift] 프로그래머스 LV2. 피로도 (0) | 2022.04.01 |
[Swift] 프로그래머스 LV2. 소수 찾기 (0) | 2022.04.01 |
[Swift] BOJ 11726 2 x n 타일링 (0) | 2022.04.01 |