프로그래머스 (PCCP 기출) | LV.1 붕대 감기 - 단순 구현 문풀 (Java)

728x90

⬛ 프로그래머스 (PCCP 기출) | LV.1 붕대 감기 - 단순 구현 문풀 (Java)

https://school.programmers.co.kr/learn/courses/30/lessons/250137

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제 설명
예제 설명


💚문제 접근 방식

공격 attacks[][] 배열은 오름차순 정렬되어 있다고 나와있다. 그 중 max 시간대를 알아야 마지막 time처리가 가능해서 마지막 값의 attaks[N][0]의 값을 maxTime으로 두고 for문으로 (t=1~maxTime)까지 순회시켰다. 그리고 for문으로 1번의 순회에서 모든 처리가 가능하도록 고민하면서 구현했다. 성공해서 다행이다.

 

1) attVal[]를 maxTime 크기로 선언했다.

이곳에는 0~최대 시간까지의 공격 값을 담아줄 거다. 0이면 공격이 없는 거고, 0이 아니면 공격이 있는 것으로 구분해줬다.

        //공격성을 전체 시간 배열에 담아둠
        int[] attVal = new int[maxTime + 1]; 
        
        for(int[] x : attacks){
            attVal[x[0]] = x[1]; //공격성 없으면 0일 거임
        }
  • 왜 ? attacks가 2차원 배열인데 매번 t초마다 for문으로 순회하면서 일치하는 공격 시간을 찾는 게 무의 미하다고 생각이 들었다. 물론 이 문제는 데이터 크기가 매우 크지는 않아서 그렇게 풀어도 될 거 같긴 했다. 그런데 그냥 이렇게 풀고 1차원 for 문 순회하면서 처리를 한꺼번에 하고 싶었다.

 

2) for문으로 1~ maxTime 까지 순회하면서 처리하는 로직은 다음과 같다.

   (1) 공격 attVal[t]가 0보다 크다면 (즉, 공격성 존재한다면) 공격성 처리

→ 단, 이 경우 연속 공격 = 0 처리 해주어야 하고, 현재 목숨값이 0 이하가 된다면 return -1 을 여기서 해준다.

→ 그리고 이 외의 케이스는 모두 처리 안해줘도 되므로 continue;

   (2) linked++ 처리 후 현재 목숨값에 초당 회복값 처리해준다.

→ 단, 이 경우 목숨값이 health를 넘어간다면 다시 cur = health를 갖도록 정정해주고 continue 박아준다.

→ 처음에 제출했을 때 continue 처리를 안해주고 연속 공격 성공해서 Y 값 보너스 주는 부분을 타서인지 한 개의 케이스가 통과 안됐다. cur 이 health 값을 넘길 수 없으므로 여기서 continue 주는 게 맞다.

   (3) 마지막으로 연속 공격이 bandage[0] 과 같아지면 보너스 회복 처리 후 연속 공격 리셋처리

3) 로직 모두 처리 후 현재의 회복값 반환 하면 정답 처리된다.

 

💚 제출 코드

import java.util.*;

class Solution {
    public int solution(int[] bandage, int health, int[][] attacks) {
        int N = attacks.length;
        int maxTime = attacks[N-1][0];//이게 최대 시간임 
        
        int T = bandage[0]; //연속 시전
        int X = bandage[1]; //시간당 ++
        int Y = bandage[2]; //연속T 보너스 ++ 
        
        int cur = health;
        int linked = 0;//연속
        //공격성을 전체 시간 배열에 담아둠
        int[] attVal = new int[maxTime + 1]; 
        
        for(int[] x : attacks){
            attVal[x[0]] = x[1]; //공격성 없으면 0일 거임
        }
        
        for(int t = 1; t <=maxTime; t++){
            linked++;  
            //공격성 처리 
            if(attVal[t] > 0) { //공격 바등면 
                linked = 0;//초기화
                cur -= attVal[t];
                if(cur <= 0) return -1;
                continue;
            }

            cur += X;
            if(cur > health) {
                cur = health;//정정해줌
                continue;
            }
            if(linked == T) {
                linked = 0;
                cur += Y;//보너스 처리받고
            }
        }

        return cur;
    }
}

 

하..................................................................................................................................................................................................................................................................................우울 max

728x90