1. ๋ฌธ์
bandage : {๊ธฐ์ ์ ์์ ์๊ฐ, 1์ด๋น ํ๋ณต๋,์ถ๊ฐ ํ๋ณต๋}
health : ์ต๋ ์ฒด๋ ฅ
attacks : {๋ชฌ์คํฐ์ ๊ณต๊ฒฉ ์๊ฐ, ํผํด๋}
Return : ๋ชจ๋ ๊ณต๊ฒฉ์ด ๋๋ ์งํ ๋จ์ ์ฒด๋ ฅ, ๋ง์ฝ ์ฒด๋ ฅ์ด 0 ์ดํ๋ฉด -1 ์ถ๋ ฅ
2. ์ฝ๋
#include <string>
#include <vector>
#include <iostream>
using namespace std;
/*
Return
- ๋ชจ๋ ๊ณต๊ฒฉ์ด ๋๋ ์งํ ๋จ์ ์ฒด๋ ฅ
- ๋ง์ฝ ์ฒด๋ ฅ์ด 0 ์ดํ๊ฐ ๋์ด ์ฃฝ์ผ๋ฉด -1
Rule
- ์ถ๊ฐ ํ๋ณต๋ : bandage
- ์ต๋ ์ฒด๋ ฅ : health
- ๋ชฌ์คํฐ์ ๊ณต๊ฒฉ ์๊ฐ๊ณผ ํผํด๋ : attacks
- t ์ด ๋์ 1์ด๋ง๋ค x ๋งํผ์ ์ฒด๋ ฅ ํ๋ณต
- t ์ด ์ฐ์์ผ๋ก ์ฑ๊ณตํ๋ฉด y๋งํผ ์ฒด๋ ฅ์ ์ถ๊ฐ๋ก ํ๋ณต
*/
void heal(int& healStat,int healValue,int healthMax){
healStat+=healValue;
if(healStat>healthMax) healStat = healthMax;
}
int solution(vector<int> bandage, int health, vector<vector<int>> attacks) {
int answer = health;
int endTime = attacks[attacks.size()-1][0];
int combo=0,attackIdx=0;
for(int i=0;i<=endTime;i++){
if(attacks[attackIdx][0]==i){
answer-=attacks[attackIdx][1];
combo=0;
attackIdx++;
}
else{
combo++;
heal(answer,bandage[1],health);
if(combo==bandage[0]){
//active combo
heal(answer,bandage[2],health);
combo=0;
}
}
if(answer<=0){
answer=-1;
break;
}
}
return answer;
}
3. ํด์ค
int endTime = attacks[attacks.size()-1][0];
int combo=0,attackIdx=0;
for(int i=0;i<=endTime;i++){
if(attacks[attackIdx][0]==i){
//cout<<"attackIdx: "<<attackIdx<<endl;
answer-=attacks[attackIdx][1];
combo=0;
attackIdx++;
}
else{
combo++;
heal(answer,bandage[1],health);
if(combo==bandage[0]){
//active combo
heal(answer,bandage[2],health);
combo=0;
}
}
if(answer<=0){
answer=-1;
break;
}
//cout<<"health: "<<health<<endl;
}
endTime ์ attacks ๋ฐฐ์ด์ ๋งจ ๋ง์ง๋ง ์ธ์์ ๊ณต๊ฒฉ ์๊ฐ์ ๋ฐ์์์ต๋๋ค.
attacks๋ ์๊ฐ์์ผ๋ก ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ์ด ๋์ด ์๊ธฐ ๋๋ฌธ์ ์ฌ์ ๋ ฌํ ํ์๊ฐ ์์ต๋๋ค.
๋ฐ์์จ ๋ง์ง๋ง ๊ณต๊ฒฉ ์๊ฐ๊น์ง ์ฒดํฌ๋ฅผ ํ๋ for๋ฌธ์ ์๋์ํต๋๋ค.
combo ๋ ์ฝค๋ณด๋ฅผ ๋ฐ์์ฌ ๋ณ์์ด๊ณ attackIdx๋ attacks ๊ณต๊ฒฉํ ๋ฐฐ์ด์ ์์๋ฅผ ์๋ฏธํฉ๋๋ค.
attackIdx๋ ๊ณต๊ฒฉ์ ๋ฐ์ ๋, ๋ค์ ์ธ์๋ก ๋์ด๊ฐ๋๋ก ์ค๊ณ๋์ด ์์ต๋๋ค.
if(attacks[attackIdx][0]==i)
์์ if๋ฌธ์ attackIdx ์์์ ๋ฐ๋ฅธ ๊ณต๊ฒฉ ์์๊ฐ i(์๊ฐ)๊ณผ ๊ฐ์์ง ์ฒดํฌ ํ๋ ๊ตฌ๋ฌธ์
๋๋ค.
๋ง์ฝ, attacks ๋ฐฐ์ด์ด {{1,5},{3,10}} ๋ก ์ด๋ฃจ์ด์ ธ ์๋ค๋ฉด
- ์๊ฐ 1์ผ ๋ 5๋ฅผ ๊ณต๊ฒฉํ๋ค.
- ์๊ฐ 3์ผ ๋ 10์ ๊ณต๊ฒฉํ๋ค.
์
๋๋ค.
๋ง์ฝ attackIdx ๊ฐ 0 ์ด๋ฉด, ์๊ฐ 1์ผ ๋ ๊ณต๊ฒฉ์ ์์ ํ๋ฉด ๋ฉ๋๋ค.
answer-=attacks[attackIdx][1];
combo=0;
attackIdx++;
๋ง์ฝ i(์๊ฐ)์ด ๋ง๋ค๋ฉด, ๊ณต๊ฒฉ์ด ์์ ๋ฉ๋๋ค.
๋ฐ๋ผ์ answer(ํ์ฌ ์ฒด๋ ฅ)์ attacks[attackIdx][1](ํผํด๋)๋งํผ ๊ฐ์์ํต๋๋ค.
์ฝค๋ณด๋ ๊นจ์ง๊ธฐ ๋๋ฌธ์ 0์ผ๋ก ๋ฐ๊พธ์ด์ค๋๋ค.
ํด๋น ๊ณต๊ฒฉ์ ๋ฐ๊ณ ๋์๋ ๋ค์ ๊ณต๊ฒฉ์ ์ฒดํฌํ ์ ์๋๋ก attackIdx๋ฅผ ์ฆ๊ฐ์์ผ์ค๋๋ค.
else{
combo++;
heal(answer,bandage[1],health);
if(combo==bandage[0]){
//active combo
heal(answer,bandage[2],health);
combo=0;
}
}
๋ง์ฝ ๊ณต๊ฒฉ์ ๋ฐ์ง ์๋๋ค๋ฉด ์น์ ๋ฅผ ํฉ๋๋ค.
์ฝค๋ณด์ ๊ฐฏ์๋ฅผ ๋๋ฆฌ๊ณ , ์น์ ๋ฅผ ํฉ๋๋ค.
void heal(int& healStat,int healValue,int healthMax){
healStat+=healValue;
if(healStat>healthMax) healStat = healthMax;
}
ํ์ healthMax(์ต๋ ์ฒด๋ ฅ)์ ๋์ด๊ฐ๋ฉด ๋ค์ ์กฐ์ ๋ฉ๋๋ค.
if(combo==bandage[0]){
//active combo
heal(answer,bandage[2],health);
combo=0;
}
๋ง์ฝ ์ฝค๋ณด๋ฅผ ๋ฌ์ฑํ๋ฉด ์ถ๊ฐ ์ฒด๋ ฅ์ด ์น์ ๋๋๋ก ์ค์ ํฉ๋๋ค.
if(answer<=0){
answer=-1;
break;
}
๋ง์ฝ ์ฒด๋ ฅ์ด 0์ดํ๊ฐ ๋๋ค๋ฉด for๋ฌธ์ ๋ฒ์ด๋๊ณ -1์ ์ถ๋ ฅํฉ๋๋ค.