https://school.programmers.co.kr/learn/courses/30/lessons/42840
접근 방법
배열의 크기는 최대 10 ** 4 이므로, O(N^2)까지 괜찮겠다.
1. 각각의 패턴 대로 길이 10 ** 4의 배열을 미리 생성해놓고 비교하면 O(N)으로 가능.
단, 메모리 공간이 3 * 0(N)만큼 추가적으로 소모
2. 각 패턴의 점화식을 만들어서 비교. O(N)
메모리 공간의 낭비도 거의 없다.
그러나 실제 코테에서는, 완탐으로도 O(N)의 풀이가 가능한데, 굳이 점화식을 만들 필요는 없겠다.
나의 풀이
import Foundation
func solution(_ answers:[Int]) -> [Int] {
let size = answers.count
let multipleValue = Int(pow(10.0, 3))
var resultArr = [0, 0, 0]
let studentOne = Array(repeating: [1, 2, 3, 4, 5, 1, 2, 3, 4, 5], count: multipleValue).flatMap { $0 }
let studentTwo = Array(repeating: [2, 1, 2, 3, 2, 4, 2, 5, 2, 1, 2, 3, 2, 4, 2, 5], count: multipleValue).flatMap { $0 }
let studentThree = Array(repeating: [3, 3, 1, 1, 2, 2, 4, 4, 5, 5, 3, 3, 1, 1, 2, 2, 4, 4, 5, 5], count: multipleValue).flatMap { $0 }
for i in 0..<size {
let currentAnswer = answers[i]
if currentAnswer == studentOne[i] { resultArr[0] += 1 }
if currentAnswer == studentTwo[i] { resultArr[1] += 1 }
if currentAnswer == studentThree[i] { resultArr[2] += 1 }
}
let highestScore = resultArr.max()!
return resultArr.indices.filter { resultArr[$0] == highestScore }.map { $0 + 1 }
}
배열을 repeating 할 때는, flatMap을 사용해서 2차원 배열을 1차원으로 변경해 주어야 한다.
filter 된 값의 index를 return 하고 싶다면, indices를 활용하자.
단, filter의 결과가 index로 반환된다는 것을 유의하자.
다른 사람 풀이
import Foundation
func solution(_ answers:[Int]) -> [Int] {
let answer = (
a: [1, 2, 3, 4, 5], // index % 5
b: [2, 1, 2, 3, 2, 4, 2, 5], // index % 8
c: [3, 3, 1, 1, 2, 2, 4, 4, 5, 5] // index % 10
)
var point = [1:0, 2:0, 3:0]
for (i, v) in answers.enumerated() {
if v == answer.a[i % 5] { point[1] = point[1]! + 1 }
if v == answer.b[i % 8] { point[2] = point[2]! + 1 }
if v == answer.c[i % 10] { point[3] = point[3]! + 1 }
}
return point.sorted{ $0.key < $1.key }.filter{ $0.value == point.values.max() }.map{ $0.key }
}
// <https://school.programmers.co.kr/learn/courses/30/lessons/42840/solution_groups?language=swift>
최초 패턴만 메모리에 저장하고, 나눗셈을 활용하는 접근 방식이 좋다.
점수를 저장하기 위한 자료구조로 딕셔너리를 사용한 것도 좋다.
'Dev > PS' 카테고리의 다른 글
[Swift 알고리즘] 타겟 넘버 - 프로그래머스 (1) | 2024.02.01 |
---|---|
[Swift 알고리즘] 수열 2259 - 백준 (1) | 2024.01.31 |
[Swift 알고리즘] 최소 직사각형 - 프로그래머스 (0) | 2024.01.31 |
[Python 알고리즘] 우물 안 개구리 - 소프티어 (1) | 2024.01.28 |
[Swift 알고리즘] PassingCars - Codility (1) | 2024.01.26 |