https://school.programmers.co.kr/learn/courses/30/lessons/250137
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
이런 구조가 짜짐
0초부터 몬스터가 공격을 끝낸 시점까지 순회하면서
체력을 마지막에 리턴할 것
도중에 체력이 0 이하면 즉시 return -1;
를 표현하면
이 문제는 탐라의 흐름에 따라 데이터의 상태를 파악하는게 접근하기 좋은 문제이므로
몬스터 데미지 들어오는 것만 하면 된다
지금 당장은 시전시간(bandage[0])이 뭔 의미가 있는지 이해가 안되긴 함 필요 없는 거 아닌가
작성하다 보니
최대 체력이 넘어서 체력이 차는 버그를 수정 함 (21~23라인)
체력을 채운 후에 그 체력수치가 최대체력을 넘어갈 경우 최대체력으로 치환
도중에 2중 포문 쓰고 break로 탈출했다가 j 가 업데이트 안돼서
2중 포문을 아예 없애버리고 j 의 값이 ++ 되도록 수동으로 작성
결과는
체력이 0 이하일 때는 -1을 리턴하면 2, 3번은 맞을꺼고
테스트4가 1차이가 나니까 좀 디테일을 봐야겠다
이제 보니 아까
시전시간(bandage[0])이 뭔 의미가 있는지 이해가 안됐었는데
if (success === bandage[2]) 의 조건이 아니라
if (success === bandage[0]) 으로 하고 (연속 공격 성공했을 때 기술의 시전이니까) 추가 회복량은 그대로 추가 해주면됨
예제 1번에서 bandage 가 5, 1, 5 여서 처음과 끝이 5로 같아서 착각함
그래서 불필요한 건 없다는 것
그리고 0초부터 시작할 필요 없고 1초부터 시작해도 된다
그리고! 성공 조건을 밑에 달게 아니라
이런식으로 체력회복하자 마자 바로 성공을 시켜줘야 기술발동이 제대로 됨
테스트케이스4가 실패하는 이유였다
이제 제출 하니까
반밖에 통과 못함
뭔가가 잘못됐는데 질문하기에서 반례를 찾아야겠다
질문하기 뒤져도 다 통과돼서 뭐지 하고 좀 살펴보다가
일반체력 회복할 때도 최대체력 초과해서 회복되는 경우가 있었다
function solution(bandage, health, attacks) {
let hp = health;
let success = 0;
let j = 0;
for (let i = 1; i <= attacks[attacks.length - 1][0]; i++) {
if (i === attacks[j][0]) {
hp -= attacks[j][1];
if (hp <= 0) return -1;
success = 0;
j++;
continue;
} else {
if (hp < health) {
hp += bandage[1];
if (hp > health) {
hp = health;
}
success++;
if (success === bandage[0]) {
hp += bandage[2];
if (hp > health) {
hp = health;
}
success = 0;
}
}
continue;
}
}
return hp;
}
'algorithm > 문제풀이' 카테고리의 다른 글
점프와 순간 이동 (0) | 2024.06.21 |
---|---|
달리기 경주 (0) | 2024.06.20 |
신고 결과 받기 (1) | 2024.06.20 |
연습문제 > 공원 산책 (0) | 2024.06.19 |
개인정보 수집 유효기간 (0) | 2024.06.12 |