본문 바로가기

학습 노트/알고리즘 (Python)

99클럽 - 공원 산책, 예상 대진표

공원 산책

 

프로그래머스

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

programmers.co.kr

아이디어

두더지 문제로 유명한 2차원 배열의 경로탐색 문제의 변형이다.
최단거리 찾기 보다는 난이도가 낮은 편으로, DFS나 BFS 없이 경로의 유효성을 따져 이동거리를 반환하기만 하면 된다.

풀이

def solution(park, routes):
    height, width = len(park), len(park[0])
    obstacles = {(y, x) for y in range(height) for x in range(width) if park[y][x] == 'X'}
    dog_position = {'y': 0, 'x': 0}

    # 강아지의 시작 위치 찾기
    for y in range(height):
        for x in range(width):
            if park[y][x] == 'S':
                dog_position = {'y': y, 'x': x}

    move = {'E': (0, 1), 'S': (1, 0), 'W': (0, -1), 'N': (-1, 0)}

    for route in routes:
        direction, steps = route.split()
        steps = int(steps)
        dy, dx = move[direction]

        original_position = (dog_position['y'], dog_position['x'])

        for step in range(steps):
            new_y = dog_position['y'] + dy
            new_x = dog_position['x'] + dx
            
            # 범위 및 장애물 확인
            if 0 <= new_y < height and 0 <= new_x < width:
                if (new_y, new_x) in obstacles:
                    # 장애물을 만났을 때 해당 명령을 무시하고 원래 위치로 되돌림
                    dog_position['y'], dog_position['x'] = original_position
                    break
                else:
                    dog_position['y'], dog_position['x'] = new_y, new_x
            else:
                # 경계를 벗어난 경우도 해당 명령 무시
                dog_position['y'], dog_position['x'] = original_position
                break

    return [dog_position['y'], dog_position['x']]

코드도 훨씬 단순한 것을 확인 할 수 있다.
이런 문제는 이동 방향을 배열이나 딕셔너리로 미리 저장해 두면 코드 가독성을 크게 높일 수 있다.

예상 대진표

 

프로그래머스

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

programmers.co.kr

아이디어

  • A번 참가자와 B번 참가자는 서로 붙게 되기 전까지 항상 이긴다고 가정합니다.
  • 2의 지수 승으로 주어지므로 부전승은 발생하지 않습니다.

두 조건 덕분에 선수의 번호가 어떻게 업데이트 되는지 규칙만 찾으면 되는 간단한 문제다.

풀이

def solution(N, A, B):
    round_count = 1  # 첫 번째 라운드부터 시작
    while True:
        # A와 B가 같은 경기에 참여하는지 확인 (다음 라운드 번호가 같아지는 순간)
        if (A + 1) // 2 == (B + 1) // 2:
            return round_count
        
        # A와 B를 다음 라운드 번호로 업데이트
        A = (A + 1) // 2
        B = (B + 1) // 2
        
        # 다음 라운드로 넘어가므로 라운드 카운트 증가
        round_count += 1