프로그래머스 연습 문제 - 예상 대진표
programmers.co.kr/learn/courses/30/lessons/12985
코딩테스트 연습 - 예상 대진표
△△ 게임대회가 개최되었습니다. 이 대회는 N명이 참가하고, 토너먼트 형식으로 진행됩니다. N명의 참가자는 각각 1부터 N번을 차례대로 배정받습니다. 그리고, 1번↔2번, 3번↔4번, ... , N-1번↔N
programmers.co.kr
level2
1번째
def solution(n,a,b):
result = []
answer = 0
for i in range(1,n+1):
result.append(i)
while n > 3 :
answer += 1
n = n//2
for i in range(n):
x = result.pop(i)
y = result.pop(i)
if (x == a or x == b )and (y == b or y == a):
return answer
if x == a or x == b :
result.insert(i,x)
else:
result.insert(i,y)
return answer
채점 결과
정확성: 76.5
합계: 76.5 / 100.0
테스트 케이스 27번부터 시간초과가 난다. 아마 while문을 너무 많이 돌아서 중간에 끊어줘야 되는거 같은데...ㅠㅠ
도저히 모르겠어서 질문하기를 봤는데 좋은 힌트를 얻었다.
이 문제는 선수들의 번호를 비교하고 만약 해당 라운드에서 경기를 하지 않는다면 새로 번호를 부여하는 로직이 핵심입니다
저 말이 도움이 많이 됬다. 그리고 round()함수까지!!
2번째
def solution(n,a,b):
answer = 0
while n > 1 :
answer += 1
if a < b and a %2 == 1:
if a + 1 == b:
return answer
elif a > b and b % 2 == 1:
if b+1 == a :
return answer
if a % 2 == 1 and (a//2) % 2 == 0:
a = round(a/2) + 1
else:
a = round(a/2)
if b % 2 == 1 and (b//2) % 2 == 0:
b = round(b/2) + 1
else :
b = round(b/2)
n = n // 2
return answer
훨씬 보기 좋아졌다. 한 라운드가 종료될때마다 n의 수는 반으로 줄어들고 a와 b의 번호가 바뀐다. 만약 a = 3 인 경우 round(a/2)인 2가 다음 번호가 되고 b = 7인 경우 round(b/2)인 4가 된다. 결국 a와 b역시 반으로 줄어드는 것이다. 하지만 round()의 경우 소수점이 아닌 앞의 숫자가 홀수일 경우엔 높여서 반올림 되지만 짝수일 경우엔 낮혀서 반올림이 된다. 이걸 위해 만약 홀수인 수가 2로 나누어 졌을때 홀수이면 그대로 round()값을 가져가지만 짝수일 경우엔 1을 더해 수를 맞춰주었다. a와 b가 경기를 하는지를 확인하는 법은 만약 a가 b보다 작고 a가 홀수일 경우 a+1을 했을때 b가 나오면 경기를 하는 것으로 하고 라운드를 리턴해준다. 무조건 앞의 수가 홀수여야 같은 경기를 진행한다!!!
이렇게하면 무척 쉽게 풀리는 것을 확인할 수 있따 !!
거의 힌트에 답을 다 주셔서 쉽게 풀었지만... 그래도 어느정도 내 생각이 들어갔달까..? 학교다녀오고 과제하느라 컨디션이 진짜로 너무 안좋아져서 문제풀이를 쉬었지만....이번주엔 열심히 밀리지 않고 백준까지 풀이해야겠다..