๋ฐ์ํ
๐ ๋ฌธ์ ๋ฐ๋ก๊ฐ๊ธฐ
https://school.programmers.co.kr/learn/courses/30/lessons/250137
ํ๋ก๊ทธ๋๋จธ์ค
SW๊ฐ๋ฐ์๋ฅผ ์ํ ํ๊ฐ, ๊ต์ก์ Total Solution์ ์ ๊ณตํ๋ ๊ฐ๋ฐ์ ์ฑ์ฅ์ ์ํ ๋ฒ ์ด์ค์บ ํ
programmers.co.kr
๐ ๋ฌธ์ ์์ฝ

๐น๏ธ ๊ฒ์ ๊ท์น
- ์บ๋ฆญํฐ๋ ๋ถ๋ ๊ฐ๊ธฐ๋ผ๋ ๊ธฐ์ ์ ์จ์ ์ฒด๋ ฅ์ ํ๋ณตํ ์ ์๋ค.
- ๋ชฌ์คํฐ๊ฐ ํน์ ์๊ฐ์ ๋ด ์บ๋ฆญํฐ๋ฅผ ๊ณต๊ฒฉํด์ ์ฒด๋ ฅ์ ๊น๋๋ค.
- ์บ๋ฆญํฐ๊ฐ ์ฒด๋ ฅ์ด 0 ์ดํ๊ฐ ๋๋ฉด ์ฃฝ๋๋ค.
๐ฉน ๋ถ๋ ๊ฐ๊ธฐ๋
- ์์ ์๊ฐ(t) ๋์ ๋งค ์ด x๋งํผ ์ฒด๋ ฅ์ ํ๋ณตํ๋ค.
- t์ด ๋์ ํ ๋ฒ๋ ๊ณต๊ฒฉ์ ์ ๋นํ๊ณ ์ฑ๊ณตํ๋ฉด y๋งํผ ์ถ๊ฐ ํ๋ณตํ๋ค.
- ํ๋ณต ์ค ๊ณต๊ฒฉ์ ๋ฐ์ผ๋ฉด ํ๋ณต์ด ์ค๋จ๋๊ณ , ์ฑ๊ณต ์๊ฐ์ด 0์ผ๋ก ์ด๊ธฐํ๋๋ค.
- ์บ๋ฆญํฐ์ ์ฒด๋ ฅ์ ์ต๋ ์ฒด๋ ฅ์ ๋์ ์ ์๋ค.
๐ฏ ๋ชฉํ
- ๊ณต๊ฒฉ์ ๋ค ๋ง๊ณ ๋์๋ ์บ๋ฆญํฐ๊ฐ ์ด์ ์๋ค๋ฉด, ๋จ์ ์ฒด๋ ฅ์ return ํ๋ค.
- ๋์ค์ ์บ๋ฆญํฐ๊ฐ ์ฃฝ๋๋ค๋ฉด -1์ return ํ๋ค.
๐ฅ ์ ๋ ฅ
- bondage = [t, x, y]: ์์ ์๊ฐ, ์ด๋น ํ๋ณต๋, ์ถ๊ฐ ํ๋ณต๋์ ๋ด์ 1์ฐจ์ ๋ฐฐ์ด
- health: ์บ๋ฆญํฐ์ ์ต๋ ์ฒด๋ ฅ
- attacks: [๊ณต๊ฒฉ ์๊ฐ, ํผํด๋]์ด ๋ด๊ธด 2์ฐจ์ ๋ฐฐ์ด
๐ก ์์ด๋์ด
1๏ธโฃ ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง ์ ๋ณด๋ค ์ ๋ฆฌํด๋๊ธฐ
int max_health = health; // ์ต๋ ์ฒด๋ ฅ
int casting_time = bandage[0]; // ๋ถ๋ ๊ฐ๊ธฐ ์์ ์๊ฐ
int heal_per_sec = bandage[1]; // ์ด๋น ํ๋ณต๋
int bonus = bandage[2]; // ์ถ๊ฐ ํ๋ณต๋
int time = 0; // ํ์ฌ ์๊ฐ
int combo = 0; // ์ฐ์ ํ๋ณต ์ฑ๊ณต ์๊ฐ
int attack_idx = 0; // ํ์ฌ ๊ณต๊ฒฉ ์ธ๋ฑ์ค
int last_attack = attacks[attacks.length - 1][0]; // ๋ง์ง๋ง ๊ณต๊ฒฉ ์๊ฐ
2๏ธโฃ ๋ถ๋ ํ๋ณต์ ์๊ฐ ๋จ์๋ก ์งํํ๊ธฐ
for (int i = 0; i <= last_attack; i++) {
...
}
- ์ ์ฒด ์๊ฐ ํ๋ฆ์ 0์ด๋ถํฐ ๋ง์ง๋ง ๊ณต๊ฒฉ ์๊ฐ (last_attack)๊น์ง 1์ด ๋จ์๋ก ๋ฐ๋ณตํ๋ฉด์ ์ฒด๋ ฅ ๋ณํ๋ฅผ ๊ณ์ฐํ์๋ค.
- ์ค์ ๊ฒ์์ฒ๋ผ ์๊ฐ ์์ผ๋ก ๋งค์ด ์ฒด๋ ฅ ํ๋ณต๊ณผ ๊ณต๊ฒฉ ์ฌ๋ถ๋ฅผ ํ๋จ ํ ์์ ์ด๋ค.
3๏ธโฃ ๊ณต๊ฒฉ์ด ์๋ ์๊ฐ์๋ ์ฒด๋ ฅ์ ๊น๊ณ , ํ๋ณต ์ค๋จํ๊ธฐ
if(attack_idx < attacks.length && attacks[attack_idx][0] == i){
health -= attacks[attack_idx][1];
if(health <= 0){
return -1;
}
combo = 0;
attack_idx++;
}
- ๋ง์ฝ ๊ณต๊ฒฉ ์๊ฐ๊ณผ ํ์ฌ ์๊ฐ์ด ๊ฐ๋ค๋ฉด
- ์ฒด๋ ฅ์ ํผํด๋ ๋งํผ ๊น๊ณ ,
- ์ฆ์ ํ๋ณต์ ์ค๋จํ๋ฉฐ,
- ์ฐ์ ํ๋ณต ์นด์ดํธ(combo)๋ฅผ 0์ผ๋ก ์ด๊ธฐํํ๋ค.
- ์ด๋, ๋ง์ฝ ํ์ฌ ์ฒด๋ ฅ์ด 0 ์ดํ๊ฐ ๋๋ฉด ์ฆ์ ์ข ๋ฃํ๊ณ , -1์ return ํ๋ค.
4๏ธโฃ ๊ณต๊ฒฉ์ด ์๋ ์๊ฐ์๋ ํ๋ณต ๊ณ์ํ๊ธฐ
else{
combo++;
health += heal_per_sec;
if(combo == casting_time){
health += bonus;
combo = 0;
}
if(health > max_health){
health = max_health;
}
}
- ๋ง์ฝ ๊ณต๊ฒฉ ์๊ฐ๊ณผ ํ์ฌ ์๊ฐ์ด ๋ค๋ฅด๋ค๋ฉด
- ์ด๋น ํ๋ณต๋(heal_per_sec) ๋งํผ ์ฒด๋ ฅ์ ํ๋ณตํ๊ณ ,
- ์ฐ์ ํ๋ณต ์๊ฐ(combo)์ด ๋ถ๋ ๊ฐ๊ธฐ ์์ ์๊ฐ(casting_time)์ ๋๋ฌํ๋ฉด bonus ๋งํผ ์ถ๊ฐ ํ๋ณตํด์ค๋ค.
- ์ด๋, ํ์ฌ ์ฒด๋ ฅ์ด ์ต๋ ์ฒด๋ ฅ(max_health)์ ๋์ง ์๊ฒ ์ฒ๋ฆฌํด์ค๋ค.
๐ฉ๐ป๐ป ์ต์ข ์ฝ๋
class Solution {
public int solution(int[] bandage, int health, int[][] attacks) {
int max_health = health;
int casting_time = bandage[0];
int heal_per_sec = bandage[1];
int bonus = bandage[2];
int time = 0;
int combo = 0;
int attack_idx = 0;
int last_attack = attacks[attacks.length - 1][0];
for(int i = 0; i <= last_attack; i++){
if(attack_idx < attacks.length && attacks[attack_idx][0] == i){
health -= attacks[attack_idx][1];
if(health <= 0){
return -1;
}
combo = 0;
attack_idx++;
}
else{
combo++;
health += heal_per_sec;
if(combo == casting_time){
health += bonus;
combo = 0;
}
if(health > max_health){
health = max_health;
}
}
}
return health;
}
}
๐ ์๊ฐ ๋ณต์ก๋
๋ด ์ฝ๋๋ฅผ ๊ฐ๋จํ ๊ตฌ์กฐํํ๋ฉด ์๋์ ๊ฐ๋ค.
for (int i = 0; i <= last_attack; i++) {
if (๊ณต๊ฒฉ์ด ์๋ ์์ ์ธ๊ฐ?) {
๊ณต๊ฒฉ ์ฒ๋ฆฌ
} else {
ํ๋ณต ์ฒ๋ฆฌ
}
}
๋ฐ๋ผ์ ๋ฐ๋ณต์ ๋ฉ์ธ ๋ฃจํ์์๋ง ์กด์ฌํ๊ณ , ๋ฃจํ ๋ด์ ์ฐ์ฐ๋ค์ ์ ๋ถ O(1)์ด๋ค.
๐๐ป ์ฆ, ์๊ฐ ๋ณต์ก๋๋ O(n)์ด๋ค.
(์ด๋, n์ ๋ง์ง๋ง ๊ณต๊ฒฉ ์๊ฐ)
๋ฐ์ํ
'๐ป ์ฝํ > ๐ JAVA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [ํ๋ก๊ทธ๋๋จธ์ค/JAVA] ๋ฐ์ดํฐ ๋ถ์ (5) | 2025.08.09 |
|---|---|
| [ํ๋ก๊ทธ๋๋จธ์ค/JAVA] ์ด์ํ ์นธ (4) | 2025.08.04 |
| [ํ๋ก๊ทธ๋๋จธ์ค/JAVA] ๊ฐ์ฅ ๋ง์ด ๋ฐ์ ์ ๋ฌผ (4) | 2025.07.26 |
| [ํ๋ก๊ทธ๋๋จธ์ค/JAVA] ๊ณต์ (1) | 2025.07.23 |
| [ํ๋ก๊ทธ๋๋จธ์ค/JAVA] ์งํ ์ ๊ธฐ (0) | 2025.07.23 |