문제 지문 #5
XX게임에선 캐릭터는 자신과 공격력이 같거나 자신보다 공격력이 작은 몬스터에게 이깁니다. 내가 가진 캐릭터가 최대 몬스터 몇 마리를 이길 수 있는지 구하려 합니다. 단, 한 캐릭터는 한 번만 싸울 수 있습니다.
예를 들어, 세 몬스터의 공격력이 각각 [1, 4, 3]이고, 내가 가진 두 캐릭터의 공격력이 각각 [1, 3]이라면 첫 번째 캐릭터는 첫 번째 몬스터와, 두 번째 캐릭터는 세 번째 몬스터와 싸워서 이길 수 있습니다. 따라서 이길 수 있는 몬스터 수는 최대 2마리입니다.
모든 몬스터의 공격력을 담은 배열 enemies, 내가 가진 모든 캐릭터의 공격력을 담은 배열 armies가 매개변수로 주어질 때, 내 캐릭터로는 최대 몬스터 몇 마리를 이길 수 있는지 return 하도록 solution 메서드를 작성해주세요.
매개변수 설명
모든 몬스터의 공격력을 담은 배열 enemies, 내가 가진 모든 캐릭터의 공격력을 담은 배열 armies가 solution 메서드의 매개변수로 주어집니다.
- 몬스터 수는 1마리 이상, 500마리 이하입니다.
- 각 몬스터의 공격력은 1 이상 100 이하입니다.
- 내가 가진 캐릭터 수는 1개 이상 500개 이하입니다.
- 각 캐릭터의 공격력은 1 이상 100 이하입니다.
return 값 설명
내가 가진 캐릭터로는 최대 몬스터 몇 마리를 이길 수 있는지 return 해주세요.
입출력 예
enemies | armies | return |
---|---|---|
[1, 4, 3] | [1, 3] | 2 |
[1, 1, 1] | [1, 2, 3, 4] | 3 |
입출력 예 설명
입출력 예 #1
문제에 나온 예와 같습니다.
입출력 예 #2
캐릭터를 어떻게 보내도 모든 몬스터를 이길 수 있습니다.
혼자 풀이
전체 코드를 작성하는 문제입니다. armies와 enemies 배열을 받아서 armies가 enemies를 최대 몇 마리까지 이길 수 있는지 찾는 문제입니다.
최대 이길 수 있는 수를 구하려면, armies의 각 캐릭터의 공격력과 enemies 캐릭터의 공격력 차이가 적게 효율적으로 이겨야 한다고 생각했습니다. 그래서 armies는 오름차순으로 enemies는 내림차순으로 정렬하여 armies의 공격력이 가장 작은 캐릭터가 이길 수 있는 가장 큰 enemies 캐릭터를 for문으로 순환하면서 찾았습니다.
Arrays.sort()의 내림차순은 기본 타입인 int에 대해서는 정렬이 안되므로 wrapper 클래스인 Integer로 변경했습니다.
// 다음과 같이 import를 사용할 수 있습니다.
import java.util.*;
class Main {
public int solution(int[] enemies, int[] armies) {
// 여기에 코드를 작성해주세요.
int answer = 0;
Integer[] enemiesInteger = new Integer[enemies.length];
//enemies 배열을 내림차순 정렬하기 위해 wrapper class로 변경합니다
for(int i=0;i<enemies.length;i++){
enemiesInteger[i]=enemies[i];
}
//enemies는 내림차순, armies는 오름차순 정렬합니다
Arrays.sort(enemiesInteger,Collections.reverseOrder());
Arrays.sort(armies);
//armies의 가장 약한 캐릭터로 이길수있는 가장 강한 캐릭터를 찾아서
//answer를 증가시키고, 해당 enemies 캐릭터는 0으로 처리함
for(int i=0;i<armies.length;i++){
for(int j=0;i<enemiesInteger.length;j++){
if(enemiesInteger[j]>0){
if(armies[i]>=enemiesInteger[j]){
answer++;
enemiesInteger[j]=0;
break;
}
}
}
}
return answer;
}
// 아래는 테스트케이스 출력을 해보기 위한 main 메소드입니다.
public static void main(String[] args) {
Main sol = new Main();
int[] enemies1 = {1, 4, 3};
int[] armies1 = {1, 3};
int ret1 = sol.solution(enemies1, armies1);
// [실행] 버튼을 누르면 출력 값을 볼 수 있습니다.
System.out.println("solution 메소드의 반환 값은 " + ret1 + " 입니다.");
int[] enemies2 = {1, 1, 1};
int[] armies2 = {1, 2, 3, 4};
int ret2 = sol.solution(enemies2, armies2);
// [실행] 버튼을 누르면 출력 값을 볼 수 있습니다.
System.out.println("solution 메소드의 반환 값은 " + ret2 + " 입니다.");
}
}
정답
정답에서는 두 배열을 모두 오름차순 정렬하여 순차 비교했는데요. 생각해보니, 내림차순으로 만들어서 비교하나, 오름차순으로 만들어서 비교하나, armies가 이길 수 있는 enemies의 캐릭터가 달라지더라도, enemies의 가장 약한 캐릭터를 이길 수 있는 가장 약한 armies 캐릭터를 찾으면 이기는 횟수 자체에는 변경이 없었습니다.
class Solution {
public int solution(int[] enemies, int[] armies) {
int answer = 0;
Arrays.sort(enemies);
Arrays.sort(armies);
int i = 0, j = 0;
while(i < enemies.length && j < armies.length) {
if(enemies[i] <= armies[j]) {
answer++;
i++;
j++;
} else {
j++;
}
}
return answer;
}
}
실습은 아래 참고
2022.10.25 - [Programming/Cos Pro 1급] - Cos Pro 1급 공부 사이트 추천 - 구름 에듀(https://edu.goorm.io/)
Cos Pro 1급 공부 사이트 추천 - 구름에듀(https://edu.goorm.io/)
구름 EDU??? YBM 공식 사이트에서 받은 문제 지문/문제 코드/정답 코드를 intellij에서 공부하다가 후배 추천으로 구름 에듀를 알게 되었습니다. 문제 지문 따로 문제 코드 따로 열어보는 게 여간 불
woogong80.tistory.com
'Programming > Cos Pro 1급' 카테고리의 다른 글
Cos Pro 1급 - 샘플 문제 5차 7번 - 그래프에서 사이클 찾기(Find-Union) (1) | 2022.11.14 |
---|---|
Cos Pro 1급 - 샘플 문제 5차 6번 - p진법 수를 q진법 수로 변환하기 (1) | 2022.11.13 |
Cos Pro 1급 - 샘플 문제 5차 4번 - 숫자 갯수 세기(String.valueOf) (1) | 2022.11.12 |
Cos Pro 1급 - 샘플 문제 풀이 5차 3번 - 배열을 정렬하기 (2) | 2022.11.10 |
Cos Pro 1급 Java 시험 후기 (4) | 2022.11.09 |
댓글