[백준] 6987 - 올림픽 with.Python

·

2 min read

💡문제 분석 요약

-- 문제 --

입력 : 나라별로 승, 무승부, 패의 순서로 빈칸을 하나 사이에 두고 18개 숫자 입력,
승, 무, 패의 수는 6보다 작거나 같은 자연수 또는 0

  • 6개국으로 구성된 각 조별로 동일한 조에 소속된 국가들과 한번씩 경기를 치름.

  • 승, 무승부, 패가 가능한 결과인지 판별하여 가능하면 1 불가능하면 0을 출력

💡알고리즘 설계

💡코드

💡시간복잡도

O(N)

💡틀린 이유

  1. 문제 접근 방법에 감이 아예 잡히지 않아 다른 분의 풀이를 이해하는 걸 목표로 잡고 진행하였다.

💡틀린 부분 수정 or 다른 풀이

(https://velog.io/@young_gyu/Python-%EB%B0%B1%EC%A4%80-6987-%EC%98%AC%EB%A6%BC%ED%94%BD 풀이 참고하였습니다.)

result = {}
team = ['A','B','C','D','E','F']
allMatch = []

for i in range(6):
    for j in range(i+1,6):
        allMatch.append([team[i],team[j]])

position = {'A': 0, 'B': 3, 'C': 6, 'D': 9, 'E': 12, 'F': 15}

def match(a,b,status,note,depth) :

    if status == 0: #승
        aIDX = position[a]
        bIDX = position[b]
        note[aIDX] += 1
        note[bIDX+2] += 1
        if answer[aIDX] < note[aIDX] or answer[bIDX+2] < note[bIDX+2] :
            return

    elif status == 1: #무
        aIDX = position[a]
        bIDX = position[b]
        note[aIDX+1] += 1
        note[bIDX+1] += 1

        if answer[aIDX+1] < note[aIDX+1] or answer[bIDX+1] < note[bIDX+1] :
            return

    elif status == 2:  # 패
        aIDX = position[a]
        bIDX = position[b]
        note[aIDX + 2] += 1
        note[bIDX] += 1

        if answer[aIDX+2] < note[aIDX+2] or answer[bIDX] < note[bIDX] :
            return

    if depth == 15:
        result[str(note)] = 1
        return

    nextA ,nextB = allMatch[depth]

    match(nextA,nextB,0,note[:],depth+1)
    match(nextA, nextB, 1, note[:], depth + 1)
    match(nextA, nextB, 2, note[:], depth + 1)

for i in range(4):
    answer = list(map(int,input().split()))
    note = answer[:]

    match('A', 'B', 0, [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 1)
    match('A', 'B', 1, [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 1)
    match('A', 'B', 2, [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 1)

    if result.get(str(answer)) != None :
        print(1, end=' ')
    else:
        print(0, end=' ')

💡느낀점 or 기억 할 정보

  1. 처음 코테를 접하다보니 접근하는데 어려움을 느낌. -> 문제 많이 접해보기.

  2. 개념만 공부하지 말고 기본 구현한 코드 많이 접해보기.

  3. position : 각 팀의 승/무/패 기록을 저장할 인덱스 포지션을 정의한 딕셔너리
    (0 : 승리 1 : 무승부 2: 패배)

  4. note : 각 팀의 경기 결과를 기록하는 리스트

  5. aIDX,bIDX통해서 positon의 인덱스 찾기 가능

  6. note[aIDX] +=1 : a승리, note[bIDX+2] +=1 : b패배

  7. if answer[aIDX] < note[aIDX] : 입력으로 주어진 경기기록보다 현재 더 많이 기록하면 함수 실행 중단하고 리턴

  8. answer = list(map(int, input().split())) : 주어진 경기 기록 저장.