본문 바로가기
알고리즘

[Swift 알고리즘] 프로그래머스 - 예상 대진표

by 코코종 2023. 5. 4.
728x90

안녕하세요 코코종입니다.

어제 다 못푼것 까지 해서 이어서 갑니닷..

import Foundation

func solution(_ n:Int, _ a:Int, _ b:Int) -> Int
{
    // 2^m = n
    // a가 각각 라운드에 몇번째 블록에 있는지 체크하기
    
    // n = 8일때
    // [1 2 3 4 5 6 7 8]
    // a = 4, b = 7 일때
    // a-1 / 2 -> 1
    // b-1 / 2 -> 3
    // 두개가다르므로
    // 다시  2*2로 나눈다
    // a-1 / 4 = 0
    // b-1 / 4 = 1
    // 두개 다르므로 다시 2^3으로 나눔
    // a-1 / 8 = 0
    // b-1 / 8 = 0 같음! -> 만남
    
    // 위와 원리는 비슷하나 세부 구현이 틀림!
    var answer = 0
    
    var a = a
    var b = b
    
    while true {
        if a == b {
            break
        } else {
            // a/2 가 안되는 이유 -> a가 1이면 0이 되어버림.. 잘 판단하고 해보기!
            // a = (a % 2 == 0) ? a/2 : (a+1)/2 // 홀수 짝수일때에 따라 다름
            a = (a+1) / 2
            // b = (b % 2 == 0) ? b/2 : (b+1)/2
            b = (b+1) / 2
        }
        
        answer += 1
    }

    return answer
}

문제는 간단했는데요 제 실수는 처음에 a /= 2 로 해서 0번째가 생기면서 조금 꼬였습니다.

a를 a+1 / 2로 계속 갱신해주면서 a와 b가 같은 그룹에 속하게(라운드에서 만나게) 하면 answer를 break로 while문을 탈출하도록 했습니다.

항상 첫번째~n번째 이런식에서는 극단적인 경우(양 끝에 있거나 한 경우)를 고려해서 TC를 만들어 봐야겠습니다.

728x90