728x90
https://programmers.co.kr/learn/courses/30/lessons/42840
완전탐색
학생 3명의 반복되는 답이 문제에 주어지고, 정답을 담을 배열이 인자로 주어지면
학생들 중 가장 높은 점수를 획득한 학생들을 결과로 반환하는 문제
접근방법
학생들의 답을 담은 배열과 정답 배열을 순회하면서 일일이 비교하여
학생들 각각의 점수를 구한 뒤 최고점과 점수가 같은 학생들을 결과 배열에 담아, 오름차순으로 정렬하여 반환하는 식으로 풀이했다.
처음에는 학생들의 점수를 배열에 담아서 풀이했지만,
다른 사람의 풀이를 참고하니 딕셔너리를 사용하는 것이 훨씬 코드와 로직이 깔끔했다.
딕셔너리를 사용하고 고차함수(filter, map)을 써서 결과를 반환하는 것으로 코드를 개선했다.
+그리고 for-in 문에서 index를 사용하고 싶을 때 배열.enumerated()를 써서 사용했다.
소스코드 (개선 전)
import Foundation
func getScore(_ answers:[Int], _ rAnswers: [Int]) -> Int {
let size: Int = answers.count
var i: Int = 0
var score: Int = 0
for ra in rAnswers {
if ra == answers[i] {
score += 1
}
i = (i+1) % size
}
return score
}
func solution(_ answers:[Int]) -> [Int] {
var result: [Int] = []
var max: Int
var scores: [Int] = []
let students: [[Int]] = [
[1,2,3,4,5],
[2,1,2,3,2,4,2,5],
[3,3,1,1,2,2,4,4,5,5]
]
for student in students {
scores.append(getScore(student, answers))
}
max = scores.max()!
scores.enumerated().forEach {
if max == $0.element {
result.append($0.offset + 1)
}
}
return result
}
소스코드 (개선 후)
import Foundation
func solution(_ answers:[Int]) -> [Int] {
var scores: [Int:Int] = [1:0, 2:0, 3:0]
let students: [[Int]] = [
[1,2,3,4,5],
[2,1,2,3,2,4,2,5],
[3,3,1,1,2,2,4,4,5,5]
]
for (i,v) in answers.enumerated() {
if students[0][i % 5] == v { scores[1] = scores[1]!+1 }
if students[1][i % 8] == v { scores[2] = scores[2]!+1 }
if students[2][i % 10] == v { scores[3] = scores[3]!+1 }
}
return scores.filter{ $0.value == scores.values.max() }.map{ $0.key }.sorted()
}
728x90
'알고리즘 문제풀이' 카테고리의 다른 글
[프로그래머스] #133 K번째수 (Swift) (0) | 2022.02.10 |
---|---|
[프로그래머스] #132 체육복 (Swift) (0) | 2022.02.10 |
[프로그래머스] #130 메뉴 리뉴얼 (0) | 2021.12.08 |
[백준 14500] #129 : 테트로미노 (C++) (0) | 2021.10.11 |
[C++] C++에서 문자열 split하기 (istringstream, getline) (0) | 2021.10.06 |