[Algorithm] 백준 1057 - 토너먼트 in Python(파이썬)

하이초·2022년 7월 11일
0

Algorithm

목록 보기
14/94
post-thumbnail

💡 백준 12865:

참가자 a, b의 번호를 2로 나눠가며 두 참가자가 만날때까지 라운드 수를 증가하여 최종 라운드 수 출력

🌱 코드 in Python

알고리즘: Brute Force

import sys

n, a, b = map(int, sys.stdin.readline().split())
ret = 1
if a > b: # 만약 a가 b보다 크다면 바꾸기
	tmp = a
	a = b
	b = tmp

while a // 2 + 1 != b // 2 or b - a > 1: # a를 2로 나눈 몫 + 1과 b를 2로 나눈 몫이 같지 않거나, b - a가 1보다 클 때까지 반복 = (a = 1, b = 2)가 될 때까지 반복하는 것
	if a % 2 == 0: # 나머지가 0이면
		a = a // 2 # 몫 저장
	else: # 나머지가 0이 아니면
		a = a // 2 + 1 # 몫 + 1 저장
	if b % 2 == 0: 
		b = b // 2
	else:
		b = b // 2 + 1
	ret += 1
print(ret)

이번 문제는 그렇게 어려운 문제는 아니었다
문제 자체에서 몇가지 조건을 제약 조건처럼 주는데 사실 별로 고려하지 않아도 되는 조건들이 많았다

나처럼 a와 b의 크기가 중요하게 코드를 짤 경우에는 a가 b보다 큰 경우를 따로 고려해주어야 한다

문제를 풀긴 풀었지만 너무 하드코딩 너낌이 나서 다른 방법을 찾다가 아래와 같은 코드를 찾았는데,
이런 코드가 훨씬 깔끔한 것 같다
잘하자!

import sys

N, Kim, Im = map(int, sys.stdin.readline().split())
count = 0
while Kim != Im: # 두 참가자의 숫자가 같지 않고 = (kim = 1, im = 1)이 될 때까지 반복하는 것
    Kim -= Kim // 2
    Im -= Im // 2
    count += 1
print(count)

각 참가자의 첫 번호부터 시작하여 2로 나눈 몫을 빼줌에 따라,
내 코드에서 a % 2 == 0 인 걸 확인하는 조건이 필요없어졌다!
나는 + 1을 해주어야 하는 경우가 있어서 분기를 나누어야 했는데, 저렇게 몫을 빼니까 그런 분기가 필요없어졌다! 쩝.


🧠 기억하자

이번 문제는 별로 어려운게 없었지만 더 깔끔하게 코드를 짤 수 있도록 생각해야 할 것 같다
집중!!!! 👁🥄👁

백준 1057 바로가기

profile
개발국대가 되는 그 날까지. 지금은 개발 응애.

0개의 댓글