[문제 풀이] 예상 대진표 LV 2.

SEUNGJUN·2024년 4월 1일
0

Data Structure & Algorithm

목록 보기
16/20

요구사항


문제 풀이 1차

import math

def solution(n, a, b, answer = 1):
    answer += 1
    
    a = math.ceil(a / 2)
    b = math.ceil(b / 2)
    
    if abs(a - b) == 1:
        return answer
    return solution(n, a, b, answer)
  • 대진에서 승리를 할경우 N/2로 시작을 한다고 하였으니 경기를 했다고 가정해서 각 부여 받은 번호에 N/2를 해주는데 홀수가 걸릴경우 올림처리를 해준다.
  • 그 둘의 차이가 1이 날 경우 경기를 붙는다고 생각하여 차이가 1이 날때 까지 재귀함수를 돌려준다.

간과한점이 있었다. 예를들어서 [1,2], [3,4] 이렇게 떨어지는게 아니라 [2,3], [4,5]로 떨어져도 차수가 1이 나기 때문에 값이 처리가 되는데 이는 둘의 대결이 아니기 때문에 수정이 필요하다.

import math

def solution(n, a, b, answer = 1):
    answer += 1
    
    a = math.ceil(a / 2)
    b = math.ceil(b / 2)
    
    if (((a > b) and a % 2 == 0) or (a < b) and b % 2 == 0) and abs(a - b) == 1:
        return answer
    return solution(n, a, b, answer)
  • 이때 [1,2], [3,4]와 같이 항상 홀수가 앞, 짝수가 뒤로 와야 하기 때문에 두가지 모두 고려해서 if문을 걸어준다.

테스트 케이스에 예를들어서 n = 1, 이고 A = 1, B = 2, 일때 answer = 1과 같은 2명만 존재하면 한번에 끝나야 하는데 N/2를 해버리면 둘다 1, 1이 되버리면서 무한 루프에 빠져버리는 상황이 발생했다.

import math

def solution(n, a, b, answer = 0):
    answer += 1
    
    if (((a > b) and a % 2 == 0) or (a < b) and b % 2 == 0) and abs(a - b) == 1:
        return answer
    
    a = math.ceil(a / 2)
    b = math.ceil(b / 2)
    
    return solution(n, a, b, answer)
  • 위 처럼 조회를 먼저 해주고 그 이후에 승부를 보고 다시 하는 방식으로 해주면 먼저 경기를 이어 나갈지 안나가도 될지 조회가 가능해진다.

코드 리팩터링

import math

def solution(n, a, b, answer = 0):
    answer += 1
    
    if max(a, b) % 2 == 0 and abs(a - b) == 1:
        return answer
    
    a = math.ceil(a / 2)
    b = math.ceil(b / 2)
    
    return solution(n, a, b, answer)
  • a, b에서 더 큰수를 찾는 방법이 max를 이용해서 바로 찾을수가 있으므로, 간단하게 처리가 가능하다.
profile
RECORD DEVELOPER

0개의 댓글