| 일 | 월 | 화 | 수 | 목 | 금 | 토 | 
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 | 
| 12 | 13 | 14 | 15 | 16 | 17 | 18 | 
| 19 | 20 | 21 | 22 | 23 | 24 | 25 | 
| 26 | 27 | 28 | 29 | 30 | 31 | 
                            Tags
                            
                        
                          
                          - Oracle 초기 사용자
- Oracle 사용자명 입력
- 오라클 캐릭터셋 조회
- Oracle 사용자명
- 무료 오라클 설치
- Oracle 18c HR
- Oracle 윈도우 설치
- oracle 18c
- Oracle 테이블 띄어쓰기
- ORA-12899
- Orace 18c
- Oracle Express Edition
- ora-01722
- Oracle 18c HR schema
- 비전공자를 위한 데이터베이스 입문
- 오라클 캐릭터셋 확인
- Oracle 테이블 대소문자
- 무료 오라클 데이터베이스
- Oracle 18c 설치
- 서평단
- 오라클 캐릭터셋 변경
- 윈도우 Oracle
- ORA-00922
- oracle
                            Archives
                            
                        
                          
                          - Today
- Total
The Nirsa Way
[프로그래머스 Lv1] PCCP 기출문제 1번 - 붕대감기(테스트14) 본문
반응형
    
    
    
  ※ 문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/250137
[프로그래머스 Lv1] PCCP 기출문제 1번 / 붕대감기(테스트14)
우선 전체적인 로직은 아래와 같은데, 테스트 케이스 14에서 실패가 한 개 발생했습니다.
class Solution {
    public int solution(int[] bandage, int health, int[][] attacks) {
        int time = 0; // 현재 시간
        int recoveryTime = 0; // 연속 회복 시간
        int maxHealth = health;
        int attackCount = 0; // 공격 시간 카운트 값
        int attackLength = 0; // 마지막 공격 확인용
        
        while(true) {
            if(attacks.length == attackLength) { //마지막 공격 확인
                return health;
            }
            
            if(time == attacks[attackCount][0]) { // 공격 시간일 때
                health -= attacks[attackCount][1]; // 현재체력 - 피해량
                if(health <= 0) {
                    return -1;
                }
                attackCount++; 
                attackLength++;  // 공격 길이 증가
                recoveryTime = 0; // 연속 회복 시간 초기화
            } else {  // 공격 시간이 아닐 때
            	recoveryTime++; // 연속 회복 시간 증가
                health += bandage[1]; // 체력 회복
                if (recoveryTime == bandage[0]) { // t초 연속 성공 시 추가 회복
                    health += bandage[2];
                }
                if(health > maxHealth) { // 현재 체력이 최대 체력보다 높을 경우 최대 체력으로 변경
                    health = maxHealth;
                }
            }
            time++; // 현재 시간 증가
        }
    }
}
테스트14 실패 이유
확인해가며 테스트하며 찾았는데, 테스트 14에서는 `시전 시간`이 2번 발생하는것으로 추측됩니다. 현재 코드에서는 `시전 시간`동안 회복을 성공하는 최초 1회에 한해서만 추가 회복을 할 수 있습니다.
1. 시전 시간 3, 공격 시간 7 일 경우 회복을 3번 성공할 경우 추가 회복
2. 시전 시간 6, 공격 시간 7 일 경우 추가 회복 불가
→ '시전에 성공한 시간 == 시전 시간' 으로 계산하기 때문에 2번의 경우 조건식이 성립되지 않음
→ 조건식이 6 == 3이 될 경우 false이기 때문
테스트 14의 경우 위와 같은 케이스로 추가 회복이 2번 연속 발생하는것으로 보이기 때문에 추가 회복이 성공할 경우 연속회복시간을 0으로 초기화 하여 테스트14를 통과했습니다. 아래 코드에서는 recoveryTime 변수를 0으로 초기화 했지만, recoveryTime % bandage[0] == 0 으로 배수를 확인하고 초기화를 생략해도 통과되었습니다.
if (recoveryTime == bandage[0]) {
    health += bandage[2];
    recoveryTime = 0;  // 회복 시간 초기화
}반응형
    
    
    
  '코딩 테스트 > 프로그래머스' 카테고리의 다른 글
| [프로그래머스 Lv1] 숫자 문자열과 영단어 (0) | 2023.12.16 | 
|---|---|
| [프로그래머스 Lv1] 푸드 파이트 대회 (0) | 2023.12.16 | 
| [프로그래머스 Lv1] 자연수 뒤집어 배열로 만들기 (0) | 2023.12.09 | 
| [프로그래머스] 문제 풀이할 때 사용한 메소드 정리 (계속 추가 예정) (0) | 2023.12.09 | 
| [프로그래머스 Lv1] PCCE 기출문제 10번 - 데이터분석 (1) | 2023.12.04 | 
