https://school.programmers.co.kr/learn/courses/30/lessons/12985
두 참가자가 몇번째 라운드에서 만나는지를 구하는 문제이다.
처음에 주어진 위치에서 라운드를 진행할때마다 위치가 바뀔텐데 이부분을 어떻게 구해야하는지를 먼저 생각했다.
문제에도 설명이 나와있지만 한 라운드를 진행하면 N/2 번째 로 바뀌게 된다!
2로 나누게 되면 소수점 부분이 생기다보니 round 를 통해 반올림을 해주어 다음 라운드때 몇번째 위치인지 계산을 해주었다
두번째로 몇번째 라운드에 만날지 구해야한다
라운드를 진행할때마다 참가자의 수는 절반으로 줄어들기 때문에 총라운드는 참가자의 수 / 2가 된다
이렇게 라운드의 수를 구해서 반복문을 통해 만나는 라운드의 수를 구하였다
func solution(_ n:Int, _ a:Int, _ b:Int) -> Int {
var result = 0
var gameRound = n / 2
var alocation = Double(a)
var blocation = Double(b)
for i in 1...gameRound {
if round(Double(alocation / 2)) == round(Double(blocation / 2)) {
result = i
break
} else {
alocation = round(Double(alocation / 2))
blocation = round(Double(blocation / 2))
}
}
return result
}
근데.. 말이다..
다른 사람의 풀이를 보니 엄청 간단한 문제였나 싶었다..
func solution(_ n: Int, _ a: Int, _ b: Int) -> Int {
var round = 0
var playerA = a
var playerB = b
while playerA != playerB {
playerA = (playerA + 1) / 2
playerB = (playerB + 1) / 2
round += 1
}
return round
}
round 를 사용해서 반올림 하지 않고 다음과 같이 다음 라운드의 위치를 계산한다.
해당 위치에 1을 더하는 이유는 인접한 참가자는 라운드에서 동일한 위치를 갖고 있기 때문이다.
1, 2번째 참가자 -> 다음 라운드 1
3, 4번째 참가자 -> 다음 라운드 2
이렇게 계산하기 위해서 나는 round 를 통해 반올림을 해주었지만 다른 사람은 단순하게 1을 더해서 2를 나누고 정수부분만 사용해서 동일한 결과를 만들어 준 것이다.
그리고 굳이.. 총 라운드의 수를 구할 필요도 없었던 문제이다...
내 힘으로 풀어서 좋았지만.. 다른 사람의 방식을 보니 더 공부해야겠다...