[문제 출처]
https://www.acmicpc.net/problem/1057
1057번: 토너먼트
김지민은 N명이 참가하는 스타 토너먼트에 진출했다. 토너먼트는 다음과 같이 진행된다. 일단 N명의 참가자는 번호가 1번부터 N번까지 배정받는다. 그러고 난 후에 서로 인접한 번호끼리 스타를
www.acmicpc.net
[소스 코드1 - 틀렸습니다]
n명의 참가자가 있을 때 두 사람이 몇 라운드에서 만나는지 알기 위해서는
2^i 만큼 묶어보면 알 수 있다.
예를 들어 n = 16 kim = 8 im = 9라고 할 때
(1) 2^1
1 2 / 3 4 / 5 6 / 7 8 / 9 10 / 11 12 / 13 14 / 15 16
(2) 2^2
1 2 3 4 / 5 6 7 8 / 9 10 11 12 / 13 14 15 16
(3) 2^3
1 2 3 4 5 6 7 8 / 9 10 11 12 13 14 15 16
(4) 2^4
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
>> 같은 묶음 안에 8과 9가 위치하므로 4라운드에서 8번과 9번은 만난다.
이 과정을 코드로 표현하기 위해서 ceil함수를 사용했다.
아래 코드를 보면 2의 제곱, 세제곱 이런 식으로 나눠주는 수를 2씩 곱해주었고,
그렇게 나눠 준 수에 ceil을 했을 때 나온 값이 같다면 같은 묶음 안에 있는 것이다.
ceil(8/2) = ceil(4) = 4
ceil(9/2) = ceil(4.5) = 5
ceil(8/4) = ceil(2) = 2
ceil(9/4) = ceil(2.25) = 3
...
ceil(8/16) = 1
ceil(9/16) = 1
#1057
import math
n, kim,im = map(int, input().split())
for i in range(1,int(n**(1/2))+1):
if math.ceil(kim/(2**i)) == math.ceil(im/(2**i)):
round = i
break
print(round)
하지만 제출을 했을 때 틀렸다고 떴기에 다른 코드로 작성해 주었다.
틀린 부분이 보인다면 댓글 달아주시면 감사하겠습니다.
[소스 코드2 - 맞았습니다!!]
위의 코드와 기본 아이디어는 동일하나 2로 계속 나눠주어 나눈 횟수를 계산하여 round 수를 계산하였다.
#1057
import math
n, kim,im = map(int, input().split())
round = 0
while True:
if math.ceil(kim) == math.ceil(im):
break
kim = math.ceil(kim/2)
im = math.ceil(im/2)
round += 1
print(round)
'알고리즘 > python' 카테고리의 다른 글
[python/파이썬] 백준 1159 농구 경기 (0) | 2023.01.19 |
---|---|
[python/파이썬] 백준 1100 하얀 칸 (0) | 2023.01.18 |
[python/파이썬] 백준 1193 분수찾기 (0) | 2023.01.16 |
[python/파이썬] 백준 1076 저항 (0) | 2023.01.13 |
[python/파이썬] 백준 1284 집 주소 (0) | 2023.01.12 |