728x90

특별한 풀이까지는 아니고, 차근차근 풀어가는 과정을 담아보았습니다.

프로그래머스 답 제출 후에 보면

번뜩이는 풀이들도 있으니 한번쯤 보면서 이런 방법들도 있구나 찾아보면 좋을 것 같습니다.

 

문제는 아래와 같습니다.

 

문제 설명

어떤 게임에는 붕대 감기라는 기술이 있습니다. 붕대 감기는 t초 동안 붕대를 감으면서 1초마다 x만큼의 체력을 회복합니다. t초 연속으로 붕대를 감는 데 성공한다면 y만큼의 체력을 추가로 회복합니다. 게임 캐릭터에는 최대 체력이 존재해 현재 체력이 최대 체력보다 커지는 것은 불가능합니다. 기술을 쓰는 도중 몬스터에게 공격을 당하면 기술이 취소되고, 공격을 당하는 순간에는 체력을 회복할 수 없습니다. 몬스터에게 공격당해 기술이 취소당하거나 기술이 끝나면 그 즉시 붕대 감기를 다시 사용하며, 연속 성공 시간이 0으로 초기화됩니다. 몬스터의 공격을 받으면 정해진 피해량만큼 현재 체력이 줄어듭니다. 이때, 현재 체력이 0 이하가 되면 캐릭터가 죽으며 더 이상 체력을 회복할 수 없습니다. 당신은 붕대감기 기술의 정보, 캐릭터가 가진 최대 체력과 몬스터의 공격 패턴이 주어질 때 캐릭터가 끝까지 생존할 수 있는지 궁금합니다. 붕대 감기 기술의 시전 시간, 1초당 회복량, 추가 회복량을 담은 1차원 정수 배열 bandage와 최대 체력을 의미하는 정수 health, 몬스터의 공격 시간과 피해량을 담은 2차원 정수 배열 attacks가 매개변수로 주어집니다. 모든 공격이 끝난 직후 남은 체력을 return 하도solution 함수를 완성해 주세요. 만약 몬스터의 공격을 받고 캐릭터의 체력이 0 이하가 되어 죽는다면 -1을 return 해주세요.

 

풀이

1. 필요한 변수 정리

필요한 값들을 먼저 정리합니다. 주어진 값들을 통해서 쓰기 편하도록 정리해둡니다.

    const maxHealth = health;
    const [time, healPerSec, additionalHeal] = bandage;
    const attackTime = []; // 공격시기
    const attackDmg = []; // 공격 데미지
    var success = 0;		// 연속성공
    var attackCount = 0;	// n번째 공격

    attacks.forEach((item)=>{
        attackTime.push(item[0])
        attackDmg.push(item[1])
    })

 

2. 0초부터 하나씩 올라가는 루프 함수인 for 사용합니다

공격이 있을 때와 공격이 없을때를 나누어서 로직을 구성합니다.

공격이 있을때는 health가 0이 되거나 혹은 모든 공격이 끝났을 때 해당 for 문을 벗어납니다.

for(var i=0; i <= attackTime[attackTime.length-1]; i++){
        if(i === attackTime[attackCount]){
            health = health - attackDmg[attackCount];
            if(health <= 0) return -1
            if(attackCount === attackTime.length-1) break;
            attackCount++;
            success = 0;
        } else {
             success++;
            health = Math.min(health + healPerSec, maxHealth);
            if(success === time) {
                health = Math.min(health + additionalHeal, maxHealth);
                success = 0;
            }

        }
    }

 

그리고 health 값을 리턴해주면 끝납니다!!

 

저 같은 경우에는 중간에 전체 공격이 끝났을때 break 해주는 조건을 빼먹고 했더니,

테스트는 통과 하지만 제출 후 채점에서는 박살나더군요..

 

무튼, 특별하지는 않지만 머리속에 플로우를 그대로 편안하게 옮겨보았습니다.

번뜩이는 풀이들을 보고 공부도 필요하고, 이렇게 차분하게 흐름 따라서 짜는 연습도 좋은것 같습니다 :)

또 긴장하는 코테에서 번뜩이기 쉽지 않을 것 같기도ㅎ

728x90

+ Recent posts