r잡초처럼
바른 프로그래밍
r잡초처럼
전체 방문자
오늘
어제
  • 분류 전체보기 (124)
    • FastAPI (7)
    • 끄적끄적 (2)
    • Python (17)
    • Django (31)
    • Database (2)
    • Docker (7)
    • 디자인패턴 (2)
    • CS 공부 (12)
      • 알고리즘 (2)
      • 자료 구조 (1)
      • 네트워크 (7)
      • IT 지식 (1)
      • 운영체제 (1)
    • 기타 팁들 (10)
    • Aws (2)
    • 독서 (1)
    • 코딩테스트 공부 (1)
      • 백준 (0)
      • 프로그래머스 (1)
    • DevOps (13)
    • TIL (3)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • poetry
  • 랜 카드
  • Batch
  • 컴퓨터 기본 지식
  • 상속 안티 패턴
  • 7장
  • preonboarding
  • fastapi
  • 전기 신호
  • 네트워크
  • encoding
  • 완벽한 IT 인프라 구축을 위한 Docker
  • CS 지식
  • 물리 계층
  • validate
  • docker
  • pytest
  • cp949
  • 랜과 왠
  • 책 리뷰
  • 케이블의 종류
  • dotenv
  • pycharm
  • 6장
  • 모두의 네트워크
  • 파이썬 클린 코드
  • query param
  • 상속과 컴포지션
  • depends
  • 5장 회사에서 하는 랜 구성

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
r잡초처럼

바른 프로그래밍

코딩테스트 공부/프로그래머스

Lv.2 - 예상 대진표

2022. 12. 14. 13:24

정답률 60% 짜리 문제이다. 문제 읽으면서 떠오르는 대로 코드를 짰다.

문제는 여기

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

1. 문제 요구사항 분석

  1. N명의 참가자는 각각 1부터 N번을 차례대로 배정받습니다. 
  2. 1번↔2번, 3번↔4번, ... , N-1번↔N번의 참가자끼리 게임을 진행합니다.
  3. 다음 라운드에 진출할 참가자의 번호는 다시 1번부터 N/2번을 차례대로 배정받습니다.
  4. 만약 1번↔2번 끼리 겨루는 게임에서 2번이 승리했다면 다음 라운드에서 1번을 부여받고, 3번↔4번에서 겨루는 게임에서 3번이 승리했다면 다음 라운드에서 2번을 부여받게 됩니다.
  5. 게임은 최종 한 명이 남을 때까지 진행됩니다.
  6. A번 참가자와 B번 참가자는 서로 붙게 되기 전까지 항상 이긴다고 가정합니다.

여기서 2번과 3번만 주의해서 봤으면 문제를 풀기는 쉬웠다.

 

2. 코드 구현

2.1 상대를 구하는 코드

우선 2번을 코드로 구현해봤다.

def enemy(player: int) -> int:
    return player % 2 == 0 and player - 1 or player + 1

나를 기준으로 홀수면 상대방은 +1을 한 참가자이고, 짝수면 내 앞의 참가자이다.

2.2 플레이를 리셋하는 코드

3번 요구사항도 비슷하다. 짝수면 그대로 리셋시키면 되고, 홀수면 나눈 해에다가 나머지를 더하면 된다.

def reset_player(player: int) -> int:
    return player // 2 + (player % 2)

2.3 경기를 구현하는 코드

상대와 나를 리셋시키는 코드만 구현했다면 경기를 구현하는 것은 쉽다. 나는 요즘 재귀 함수와 클로져를 자주 사용해서 그런지, 순회를 이용하기보다는 재귀 함수로 코드를 짰다.

def fight():
        nonlocal answer, a, b
        answer += 1  # 경기 횟수
        enemy_a = enemy(a)
        
        if enemy_a == b:  # 상대가 b와 같을 때 재귀를 탈출
            return
        
        a = reset_player(a) 
        b = reset_player(b)
        fight()

2.4 전체 코드

def enemy(player: int) -> int:
    return player % 2 == 0 and player - 1 or player + 1


def reset_player(player: int) -> int:
    return player // 2 + (player % 2)


def solution(n, a, b):
    answer = 0

    def fight():
        nonlocal answer, a, b
        answer += 1
        enemy_a = enemy(a)

        if enemy_a == b:
            return

        a = reset_player(a)
        b = reset_player(b)
        fight()

    fight()
    return answer
    r잡초처럼
    r잡초처럼
    오늘보다 내일 더 나은 개발자가 되기 위한 노력을 기록하는 블로그 입니다.

    티스토리툴바