728x90
반응형
SMALL
프로그래머스 문제 풀이: [PCCP 기출문제] 1번 - 붕대 감기
문제 링크: 문제 보기
문제 설명:
플레이어가 공격과 치료를 번갈아 가며 진행되는 상황에서, 일정 시간 동안 체력이 유지될 수 있는지, 최종 체력을 반환하는 문제입니다. 붕대의 사용 조건과 공격 타이밍 및 데미지를 고려하여 체력을 계산해야 합니다.
문제 해결 코드
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int attackTime[1001]; // 공격 발생 여부
int attackDamage[1001]; // 공격 데미지
int solution(vector<int> bandage, int health, vector<vector<int>> attacks) {
int r = attacks.size();
// 공격 정보 저장
for (int i = 0; i < r; i++) {
attackTime[attacks[i][0]] = 1;
attackDamage[attacks[i][0]] = attacks[i][1];
}
// 변수 초기화
int t = attacks[attacks.size() - 1][0]; // 마지막 공격 시간
int bandTime = bandage[0]; // 연속 치료 조건
int timeHeal = bandage[1]; // 매 초당 회복량
int addHeal = bandage[2]; // 추가 회복량
int h = health; // 현재 체력
int seqHeal = 0; // 연속 치료 시간 카운터
// 시간 순회
for (int i = 1; i <= t; i++) {
if (attackTime[i] == 1) { // 공격 발생
h -= attackDamage[i];
seqHeal = 0; // 연속 치료 초기화
if (h <= 0) return -1; // 체력 0 이하 -> 실패
} else { // 공격이 없을 때 회복
h += timeHeal;
if (h > health) h = health; // 최대 체력 초과 방지
seqHeal++;
if (seqHeal == bandTime) { // 연속 치료 조건 만족
seqHeal = 0;
h += addHeal;
if (h > health) h = health; // 최대 체력 초과 방지
}
}
}
return h; // 최종 체력 반환
}
코드 설명
- 핵심 알고리즘: 시간 순회를 통해 공격 및 치료를 관리합니다. 공격이 발생하면 체력을 감소시키고, 공격이 없는 동안에는 매 초당 회복량과 추가 회복량을 조건에 따라 적용합니다.
- 구현 세부사항:
- `attackTime` 배열은 공격이 발생한 시간을 기록합니다. 예를 들어, 공격이 5초에 발생하면 `attackTime[5] = 1`로 설정됩니다.
- `seqHeal`은 연속 치료 시간 카운터로, 일정 시간이 지나면 추가 회복량을 적용합니다.
- 공격이 발생하면 체력을 감소시키고, 연속 치료 상태를 초기화합니다. 체력이 0 이하로 떨어지면 즉시 실패로 종료합니다.
- 시간 복잡도 분석:
- 공격 정보 초기화: O(r), 여기서 r은 공격의 수
- 시간 순회: O(t), 여기서 t는 마지막 공격 시간
- 총 시간 복잡도: O(r + t)
결과
이 코드는 주어진 공격 정보와 붕대 조건을 정확히 계산하여 최종 체력을 반환합니다. 공격이 발생하는 시간과 회복 조건을 간단하고 효율적으로 처리합니다.
대체 접근 방식으로는 이벤트 기반 시뮬레이션을 활용해 특정 시간에서만 업데이트를 수행하는 방법도 고려할 수 있습니다. 이는 연속 시간이 길고 공격이 드문 경우 더 효율적일 수 있습니다.
728x90
반응형
LIST
'BAEKJOON > 구현' 카테고리의 다른 글
백준 2343번 [기타 레슨](C++) -yes6686- 티스토리 (0) | 2025.02.05 |
---|---|
백준 1347번 [미로 만들기](C++) -yes6686- 티스토리 (0) | 2025.01.30 |
백준 2115번 [갤러리](C++) -yes6686- 티스토리 (0) | 2025.01.26 |
백준 25501번 [재귀의 귀재](C++) -yes6686- 티스토리 (0) | 2025.01.18 |
백준 5622번 [다이얼](JAVA)-yes6686- 티스토리 (0) | 2025.01.15 |