수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 1번 문제부터 마지막 문제까지 다음과 같이 찍습니다.
1번 수포자가 찍는 방식: 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, ...
2번 수포자가 찍는 방식: 2, 1, 2, 3, 2, 4, 2, 5, 2, 1, 2, 3, 2, 4, 2, 5, ...
3번 수포자가 찍는 방식: 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, ...
1번 문제부터 마지막 문제까지의 정답이 순서대로 들은 배열 answers가 주어졌을 때, 가장 많은 문제를 맞힌 사람이 누구인지 배열에 담아 return 하도록 solution 함수를 작성해주세요.
fun solution(answers: IntArray): IntArray {
var answer = mutableListOf<Int>()
var student1 = 0
var student2 = 0
var student3 = 0
for ((i, v) in answers.withIndex()) {
if ((i + 1) % 5 == v) student1++
if (i % 2 == 0 && v == 2) student2++
when (i % 8) {
1 -> if (v == 1) student2++
3 -> if (v == 3) student2++
5 -> if (v == 4) student2++
7 -> if (v == 5) student2++
}
when (i % 10) {
in 0..1 -> if (v == 3) student3++
in 2..3 -> if (v == 1) student3++
in 4..5 -> if (v == 2) student3++
in 6..7 -> if (v == 4) student3++
in 8..9 -> if (v == 5) student3++
}
}
val maxScore = maxOf(student1,student2,student3)
if (student1 == maxScore) answer.add(1)
if (student2 == maxScore) answer.add(2)
if (student3 == maxScore) answer.add(3)
return answer.toIntArray()
}
withIndex를 이용해 반복문으로 각 학생들의 점수를 매겨주는 방식으로 만들고 masOf를써 최고점이면 answer에 추가하게 만들었다
너무 비효율적이고 추가되는 학생이 있으면 쓰기 불편하다
fun solution(answers: IntArray): IntArray {
var patterns = arrayOf(
intArrayOf(1, 2, 3, 4, 5),
intArrayOf(2, 1, 2, 3, 2, 4, 2, 5),
intArrayOf(3, 3, 1, 1, 2, 2, 4, 4, 5, 5)
)
val score = intArrayOf(0,0,0)
for (i in 0 until answers.size){
if (answers[i] == patterns[0][i % patterns[0].size]) score[0]++
if (answers[i] == patterns[1][i % patterns[1].size]) score[1]++
if (answers[i] == patterns[2][i % patterns[2].size]) score[2]++
}
val maxScore = score.max()
return score.indices.filter { score[it] == maxScore }.map { it + 1 }.toIntArray()
}
패턴을 배열로 만들어 준후 패턴[문제 번호 % 패턴크기]의 값이 정답이면 스코어 배열에서 점수가 오르고
제일 높은 점수를 사람이 여럿일수 있으니 indices를 써서 모든 원소를 살피고
filter로 maxScore와 같은 원소를 찾고 그 인덱스값에 1을 더해줬다
근데 반복문안에 비슷한 if문만 3개인데 이걸 또 간략하게 할 수 없을까? 생각했다
반복문이니까 forEachIndexed를 써보자
answers.forEachIndexed { i, v -> if (v == i % patterns
여기서 어떻게 해야할까?
위에 코드에선 answers의 위치값범위 지정하고 반복시키면 됬는데 if문을 줄이니까 patterns[n]의 위치값도 필요하게 된것
answers.forEachIndexed { i, answer ->
patterns.forEachIndexed { j, pattern ->
패턴도 forEachIndexed를 해주자
fun solution(answers: IntArray): IntArray {
var patterns = arrayOf(
intArrayOf(1, 2, 3, 4, 5),
intArrayOf(2, 1, 2, 3, 2, 4, 2, 5),
intArrayOf(3, 3, 1, 1, 2, 2, 4, 4, 5, 5)
)
val score = intArrayOf(0, 0, 0)
answers.forEachIndexed { i, answer ->
patterns.forEachIndexed { j, pattern ->
if (answer == pattern[i % pattern.size]) score[j]++
}
}
val maxScore = score.maxOrNull()
return score.indices.filter { score[it] == maxScore }.map { it + 1 }.toIntArray()
}