Kotlin/Algorithm Problems

<프로그래머스> 예상 대진표(Lv.2)

re트 2023. 11. 13. 16:29
728x90

https://github.com/heesoo-park/ForCodeKata/tree/main/%EC%98%88%EC%83%81%20%EB%8C%80%EC%A7%84%ED%91%9C

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을 더해줘야하기 때문이다.)

반응형