Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- JPA
- 트랜잭샨
- 레디스 동시성
- gRPC
- BFS
- 누적합
- 이분탐색
- 구현
- 아키텍쳐 개선
- 검색어 추천
- 백준
- 카카오
- 셀러리
- 쿠키
- 결제서비스
- ipo 매매자동화
- docker
- piplining
- 프로그래머스
- jwt 표준
- next-stock
- ai agent
- 크롤링
- 몽고 인덱스
- langgraph
- 완전탐색
- 추천 검색 기능
- AWS
- 디버깅
- spring event
Archives
- Today
- Total
코딩관계론
[PCCP 기출문제] 1번 / 붕대 감기도움말 본문
반응형
1. 문제 이해하기
게임 속 "붉대 감기" 기술은 일정 시간 동안 체력을 회복하는 스킬입니다. 주요 규칙은 다음과 같습니다:
- 기본 회복: 매 1초마다 정해지는 양(x)만큼 체력을 회복합니다.
- 연속 성공 보너스: t초 동안 끊기지 않고 성공하면 추가 회복량(y)이 더합됩니다.
- 기술 취소: 목시터에게 공격받으면 붉대 감기가 즉시 취소되며, 공격받는 순간에는 회복을 할 수 없습니다.
- 체력 한계: 체력은 최대 체력을 넘어서 회복할 수 없습니다.
- 사망 조건: 체력이 0 이하로 떠나면 캐릭터가 죽습니다.
2. 문제 해결 방법
해결 해적은 목시터 공격 간격을 계산해서 그 사이에 체력을 얼마나 회복할 수 있는지를 구하는 것입니다.
현재 시간
과다음 공격 시간
사이에 회복할 수 있는 시간을 구합니다.- 회복 공식은 다음과 같습니다:
- `체력 = (다음 공격 시간 - 현재 시간 - 1) * 초당 회복치 + ((다음 공격 시간 - 현재 시간 - 1) / 연성 성공 시간) * 연속 성공 보너스
- 회복한 체력은 최대 체력을 넘어서는 안됩니다.
- 공격받을 때 체력이 0 이하로 떠나면
-1
을 반환합니다.
3. 코드 작성
초안 코드
const DIE = -1;
function solution(bandage, health, attacks) {
var answer = 0;
let latestHit = 0;
let maxHealth = health;
health -= attacks[0][1];
if (health <= 0) {
return DIE;
}
for (let i = 1; i < attacks.length; ++i) {
let [latestTiming, latestDamage] = attacks[i];
let [timing, damage] = attacks[i - 1];
let totalTime = latestTiming - timing - 1;
health += totalTime * bandage[1];
health += Math.floor(totalTime / bandage[0]) * bandage[2];
health = Math.min(maxHealth, health);
health -= latestDamage;
if (health <= 0) {
return DIE;
}
}
return health;
}
코드 리뷰
1. 먼저 배열의 인덱스 값들의 접근을 모두 변수명으로 바꿈으로써 매직 넘버를 제거했다
2. 또한 기존에는 0번째를 명시적으로 계산해줌으로써 추가적인 코드가 필요했지만, 현재 시간을 추가해줌으로써 해당 코드를 모두 제거하였다.
const DIE = -1;
function solution(bandage, health, attacks) {
var answer = 0;
let currentTime = 0;
let [castTime, healPerSecond, bonusHeal] = bandage;
let maxHealth = health
for(let [timeing, damage] of attacks){
recoverTime = timeing - currentTime - 1
health += recoverTime * healPerSecond
health += Math.floor(recoverTime / castTime) * bonusHeal
health = Math.min(health,maxHealth)
health -= damage
if(health <= 0){
return DIE
}
currentTime = timeing
}
return health;
}
4. 배우는 것 ✍️
이번 문제를 푸면서 다음것과 같은 내용을 새로 학습했습니다.
- JavaScript 배열 구조 분할 행사
- Python에서는
first, second = arr
로 작성했지만, JavaScript에서도[first, second] = arr
로 쉽게 사용할 수 있습니다.
// Python arr = [1, 2]; first, second = arr; // JavaScript let [first, second] = arr;
- Python에서는
반응형
'개발 > 알고리즘' 카테고리의 다른 글
[PCCP 기출문제] 1번 / 동영상 재생기 (0) | 2025.04.28 |
---|---|
[카카오] 두 큐 합 같게 만들기 (0) | 2024.08.23 |
[과제테스트] 게임 승률 조회하기(python) (0) | 2024.05.19 |
[백준]AC (0) | 2024.05.11 |
[백준] 암호 만들기 (0) | 2024.05.07 |