독학4 : 프로그래머스-붕대감기 (JAVA)

JSA·2024년 1월 9일

코딩테스트

목록 보기
3/16

1레벨 진입!

여태 2~3주간 프로그래머가 되기 위해 java를 공부하는 과정에서 프로그래머스 코딩테스트 0레벨 문제들을 계속 풀고 있습니다. 처음에는 많이 부족하여 0레벨도 처음엔 버거웠지만, 계속 하다보니 문제를 보면 이렇게 하면 될 것같다는 생각이 들고 직접 코드를 작성하고 실행해보면 점차 내가 성장하는게 느껴져 재미가 들려 0레벨 문제들을 계속적으로 풀었어요. 0레벨만 풀다보니 처음에 비해 성장세가 많이 더뎌지는 것 같아 1레벨을 도전해봤습니다!

일단 뛰어 들었는데.....
어렵네요;;
문제를 보고 어떻게 코드를 구성할까 하는데 머리가 꼬여서 생각을 멈추고 싶었어요.
2차원 배열을 보니 아직도 당황하는데 2차원 배열 공부를 좀 더 해야겠다는 생각이 들었습니다.

그러나 제가 푼 붕대감기 문제는 2차원 배열을 입력 받지만, 2차원 배열을 크게 활용할 만한 부분이 없어 머리를 많이 굴린 결과 첫 문제 맞혔어요!
일단, 문제를 보여주고 제가 작성한 코드를 올리겠습니다.

문제

문제
어떤 게임에는 붕대 감기라는 기술이 있습니다.

붕대 감기는 t초 동안 붕대를 감으면서 1초마다 x만큼의 체력을 회복합니다. t초 연속으로 붕대를 감는 데 성공한다면 y만큼의 체력을 추가로 회복합니다. 게임 캐릭터에는 최대 체력이 존재해 현재 체력이 최대 체력보다 커지는 것은 불가능합니다.

기술을 쓰는 도중 몬스터에게 공격을 당하면 기술이 취소되고, 공격을 당하는 순간에는 체력을 회복할 수 없습니다. 몬스터에게 공격당해 기술이 취소당하거나 기술이 끝나면 그 즉시 붕대 감기를 다시 사용하며, 연속 성공 시간이 0으로 초기화됩니다.

몬스터의 공격을 받으면 정해진 피해량만큼 현재 체력이 줄어듭니다. 이때, 현재 체력이 0 이하가 되면 캐릭터가 죽으며 더 이상 체력을 회복할 수 없습니다.

당신은 붕대감기 기술의 정보, 캐릭터가 가진 최대 체력과 몬스터의 공격 패턴이 주어질 때 캐릭터가 끝까지 생존할 수 있는지 궁금합니다.

붕대 감기 기술의 시전 시간, 1초당 회복량, 추가 회복량을 담은 1차원 정수 배열 bandage와 최대 체력을 의미하는 정수 health, 몬스터의 공격 시간과 피해량을 담은 2차원 정수 배열 attacks가 매개변수로 주어집니다. 모든 공격이 끝난 직후 남은 체력을 return 하도록 solution 함수를 완성해 주세요. 만약 몬스터의 공격을 받고 캐릭터의 체력이 0 이하가 되어 죽는다면 -1을 return 해주세요.

제한사항

bandage는 [시전 시간, 초당 회복량, 추가 회복량] 형태의 길이가 3인 정수 배열입니다.
1 ≤ 시전 시간 = t ≤ 50
1 ≤ 초당 회복량 = x ≤ 100
1 ≤ 추가 회복량 = y ≤ 100
1 ≤ health ≤ 1,000
1 ≤ attacks의 길이 ≤ 100
attacks[i]는 [공격 시간, 피해량] 형태의 길이가 2인 정수 배열입니다.
attacks는 공격 시간을 기준으로 오름차순 정렬된 상태입니다.
attacks의 공격 시간은 모두 다릅니다.
1 ≤ 공격 시간 ≤ 1,000
1 ≤ 피해량 ≤ 100

  • 문제 출처
    https://school.programmers.co.kr/learn/courses/30/lessons/250137 대충 게임에서 회복과 공격에 대한 로직? 같은 문제라 느꼈어요.
    제가 맘같아선 사진이 아니라 테이블로 만들어서 하고 싶은데 8시간 수업 듣고 씻고 오자마자 문제를 풀다 보니 여력이 없네요.

    코드

    class Solution {
       public int solution(int[] bandage, int health, int[][] attacks) { 
           int count = 0;
           int life = health;
           int attack = 0;
           for(int i =1 ; i<= attacks[attacks.length-1][0];i++){
               if(attacks[attack][0] == i){
                count = 0;
                   life=life-attacks[attack][1];
                   attack++;
                   if(life <=0)return -1;
               }else{
                   if(life<health){
                       life += bandage[1];
                       count +=1;
                       if(count == bandage[0]){
                           life+=bandage[2];
                           count = 0;
                       }
                   }
                   if(life >= health){life = health;}
               }
           
       }
           return life;
       }
    }
    몇번의 검사와 수정을 거치고 드디어!!
    맞췄습니다!

또 다른 분들 답변보면 아직 부족함이 항상 느껴지네요 그래서 더 열심히 하고자하는 마음을 갖게 됩니다. 처음 1레벨 진입하고 문제 맞춰서 기분좋게 쓴글인데 앞으론 이렇게 정성들여 일기처럼 쓸지는 모르겠습니다.
앞으로도 독학 기록을 계속 남기도록 할게요~

profile
ㅎㅇㅎㅇ

0개의 댓글