[백준] 6987 - 올림픽 with.Python
💡문제 분석 요약
-- 문제 --
입력 : 나라별로 승, 무승부, 패의 순서로 빈칸을 하나 사이에 두고 18개 숫자 입력,
승, 무, 패의 수는 6보다 작거나 같은 자연수 또는 0
6개국으로 구성된 각 조별로 동일한 조에 소속된 국가들과 한번씩 경기를 치름.
승, 무승부, 패가 가능한 결과인지 판별하여 가능하면 1 불가능하면 0을 출력
💡알고리즘 설계
💡코드
💡시간복잡도
O(N)
💡틀린 이유
- 문제 접근 방법에 감이 아예 잡히지 않아 다른 분의 풀이를 이해하는 걸 목표로 잡고 진행하였다.
💡틀린 부분 수정 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 기억 할 정보
처음 코테를 접하다보니 접근하는데 어려움을 느낌. -> 문제 많이 접해보기.
개념만 공부하지 말고 기본 구현한 코드 많이 접해보기.
position : 각 팀의 승/무/패 기록을 저장할 인덱스 포지션을 정의한 딕셔너리
(0 : 승리 1 : 무승부 2: 패배)note : 각 팀의 경기 결과를 기록하는 리스트
aIDX,bIDX통해서 positon의 인덱스 찾기 가능
note[aIDX] +=1 : a승리, note[bIDX+2] +=1 : b패배
if answer[aIDX] < note[aIDX] : 입력으로 주어진 경기기록보다 현재 더 많이 기록하면 함수 실행 중단하고 리턴
answer = list(map(int, input().split())) : 주어진 경기 기록 저장.