이 포스팅은 프로그래머스 시리즈 28 편 중 7 번째 글 입니다.

  • Part 1 - 01: 다리를 지나는 트럭
  • Part 2 - 02: 멀정한 사각형
  • Part 3 - 03: 더 맵게
  • Part 4 - 04: 메뉴 리뉴얼
  • Part 5 - 05: 전화번호 목록
  • Part 6 - 06: 가장 큰 수
  • Part 7 - This Post
  • Part 8 - 08: 다단계 칫솔 판매
  • Part 9 - 09: 불량 사용자
  • Part 10 - 10: 베스트 앨범
  • Part 11 - 11: 합승 택시 요금
  • Part 12 - 12: 스타 수열
  • Part 13 - 13: 위장
  • Part 14 - 14: 주식 가격
  • Part 15 - 15: 디스크 컨트롤러
  • Part 16 - 16: N으로 표현
  • Part 17 - 17: 전화번호 목록
  • Part 18 - 18: 단어 변환
  • Part 19 - 19: 여행 경로
  • Part 20 - 20: 프린터
  • Part 21 - 21: 후보키
  • Part 22 - 22: 삼각 달팽이
  • Part 23 - 23: 실패율
  • Part 24 - 24: 입국심사
  • Part 25 - 26: 기둥과 보 설치
  • Part 26 - 27: 광고 삽입
  • Part 27 - 28: 퍼즐 조각 채우기
  • Part 28 - 29: 상호 평가
▼ 목록 보기

목차

▼ 내리기

풀이

아무 생각 없이 재귀로 풀었다.. 그냥 어느 위치에 있는지에 따라 값이 변하길래. 아마 최근에 정렬문제를 많이 푼 탓인가보다. 그래서 풀고나서 다른 분 코드를 보고 규칙을 나도 파악해 보기로 했다.

일단 사실 문제를 안읽었다. 문제를 읽어보니 이기면 id가 바뀌더라. 만약 3의 위치에 있는 사람이 이기게 되면 2의 id로 변하는 식. 그럼 위치에 따라 승리할 경우 그 다음라운드에서 순서가 결정된다. 예를 들어 3이면 2, 5면 3, 7이면 4인 식이다. 결국 1, 2 는 1로 , 3, 4는 2로 이런 식인데, 어떻게 하면 다음 라운드로 갈 수 있을까. 나눠주면 된다. 1을 더해서.

Code

  • 먼저 생각 없이 짠 코드
import math
import sys
sys.setrecursionlimit(100000)
# 11000000
def go(l, r, a, b, total, game_round):
    m = (l+r)//2
    
    if l <= a <= m and m+1 <= b <= r: # 서로 다른 그룹이면
        return total-game_round
    elif l <= a <= m and l <= b <= m: # 왼쪽 그룹 이면
        return go(l, m, a, b, total, game_round+1)
    else:
        return go(m+1, r, a, b, total, game_round+1)
        

def solution(n,a,b):
    c = a if a < b else b
    d = a if a > b else b
    total_round = int(math.log2(n))
    return go(1, n, c, d, total_round, 0)
    


# 1112 1131

#A와 B의 위치만 알면 결정된다.
# log2(N) = 전체 라운드 수
# 반 잘라
    # a, b 다른 그룹? -> 전체 - 현재 depth(나눈선을 의미)
    # a, b 같은 그룹? -> go(해당 그룹)
  • 규칙을 파악해 본 코드
def solution(n,a,b):
    count = 0
    while a != b:
        a = (a+1) // 2
        b = (b+1) // 2
        count += 1
    return count