honey_pot
[python] 예상 대진표 본문
https://school.programmers.co.kr/learn/courses/30/lessons/12985
for문으로 i, i+1 쌍으로 값을 비교하고 step=2 로 증가할까 생각했다가 left, right로 인덱싱을 생각하는게 더 직관적일 것 같아서 변경
어차피 같은 아이디어이니까 for문으로 해도 상관은 없다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
import math
def solution(n, a, b):
answer = 0
players = [i for i in range(1, n + 1)] # 1부터 n까지 선수 등록
rounds = int(math.log2(n)) # 총 라운드 수 n = 2^m 에서 m
for rnd in range(1,rounds+1):
left, right = 0, 1
next_players = []
while left < right and right < len(players):
if (players[left], players[right]) == (a,b) or (players[left], players[right]) == (b,a): # a,b가 한 쌍이 되었을 때
answer = rnd
break
elif players[left] in [a,b]: # a 혹은 b인 경우 무조건 승리
next_players.append(players[left])
elif players[right] in [a,b]:
next_players.append(players[right])
else: # 그 외의 경우
next_players.append(players[left]) # 임의로 짝수 인덱스 선수들이 이겼다고 침
left += 2
right += 2
players = next_players # 다음 라운드로 진출한 선수들을 다음 라운드에서 players로
return answer
|
cs |
총 라운드 수는 주어진 n이 2의 몇 제곱인지에 따라 제곱수이고
진행되는 대결 횟수는 n-1 회, 다음 라운드로 진출할 때의 순서 인덱스 값이 대결을 했던 선수들 중 짝수의 값, 즉 둘 중 더 큰 값의 인덱스의 1/2이라는 걸 이용해서 코드를 더 줄일 수도 있다. 선수가 1부터 1 차이로 순서대로 정렬되어 있는 상태이기 때문에 그냥 값으로 계산해도 된다
1
2
3
4
5
6
7
8
9
10
11
|
import math
def solution(n,a,b):
answer = 0
while True:
answer +=1
a = math.ceil(a/2)
b = math.ceil(b/2)
if a == b or a == 0 or b == 0:
break
return answer
|
cs |
a,b는 누굴 만나든 다 이기는 조건이 있기 때문에 중간에서 만나는 경우(a==b) 마지막 라운드에서 만나는 경우(a==0 or b==0)가 존재한다. a,b를 계속 2로 나누다가 두 값이 일치하거나 한 값이 0이 되는 경우가 답이 된다.
'문제 풀이' 카테고리의 다른 글
[python] 전력망을 둘로 나누기 (0) | 2022.08.11 |
---|---|
[python] n^2 배열 자르기 (0) | 2022.08.08 |
[python] 방금 그곡 (0) | 2022.08.05 |
[Python] [3차] 파일명 정렬 (0) | 2022.08.03 |
[python] 주차 요금 계산 (0) | 2022.07.31 |
Comments