본문 바로가기
Problem Solving

[Swift] 프로그래머스 예상 대진표(lv. 2)

by DuncanKim 2023. 3. 13.
728x90

[Swift] 프로그래머스 예상 대진표(lv. 2)

 

1. 문제

https://school.programmers.co.kr/learn/courses/30/lessons/12985

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

2. 접근

배열이 아니기 때문에 쉽게 생각해보면, 1번 선수, 2번 선수 이렇게 변환을 해서 생각을 해보면 접근이 쉽다.

 

서로 경기를 하기 위해서는 

1 - 2 / 3 - 4 / 5 - 6 / ....

이런 식으로 붙어 있어야 경기를 할 수 있다. 2 - 3의 경우는 경기를 할 수 없다고 생각을 하고 이에 맞추어 구현을 하면 될 것 같았다.

주어지는 a, b가 누가 더 큰지 알 수 없기 때문에 아래의 코드를 보면, innerA, innerB 변수를 두고, 큰 수를 innerA로, 작은 수를 innerB로 설정하였다.

 

innerA는 innerB와 붙게 된다면 항상 뒤에 위치해야 한다. 

예를 들어 innerA = 5, innerB = 3인 경우, 한 번의 경기를 치르고 두 번째 경기를 치를 때, innerA는 3번 선수가 되고, innerB는 2번 선수가 되고, 세 번째 경기를 치를 때는 innerA가 2번 선수, innerB가 1번 선수가 되는 것이라고 생각하면 되겠다. 이렇게 되면 서로 맞붙게 되는 것이다!

 

그러면 나머지를 구해보면 innerA가 2로 나눈 나머지가 0, 그리고 innerB가 2로 나눈 나머지가 1이며, 두 개의 차이가 1일 경우, 서로 맞붙게 되는 상황이 되는 것이다. 이런 조건을 만족시킬 때까지 while문 안에서 answer를 하나 씩 누적하여 더해주고, innerA, innerB를 2로 나누어가면서 반복을 돌려준다.

 

한 번의 경기마다 절반의 참가자가 사라지는 것과 나머지를 활용하여 풀었던 문제였다.

 

3. 코드

import Foundation

func solution(_ n:Int, _ a:Int, _ b:Int) -> Int {
    var answer = 0
    var innerA = a > b ? a : b
    var innerB = a > b ? b : a
    
    while true {
        answer += 1
        if innerA % 2 == 0 && innerA - innerB == 1 {
            break
        }
        innerA = (innerA % 2 == 0) ? innerA / 2 : (innerA / 2) + 1
        innerB = (innerB % 2 == 0) ? innerB / 2 : (innerB / 2) + 1
    }
    return answer
}
728x90

댓글