Hello Kitty Eyes Shut
๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ’ป ์ฝ”ํ…Œ/๐Ÿ“Œ JAVA

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค/JAVA] ๋ถ•๋Œ€ ๊ฐ๊ธฐ

๋ฐ˜์‘ํ˜•

 

 

 

๐Ÿ”— ๋ฌธ์ œ ๋ฐ”๋กœ๊ฐ€๊ธฐ

 

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์€ ๋งˆ์ง€๋ง‰ ๊ณต๊ฒฉ ์‹œ๊ฐ„)

๋ฐ˜์‘ํ˜•