728x90
https://school.programmers.co.kr/learn/courses/30/lessons/12985
이 문제를 처음 볼 때는 문제 지문이 너무 길어서 약간 기가 죽었었다...
하지만 문제가 원하는 건 간단하더라
'참가자 2명이 언제 만나냐?'
부전승이 나오지 않고 참가자 2명은 항상 이긴다고 했기 때문에 생각할 예외사항들은 거의 없었다.
'대진표 반복은 주어지는 게임 참가자 수 N의 제곱근을 구해 반복하고, 참가자가 이겼을 때 받게 되는 번호를 체크하다가 만났을 때 반복문을 끝내면 되겠다...!'
...라는 간단한 생각으로 짰는데 제출을 했을 때 틀리는 테스트케이스가 존재하더라
생각을 해보고 좀 찾아보니까 내가 짠 코드에서는 1,2번 3,4번끼리 만났을 때만 반복문이 마무리되는 게 아니라 2,3번이 만났을 때도 마무리가 되더라
이 부분은 조건을 추가하여 크기의 차이가 1인 것뿐만아니라 대진표에 맞는 쌍인지까지 확인하였다.
해당 방법으로 작성한 코드는 다음과 같다.
import kotlin.math.*
class Solution {
fun solution(n: Int, a: Int, b: Int): Int {
var answer = 0
var A = a
var B = b
for (i in 1..sqrt(n.toDouble()).toInt()) {
if (checkBreak(A, B) || checkBreak(B, A)) break
A = checkNextNumber(A)
B = checkNextNumber(B)
answer++
}
return answer + 1
}
private fun checkNextNumber(idx: Int): Int {
return if (idx % 2 == 0) idx / 2 else (idx + 1) / 2
}
private fun checkBreak(idx1: Int, idx2: Int): Boolean {
if (idx1 + 1 == idx2 && idx1 / 2 + 1 == idx2 / 2) {
return true
}
return false
}
}
(제곱근 함수인 sqrt()를 쓸 때마다 import kotlin.math.* 해야하는게 참 귀찮다...)
(마지막에 answer에다 1을 더하는 건 둘이 만났을 때까지도 1을 더해줘야하기 때문이다.)
반응형
'Kotlin > Algorithm Problems' 카테고리의 다른 글
| <프로그래머스> 괄호 회전하기(Lv.2) (0) | 2023.11.15 |
|---|---|
| <프로그래머스> 귤 고르기(Lv.2) (0) | 2023.11.15 |
| <프로그래머스> 멀리 뛰기(Lv.2) (1) | 2023.11.14 |
| <프로그래머스> N개의 최소공배수(Lv.2) (0) | 2023.11.14 |
| <프로그래머스> 카펫(Lv.2) (0) | 2023.11.13 |