-
[알고리즘] 프로그래머스 1단계 - 붕대감기Algorithm 2024. 4. 29. 15:29
프로그래머스 문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/250137
문제 설명
이 문제는 붕대배열과, 최대 체력, 공격 배열이 주어진다.
bandage라는 배열 [ 5, 1, 5 ]에 0번째는 5초라는 시간을 의미하고 이 5초를 다 채운경우 2번째 인자인 5를 추가 회복 점수를 받을 수 있다.
1번 인자의 숫자 1은 기본 1초당 회복 점수를 의미한다. 회복 도중 공격을 당하면 다시 1초부터 5초까지 기다려야 추가 회복 점수를 받을 수 있다.
health의 경우 시작하는 체력 점수이면서 최대가질수 있는 체력점수이고 이 이상 회복할 수 없다.
attacks 배열은 이중배열로 몬스터로 부터 공격을 당한 경우 받는 데미지로 [2, 10] 이 첫번째 이중 배열의 숫자 배열인 경우 시간이 2초일때 10 데미지를 받는다는 의미이다.
예시
bandage
[5, 1, 5]
health
30
attacks
[[2, 10], [9, 15], [10, 5], [11, 5]]
result
5public class Main { public static void main(String[] args) { System.out.println(solution(new int[]{5, 1, 5}, 30, new int[][]{{2, 10}, {9, 15}, {10, 5}, {11, 5}})); } static int solution(int[] bandage, int health, int[][] attacks) { // 공격 배열 인덱스 int attackIdx = 0; // 회복 누적 인덱스 int healthIdx = 1; // 보너스 받는 주기 int time = bandage[0]; // 기본 회복 점수 int plusHealth = bandage[1]; // 추가 회복 점수 int bonusHealth = bandage[2]; // 마지막 공격 인덱스 int lastIdx = attacks[attacks.length - 1][0]; // 현재 남은 체력 int curHealth = health; for (int i = 1; i <= lastIdx; i++) { // 공격 받은 경우 if (i == attacks[attackIdx][0]) { curHealth -= attacks[attackIdx][1]; attackIdx++; healthIdx = 0; // 회복 시간을 모두 채운 경우 추가 점수 } else if (healthIdx == time) { curHealth += bonusHealth + plusHealth; healthIdx = 0; } else { curHealth += plusHealth; } // 체력이 0이하인 경우 -1 리턴 if (curHealth <= 0) { return -1; } // 체력의 최대치는 넘을 수 없다. if (curHealth > health) { curHealth = health; } healthIdx++; } return curHealth; } }
풀고 다른분들의 풀이를 봤는데 마지막 배열의 시간초를 알필요가 없이 바로 foreach문을 사용하면서 이전 배열의 공격당한 시간 초를 현재 공격한 시간을 빼서 회복 점수를 계산하는 방식을 봤다. 그 코드가 간결하고 이해하기 쉬웠다. 프로그래머스는 다양한 풀이 방식이 공개 되서 배울점이 많다.
'Algorithm' 카테고리의 다른 글
[알고리즘] 프로그래머스 1단계 - 수박수박수박수박수박수? (2) 2024.05.01 [알고리즘] 프로그래머스 1단계 - 공원 산책 (0) 2024.04.30 [알고리즘] 프로그래머스 2단계 - 메뉴 리뉴얼 (0) 2024.04.29 [알고리즘] 코딩 테스트 합격자 되기 - 해시, 트리 (0) 2024.04.26