Programming/Questions

[백준/Python] 해시 - I AM IRONMAN(17264)

당닝 2021. 8. 9. 16:13
728x90

I AM IRONMAN


 

문제 설명


다들 문제 제목을 보고 요즘 가장 핫한 영화를 생각했겠지만 이 이야기는 LUL(League Us Legends) 게임에서 아이언(Iron) 티어에 있는 형동이의 슬픈 이야기이다. LUL에서 티어는 게임 실력을 판가름할 수 있는 지표이다. 그중 아이언 티어는 가장 낮은 단계에 위치해 있다. 친구인 강엽이와 건홍이에게 “Ironman”이라며 게임을 못한다고 놀림당하던 형동이는 꼭 아이언 티어에서 벗어나겠다고 결심했다. 하지만 형동이는 자신의 실력으로 절대 아이언(Iron) 티어에서 벗어나지 못하는 것을 알고 있다. LUL은 두 명의 플레이어가 같이 팀이 되어 하는 게임이기 때문에 자신이 못해도 게임에서 이길 수 있고 자신이 잘해도 게임은 질 수 있다. 형동이는 게임은 못하지만 머리가 매우 똑똑하여 LUL 게임을 해킹하여서 몇몇 플레이어와 같이 게임을 하게 되면 게임의 승패가 어떻게 되는지 알게 되었다. 하지만 해킹을 통하여 알아내지 못한 플레이어와 같이 게임을 하는 경우 형동이가 매우 못하기 때문에 같은 팀원이 아무리 잘해도 반드시 진다.

위와 같은 경우에서 “JIHOON”과 같이 게임을 하는 경우 20점(W = 20)을 획득하는 반면에 “GANGYEOP”이나 “MINSUNG”과 같이 게임 하는 경우 경우 15점(L = 15)을 잃게 된다. 뿐만 아니라, 해킹을 통해 알지 내지 못한 플레이어를 만나게 되는 경우 형동이가 매우 못하여 지기 때문에 15점을 잃게 된다. (단, 계속 지더라도 점수는 0점 밑으로 떨어지지 않는다.)

형동이가 N번에 게임을 통해서 아이언 티어에서 탈출한 경우 형동이는 “I AM NOT IRONMAN”이라고 외치지만 탈출하지 못한 경우 “I AM IRONMAN”이라고 외친다.

여기서 아이언 티어를 탈출하기 위해서 100점 (G = 100) 이상이 되어야 했다면 9번째 게임(주황색 사각형)을 하고 아이언 티어를 탈출하였기 때문에 형동이는 “I AM NOT IRONMAN”이라고 외친다. 아이언 티어에서 탈출한 경우 그 이후에 게임은 신경쓰지 않는다.

하지만 만약 탈출하기 위해서 200점(G = 200) 이상이 되어야 한다고 했을 경우 형동이는 아이언 티어를 탈출하지 못했기 때문에 “I AM IRONMAN”이라고 외치게 된다.

과연 형동이는 게임이 끝난 후 어떤 대사를 할 지 우리가 맞춰보자.

 

 

입력


첫 번째 줄에는 총 게임 횟수 N과 해킹을 통해 얻은 플레이어 정보의 수 P가 주어진다. (N과 P는 1,000이하의 자연수)

그리고 두 번째 줄에는 이긴 경우 획득 점수 W와 졌을 때 떨어지는 점수 L, 그리고 IRON 티어에서 벗어나기 위한 점수 G가 주어진다.  (0 ≤ W, L  ≤ 100, 1 ≤ G  ≤ 100,000, 이 때, W, L, G는 정수)

그리고 다음 P개의 줄에는 플레이어의 이름과 무조건 이길 수 있는 경우 W, 무조건 지는 경우 L이라는 단어가 플레이어 이름과 쌍으로 나온다.

그리고 그 다음 N개의 줄에는 같이 게임을 하는 플레이어의 이름이 나온다.

플레이어 이름은 반드시 대문자로 나오며 길이는 20이 넘지 않는다.

 

 

출력


0점부터 시작하였을 때 형동이가 아이언 티어에서 벗어나지 못한 경우 "I AM IRONMAN!!", 아이언 티어에서 벗어난 경우 “I AM NOT IRONMAN!!”을 출력한다.

 

 

입력 예시

10 3
20 15 100
JIHOON W
GANGYEOP L
MINSUNG L
JIHOON
MYEONGKI
GANGYEOP
MINSUNG
JIHOON
JIHOON
JIHOON
JIHOON
JIHOON
MINSUNG
10 3
20 15 100
JIHOON W
GANGYEOP L
MINSUNG L
JIHOON
GANGYEOP
JISUP
MINSUNG
JIHOON
JIHOON
MOJI
KYUNGMIN
SOOHO
SEOKGYE

 

출력 예시

I AM NOT IRONMAN!!
I AM IRONMAN!!

 

 


나의 풀이

import sys

# n: 총 게임 횟수
# p: 해킹을 통해 얻은 플레이어 정보의 수
n, p = map(int, sys.stdin.readline().split())

# w: 이긴 경우 획득 점수
# l: 졌을 때 떨어지는 점수
# g: IRON 티어 벗어나기 위한 점수
w, l, g = map(int, sys.stdin.readline().split())

# 해킹한 선수, 이기는지(W) or 지는지(L) 딕셔너리에 받기
hacked_player = {}
for i in range(p):
    name, t = sys.stdin.readline().split()
    hacked_player[name] = t

# 같이 게임하는 플레이어 이름 받아서 점수 계산하기
point = 0
for j in range(n):
    name = sys.stdin.readline().rstrip()

    if hacked_player.get(name) == 'W':  # 해킹을 해서 무조건 이길 수 있는 확률
        point += w
    else:  # 해킹을 했는데 지는 선수이거나, 해킹 정보가 없는 선수
        point -= l
        if point < 0:  # 점수는 절대 0점 밑으로 떨어지지 않음
            point = 0

    if point >= g:  # 점수가 IRON 티어 벗어나기 위한 점수를 넘겼을 때
        print("I AM NOT IRONMAN!!")
        quit()  # 프로그램 종료

print("I AM IRONMAN!!")

- 💡 아이디어
해킹한 플레이어를 딕셔너리에 받아 이름을 key로 저장하고, 졌는지('L') 이겼는지('W')를 value로 저장하였다.
n번의 게임횟수 동안 플레이어의 이름이 딕셔너리에 있는지 검사하면서 이겼다면 포인트를 얻고, 지거나 딕셔너리에 없다면 포인트를 잃도록 설정하였다.

 

- 📚 후기
w, l로 획득 점수와 잃는 점수 변수를 설정해놓고 예제의 점수로 획득하고 잃도록 계속 코드를 짰다.
따라서 예제로는 정답인데 백준에서는 틀렸다고 뜨는 어이없는 실수를 했다.

 

- ✏️ 배운점

  • quit(): 파이썬 프로그램 종료. (c언어에서 return 0과 비슷)
728x90