코딩테스트(백준 구현(IMPLEMENTATION) (9517번: 아이 러브 크로아티아))

나이브한코딩·2021년 7월 16일
0
post-thumbnail

문제

"I love Croatia"는 네델란드의 인기 티비 프로그램 "I love my country"의 포맷 라이센스를 수입해 만든 크로아티아의 티비쇼이다. 이 티비쇼에서 가장 인기있는 게임은 "Happy Birthday"이며, 이 게임에 대한 문제를 풀게 된다.

플레이어 8명이 오른쪽 그림과 같이 원을 이루어서 앉아있다. 한 사람은 게임이 시작한지 3분 30초가 지나면 터지는 폭탄을 들고 있다. 폭탄을 들고있는 사람에게 질문을 하면서 게임은 시작된다. 어떤 문제의 정답을 맞추지 못한 경우나, 문제를 스킵한 경우에는 그 즉시 다음 문제를 받게 된다. 문제의 정답을 맞춘 경우에는 폭탄을 바로 왼쪽에 있는 플레이어에게 넘겨주고, 넘겨받은 플레이어에게 다음 질문이 나가게 된다.

게임이 시작했을 때 폭탄을 들고 있는 사람의 번호와 처음 N개의 질문을 대답할때까지 걸린 시간이 주어진다. 이때, 폭탄을 터뜨린 사람의 번호를 구하는 프로그램을 작성하시오.

각 사람이 질문을 듣고 대답할 때까지 걸린 시간과, 그 사람의 대답이 맞았는지(T), 틀렸는지(N), 스킵했는지(P)가 주어진다. 정답을 말하는 시간, 질문을 듣는 시간은 모두 0이라고 가정하며, 박스를 전달하는 시간도 0이라고 가정한다. 항상 사람이 폭탄을 들고있었을 때 터지는 입력만 주어진다.

입력
첫째 줄에 게임이 시작했을 때 폭탄을 들고 있는 사람의 번호 K (1 ≤ K ≤ 8)가 주어진다.

둘째 줄에는 질문의 개수 N (1 ≤ N ≤ 100)이 주어진다.

다음 N개 줄에는 i번째 질문을 대답하기까지 걸린 시간(단위: 초) T (1 ≤ T ≤ 100), 그 플레이어의 대답 Z (T, N, P중 하나) 가 주어진다.

출력
폭탄을 터뜨린 사람의 번호를 출력한다.

예제 입력 1 복사
1
5
20 T
50 T
80 T
50 T
30 T

예제 출력 1 복사
5

예제 입력 2 복사
3
5
100 T
100 N
100 T
100 T
100 N

예제 출력 2 복사
4

예제 입력 3 복사
5
6
70 T
50 P
30 N
50 T
30 P
80 T

예제 출력 3 복사
7

나의 풀이:

K = int(input()) # 폭탄 들고 있는 사람의 번호
N = int(input()) # 문제의 갯수

due_time = 210 # 3분 30초를 초 단위로 계산

time = 0 # 게임이 끝나기 전 총 걸린 시간
turn = 0 # 플레이어 간 폭탄을 넘겨준 횟수

time_spent = [0] * N # N 번의 문제 중 각 걸린 시간
ans = [0] * N # N 번의 문제 중 T 인지 N 인지 P 인지 구함

for i in range(N):
    time_spent[i], ans[i] = input().split(' ') # "20 T" 이런 식으로 입력받음
    while time < due_time: # 걸린 시간이 210초보다 낮을 때
        if ans[i] == 'T': # 만약 ans 리스트 요소가 'T' 일때
            time += int(time_spent[i]) # 그 시간을 time 변수에 더함
            turn += 1 # 'T' 맞추었으니 다른 플레이어에게 전달
        elif ans[i] == 'N' or 'P': # 만약 ans 리스트 요소가 'N' or 'P' 일때
            time += int(time_spent[i]) # 그 만큼 걸린 시간만 더함
        if time >= due_time: # 만약 210초랑 같거나 커질 때 while 문 탈출
            break

print(turn)

if K + turn > 8 :
    print(K + turn - 8)
else :
    print(K + turn)

다른 사람 풀이:

k = int(input()) - 1
n = int(input())
li = [input().split() for _ in range(n)]

time = 0

for i, j in li:
    time += int(i)
    if time >= 210:
        print(k + 1)
        break
    if j == 'T':
        k = (k + 1) % 8

만약 k - 1을 하지 않았을 경우 k = 7이면 j == 'T'일 때 k = 0이 나온다.

OR

k = int(input())
n = int(input())
answers = []
for i in range(n):
    t, z = input().split()
    answers.append([int(t), z])
remaining_time= 3*60+30

for answer in answers:
    if answer[1] == 'N' or answer[1] == 'P':   # 정답을 맞추지 못한 경우나 문제를 스킵한 경우
        remaining_time -= answer[0]
        if remaining_time <= 0:
            break
    else:   # 정답을 맞춘 경우
        remaining_time -= answer[0]
        if remaining_time <= 0:
            break
        else:
            k = k + 1 if k+1<=8 else 1   # 폭탄을 바로 왼쪽에 있는 플레이어에게 넘겨줌
            
print(k)

TAKEAWAY:

  • "예제 입력 2" 실행해 본 결과, 계속 출력값이 6으로 나온다... 왜그럴까

느낀점:

profile
안녕하세요, 코딩 공부하는 비전공자 취준생입니다.

0개의 댓글

관련 채용 정보