[백준] 17264번 I AM IRONMAN - C++

potatoj11n·2024년 1월 29일

백준

목록 보기
22/36

🌱 문제 설명

17264번 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!!”을 출력한다.

풀이

#include <iostream>
#include <map>

using namespace std;

int main() {
    int N, P, W, L, G;
    int score = 0;
    cin >> N >> P;
    cin >> W >> L >> G;

    // 해킹한 플레이어 이름과 승점을 저장할 맵
    map<string, int> m;

    // 플레이어 정보 (이름, W, L) 입력
    for (int i = 0; i < P; i++) {
        string name, result;
        cin >> name >> result;

        if (result == "W") {
            m[name] = W;
        } else {
            m[name] = -L;
        }
    }

    // N번째 게임까지 진행
    for (int i = 0; i < N; i++) {
        string name;
        cin >> name;

        if (score >= G) { // 형동이의 점수가 G를 넘으면 게임 종료
            break;
        }
        if (score < 0)
            score = 0;

        // 이름이 있는 경우
        if (m.find(name) != m.end()) {
            score += m[name];
        } else { // 명단에 없는 이름
             score -= L;
        }
    }

    // 아이언 티어에서 벗어났는지 확인하여 출력
    if (score >= G) {
        cout << "I AM NOT IRONMAN!!" << endl;
    } else {
        cout << "I AM IRONMAN!!" << endl;
    }

    return 0;
}

❣️문제 요약:

형동이가 해킹을 통해 얻은 플레이어 정보를 바탕으로 각 플레이를 할 때 마다 이기는 플레이어와 함께 경기를 하면 점수가 늘어나고 지는 플레이어와 함께 경기하면 점수가 떨어지는 것을 계산해서 G점을 넘으면 아이언 티어를 벗어난 것으로 해 "I AM IRONMAN!!" 을 출력한다.

🤔 생각해야할 점

  1. 게임 횟수 N, 플레이어 수 P, 이겼을 때의 점수 W, 졌을 때 점수 L, 아이언을 벗어나기 위한 점수 G

  2. 함께 플레이 했을 때 무조건 이기는 플레이어와 지는 플레이어의 이름과 이기는 지 지는 지 여부를 문자열로 입력 받는다.

    → 입력받은 W,L을 승점으로 바꿔서 맵에 저장

  3. 해킹으로 알아내지 못해 명단에 없는 플레이어를 만난 경우에도 진다.

  4. 그 후에 입력받은 플레이어들의 이름에 따라 승점을 계산하고 G를 넘으면 계산을 멈추고 "I AM IRONMAN!!" 를 출력한다.

    → 맵을 사용하면 해킹으로 얻은 플레이어들의 이름과 이기는지 지는 지 여부를 쉽게 저장할 수 있다.

  • 코드 설명

✅ 게임 횟수 N, 플레이어 수 P, 이겼을 때의 점수 W, 졌을 때 점수 L, 아이언을 벗어나기 위한 점수 G 입력

	int N,P,W,L,G;
  int score = 0;
  cin >> N >> P;
  cin >> W >> L >> G;

✅ map<string,int> m; : 해킹으로 알아낸 플레이어 이름과 승패 점수를 저장할 맵 생성

✅ 해킹으로 알아낸 플레이어의 이름과 승패 여부를 문자열로 입력 받아 점수로 바꿔주고 맵에 저장한다.

// 플레이어 정보 (이름, W, L) 입력
    for(int i = 0; i < P ; i++) {
        string name, result;
        cin >> name >> result;
        
        if(result == "W") {
            m[name] = W;
        } else {
            m[name] = -L;
        }
    }

✅ 함께 경기를 하는 플레이어의 이름을 입력받고 맵에 있는 이름인지 검사해 점수를 매긴다. 맵에 있지 않은 이름이면 점수를 빼준다.

    // N번째 게임까지 진행
    for (int i = 0; i < N; i++) {
        string name;
        cin >> name;

        if (score >= G) { // 형동이의 점수가 G를 넘으면 게임 종료
            break;
        }
        if (score < 0)
            score = 0;

        // 이름이 있는 경우
        if (m.find(name) != m.end()) {
            score += m[name];
        } else { // 명단에 없는 이름
            if (score < L) {
                score = 0;
            } else {
                score -= L;
            }
        }
    }

🔴 중요한 점:
점수가 음수가 되지 않도록 0보다 작으면 0이 되도록 하는 조건문을 따로 추가해줘야한다.
명단에 이름이 있거나 없거나 음수가 되지 않아야하니까 반복문을 따로 적어준다.

✅ 점수가 G를 넘으면 "I AM NOT IRONMAN!!” 를 출력해준다.

if(score >= G){
    cout <<"I AM NOT IRONMAN!!" << endl;
}
else
    cout << "I AM IRONMAN!!" <<endl;

0개의 댓글