TIL
2024.05.01.수
Nellucia
2024. 5. 1. 20:04
붕대 감기
문제 설명
어떤 게임에는 붕대 감기라는 기술이 있습니다.붕대 감기는 t초 동안 붕대를 감으면서 1초마다 x만큼의 체력을 회복합니다. t초 연속으로 붕대를 감는 데 성공한다면 y만큼의 체력을 추가로 회복합니다. 게임 캐릭터에는 최대 체력이 존재해 현재 체력이 최대 체력보다 커지는 것은 불가능합니다.기술을 쓰는 도중 몬스터에게 공격을 당하면 기술이 취소되고, 공격을 당하는 순간에는 체력을 회복할 수 없습니다. 몬스터에게 공격당해 기술이 취소당하거나 기술이 끝나면 그 즉시 붕대 감기를 다시 사용하며, 연속 성공 시간이 0으로 초기화됩니다.몬스터의 공격을 받으면 정해진 피해량만큼 현재 체력이 줄어듭니다. 이때, 현재 체력이 0 이하가 되면 캐릭터가 죽으며 더 이상 체력을 회복할 수 없습니다.당신은 붕대감기 기술의 정보, 캐릭터가 가진 최대 체력과 몬스터의 공격 패턴이 주어질 때 캐릭터가 끝까지 생존할 수 있는지 궁금합니다.붕대 감기 기술의 시전 시간, 1초당 회복량, 추가 회복량을 담은 1차원 정수 배열 bandage와 최대 체력을 의미하는 정수 health, 몬스터의 공격 시간과 피해량을 담은 2차원 정수 배열 attacks가 매개변수로 주어집니다. 모든 공격이 끝난 직후 남은 체력을 return 하도록 solution 함수를 완성해 주세요. 만약 몬스터의 공격을 받고 캐릭터의 체력이 0 이하가 되어 죽는다면 -1을 return 해주세요.
원래 게임 프로그래밍은 익숙하다보니 문제가 맘에 들어서 바로 풀어봤다.
public class Solution {
public int solution(int[] bandage, int health, int[][] attacks) {
int answer = 0;
int currentHealth = health;
int attackIndex =0;
int healCount = 0;
for(int i=0;i<=attacks[attacks.length-1][0];i++){
if (i == attacks[attackIndex][0]) {
currentHealth -= attacks[attackIndex][1];
attackIndex++;
healCount =0;
if(currentHealth <= 0){
return -1;
}
if(attackIndex == attacks[attacks.length-1][0])
{
break;
}
continue;
}
if (currentHealth >= health) {
currentHealth = health;
continue;
}
currentHealth += bandage[1];
healCount++;
if (healCount >= bandage[0]) {
healCount =0;
currentHealth+=bandage[2];
}
}
answer = currentHealth;
return answer;
}
}
게임에 익숙한 사람이라면 생각보다 쉽게 풀 수 있는 문제 같다. 게임 관련 알고리즘은 뭔가 더 재밌어서 더 보고 싶다고 생각이 든다.
신고 결과 받기
문제설명
신입사원 무지는 게시판 불량 이용자를 신고하고 처리 결과를 메일로 발송하는 시스템을 개발하려 합니다. 무지가 개발하려는 시스템은 다음과 같습니다.
- 각 유저는 한 번에 한 명의 유저를 신고할 수 있습니다.신고 횟수에 제한은 없습니다.
- 서로 다른 유저를 계속해서 신고할 수 있습니다.한 유저를 여러 번 신고할 수도 있지만, 동일한 유저에 대한 신고 횟수는 1회로 처리됩니다.
- k번 이상 신고된 유저는 게시판 이용이 정지되며, 해당 유저를 신고한 모든 유저에게 정지 사실을 메일로 발송합니다.
- 유저가 신고한 모든 내용을 취합하여 마지막에 한꺼번에 게시판 이용 정지를 시키면서 정지 메일을 발송합니다.
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
class Solution {
public int[] solution(String[] id_list, String[] report, int k) {
int[] answer = new int[id_list.length];
Map<String, List<String>> reportMap = new HashMap<>();
Map<String, Integer> reportResult = new HashMap<>();
Map<String, Integer> answerResult = new HashMap<>();
for (var index : id_list) {
reportMap.put(index, new ArrayList<>());
reportResult.put(index, 0);
answerResult.put(index, 0);
}
for (var index : report) {
int blank = index.indexOf(" ");
String instigator = index.substring(0, blank);
String target = index.substring(blank + 1);
if (!reportMap.get(instigator).contains(target)) {
reportMap.get(instigator).add(target);
}
}
for (var key : reportMap.keySet()) {
for(var value : reportMap.get(key)) {
int count = reportResult.get(value) + 1;
reportResult.put(value,count);
}
}
for(var key : reportResult.keySet()) {
if (reportResult.get(key) >= k) {
// 유저 정지
for (var index : reportMap.keySet()) {
if(reportMap.get(index).contains(key)) {
answerResult.put(index,answerResult.get(index)+1);
}
}
}
}
int i =0;
for (var index : id_list) {
answer[i] = answerResult.get(index);
System.out.println(index+" : "+answer[i]);
i++;
}
return answer;
}
}
ArrayList를 썻는데 다른 사람들의 풀이를 보니 Set이 당연히 더 좋은 것 같다. Set을 별로 안쓰다보니 존재를 완전히 잊고 있었다. 괜히 Contains를 통해 한번 더 찾는 과정을 거쳤다.
Stream을 활용하면 더 간결하게 풀 수 있는 듯 하다. 내일 중으로 Java 강의는 다 끝내고 좀 더 익숙해 지도록 하자