[프로그래머스/C++ 문제 풀이] Lv. 1 - [PCCP 기출문제] 1번 / 붕대 감기

2024. 7. 9. 15:35·코딩테스트/프로그래머스 (Lv. 1)
목차
  1. 문제 설명
  2. 제한 사항
  3. 입출력 예
  4. 문제 풀이
  5. 정답 코드
728x90
반응형

문제 설명

어떤 게임에는 붕대 감기라는 기술이 있습니다.

붕대 감기는 t초 동안 붕대를 감으면서 1초마다 x만큼의 체력을 회복합니다. t초 연속으로 붕대를 감는 데 성공한다면 y만큼의 체력을 추가로 회복합니다. 게임 캐릭터에는 최대 체력이 존재해 현재 체력이 최대 체력보다 커지는 것은 불가능합니다.

기술을 쓰는 도중 몬스터에게 공격을 당하면 기술이 취소되고, 공격을 당하는 순간에는 체력을 회복할 수 없습니다. 몬스터에게 공격당해 기술이 취소당하거나 기술이 끝나면 그 즉시 붕대 감기를 다시 사용하며, 연속 성공 시간이 0으로 초기화됩니다.

몬스터의 공격을 받으면 정해진 피해량만큼 현재 체력이 줄어듭니다. 이때, 현재 체력이 0 이하가 되면 캐릭터가 죽으며 더 이상 체력을 회복할 수 없습니다.

당신은 붕대감기 기술의 정보, 캐릭터가 가진 최대 체력과 몬스터의 공격 패턴이 주어질 때 캐릭터가 끝까지 생존할 수 있는지 궁금합니다.

붕대 감기 기술의 시전 시간, 1초당 회복량, 추가 회복량을 담은 1차원 정수 배열 bandage와 최대 체력을 의미하는 정수 health, 몬스터의 공격 시간과 피해량을 담은 2차원 정수 배열 attacks가 매개변수로 주어집니다. 모든 공격이 끝난 직후 남은 체력을 return 하도록 solution 함수를 완성해 주세요. 만약 몬스터의 공격을 받고 캐릭터의 체력이 0 이하가 되어 죽는다면 -1을 return 해주세요.

제한 사항

  • bandage는 [시전 시간, 초당 회복량, 추가 회복량] 형태의 길이가 3인 정수 배열입니다.
    • 1 ≤ 시전 시간 = t ≤ 50
    • 1 ≤ 초당 회복량 = x ≤ 100
    • 1 ≤ 추가 회복량 = y ≤ 100
  • 1 ≤ health ≤ 1,000
  • 1 ≤ attacks의 길이 ≤ 100
    • attacks[i]는 [공격 시간, 피해량] 형태의 길이가 2인 정수 배열입니다.
    • attacks는 공격 시간을 기준으로 오름차순 정렬된 상태입니다.
    • attacks의 공격 시간은 모두 다릅니다.
    • 1 ≤ 공격 시간 ≤ 1,000
    • 1 ≤ 피해량 ≤ 100

입출력 예

bandage health attacks result
[5, 1, 5] 30 [[2, 10], [9, 15], [10, 5], [11, 5]] 5
[3, 2, 7] 20 [[1, 15], [5, 16], [8, 6]] -1
[4, 2, 7] 20 [[1, 15], [5, 16], [8, 6]] -1
[1, 1, 1] 5 [[1, 2], [3, 2]] 3

 

입출력 예 #1

몬스터의 마지막 공격은 11초에 이루어집니다. 0초부터 11초까지 캐릭터의 상태는 아래 표와 같습니다.

 

몬스터의 마지막 공격 직후 캐릭터의 체력은 5입니다. 따라서 5을 return 해야 합니다.

 

입출력 예 #2

몬스터의 마지막 공격은 8초에 이루어집니다. 0초부터 8초까지 캐릭터의 상태는 아래 표와 같습니다.

 

몬스터의 공격을 받아 캐릭터의 체력이 0 이하가 됩니다. 따라서 -1을 return 해야 합니다.

 

입출력 예 #3

몬스터의 마지막 공격은 8초에 이루어집니다. 0초부터 5초까지 캐릭터의 상태는 아래 표와 같습니다.

 

몬스터의 공격을 받아 캐릭터의 체력이 0 이하가 됩니다. 따라서 -1을 return 해야 합니다.

 

입출력 예 #4

몬스터의 마지막 공격은 3초에 이루어집니다. 0초부터 3초까지 캐릭터의 상태는 아래 표와 같습니다.

 

몬스터의 마지막 공격 직후 캐릭터의 체력은 3입니다. 따라서 3을 return 해야 합니다.


문제 풀이

이번 문제는 간단한 구현 문제입니다.

매 초마다 플레이어는 공격을 받거나 회복을 하며, 전체 공격이 끝났을 때 플레이어가 살아있는지, 체력은 얼마나 남았는지를 체크해주면 되는 문제입니다.

 

몬스터의 공격을 받은 초에는 어떠한 회복도 진행 불가능하므로 1순위는 몬스터의 공격이 됩니다.

즉, 몬스터가 공격하는 경우 체력 감소 및 연속 성공 시간을 초기화하고 아닌 경우 회복 로직을 진행해주면 되는 문제였습니다.

정답 코드

더보기

풀이 시간 : 14m 5s

#include <string>
#include <vector>
#include <map>

using namespace std;

int solution(vector<int> bandage, int health, vector<vector<int>> attacks) {
    int answer = 0;

    // <공격 시간, 데미지> 타입을 저장하는 map 생성
    map<int, int> attack;
    for (int i = 0; i < attacks.size(); i++)
    {
        attack.insert(make_pair(attacks[i][0], attacks[i][1]));
    }

    // 최대 체력
    int mxHp = health;
    // 연속 성공 시간
    int successTime = 0;
    // 전체 시간 순회
    for (int i = 1; i <= attacks[attacks.size() - 1][0]; i++)
    {
        // 만약 몬스터가 공격하는 시간이라면?
        if (attack.find(i) != attack.end())
        {
            // 체력 감소
            health -= attack[i];
            // 연속 성공 시간 초기화
            successTime = 0;
        }
        // 만약 몬스터가 공격하지 않는다면?
        else
        {
            // 체력 회복(초당 회복량)
            health += bandage[1];
            // 연속 성공 시간 누적
            successTime++;
        }

        // 만약 체력이 0보다 작다면?
        if (health <= 0)
        {
            // 플레이어가 사망했으므로 -1을 저장하고 종료
            answer = -1;
            break;
        }

        // 만약 연속 성공 시간이 시전 시간과 동일하다면?
        if (successTime == bandage[0])
        {
            // 체력 회복
            health += bandage[2];
            // 연속 성공 시간 초기화
            successTime = 0;
        }

        // 최대 체력 체크
        if (health > mxHp) health = mxHp;

        // answer에 현재 체력 저장
        answer = health;
    }

    return answer;
}

 

728x90
반응형
저작자표시 비영리 변경금지 (새창열림)

'코딩테스트 > 프로그래머스 (Lv. 1)' 카테고리의 다른 글

[프로그래머스/C++ 문제 풀이] Lv. 1 - 달리기 경주  (0) 2024.07.10
[프로그래머스/C++ 문제 풀이] Lv. 1 - 개인정보 수집 유효기간  (0) 2024.07.10
[프로그래머스/C++ 문제 풀이] Lv. 1 - 공원 산책  (0) 2024.07.10
[프로그래머스/C++ 문제 풀이] Lv. 1 - 신고 결과 받기  (0) 2024.07.09
[프로그래머스/C++ 문제 풀이] Lv. 1 - 가장 많이 받은 선물  (0) 2024.07.08
  1. 문제 설명
  2. 제한 사항
  3. 입출력 예
  4. 문제 풀이
  5. 정답 코드
'코딩테스트/프로그래머스 (Lv. 1)' 카테고리의 다른 글
  • [프로그래머스/C++ 문제 풀이] Lv. 1 - 개인정보 수집 유효기간
  • [프로그래머스/C++ 문제 풀이] Lv. 1 - 공원 산책
  • [프로그래머스/C++ 문제 풀이] Lv. 1 - 신고 결과 받기
  • [프로그래머스/C++ 문제 풀이] Lv. 1 - 가장 많이 받은 선물
리태s
리태s
게임 클라이언트 프로그래머 직무를 준비하며 공부한 내용을 정리한 블로그입니다.
    반응형
    250x250
  • 리태s
    LeeTaes 공부노트
    리태s
  • 전체
    오늘
    어제
    • Home (165)
      • 프로젝트 (20)
        • Isaac 3D (5)
        • TimelessAdventure (13)
        • FruitsPuzzle (2)
      • Game Programming (25)
        • C# (8)
        • Unity Engine (6)
        • Unreal Engine (8)
        • UE_Multiplayer (3)
      • 코딩테스트 (111)
        • 프로그래머스 (Lv. 0) (27)
        • 프로그래머스 (Lv. 1) (31)
        • 프로그래머스 (Lv. 2) (21)
        • 백준 (Study) (29)
        • 알고리즘 (3)
      • CS지식 (7)
        • 운영체제 (7)
      • 일상 (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    fsoftobjectpath
    코딩테스트
    c#
    sesac
    ai controller
    fruitspuzzle
    CS지식
    2019 kakao
    Unreal Engine
    구현
    청년취업사관학교
    프로그래머스
    unrealengine
    백준
    2018 kakao
    dataasset
    2022 kakao
    issac3d
    Summer/Winter Coding
    project t.a develop
    후기
    timelessadventure
    Algorithm
    unity
    프로세스
    tsoftobjectptr
    pcce 기출문제
    프로젝트
    C++
    delegate
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
리태s
[프로그래머스/C++ 문제 풀이] Lv. 1 - [PCCP 기출문제] 1번 / 붕대 감기

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.