프로그래머스 레벨1 폰켓몬을 풀어보았다.
당신은 폰켓몬을 잡기 위한 오랜 여행 끝에, 홍 박사님의 연구실에 도착했습니다. 홍 박사님은 당신에게 자신의 연구실에 있는 총 N 마리의 폰켓몬 중에서 N/2마리를 가져가도 좋다고 했습니다.
당신은 최대한 다양한 종류의 폰켓몬을 가지길 원하기 때문에, 최대한 많은 종류의 폰켓몬을 포함해서 N/2마리를 선택하려 합니다.
N마리 폰켓몬의 종류 번호가 담긴 배열 nums가 매개변수로 주어질 때, N/2마리의 폰켓몬을 선택하는 방법 중, 가장 많은 종류의 폰켓몬을 선택하는 방법을 찾아, 그때의 폰켓몬 종류 번호의 개수를 return 하도록 solution 함수를 완성해주세요.
종류를 조합한 수가 아닌 조합할 수 있는 최대종류가 몇 개
인지를 묻는질문이다!
문제를 보면서 이해했지만 푸는중간중간 잊어버렸던것 같다.
(문제를 꼼꼼히 읽고 기억해야한다!)
문제를 보면, 총 N마리의 폰켓몬 중에서 N/2마리를 가져와도 된다고 했다.
이 말은, 결과값이 최대 N/2가 된다는 뜻이다.
다시말해, 아래 두가지 방법으로 결과값이 결정된다는 말이다.
1) 조합할 수 있는 최대 종류의 수 >= N/2
종류의수가 N/2보다 크거나 같으면 결과값은 N/2
가 된다.
2) 조합할 수 있는 최대 종류의 수 < N/2
종류의 수가 N/2보다 작으면 결과값은 종류의 수
가 된다.
필자는 아래와 같은 순서로 구현하고자 했다.
① 최대 갯수(N/2)를 구한다.
② 종류를 담을 배열(comp)을 생성한다.(중복된 종류를 제외하고 종류별로 1개씩만을 가진다.)
③ 위 ②에서 생성한 배열에 동일한 종류가 있는지 확인하기 위한 변수를 생성한다.
④ 주어진 배열에서 하나씩 꺼내어 위 ②에서 생성한 배열에 있는지 확인한다.
⑤ 생성한 배열에 종류가 있다면 ③의 변수를 true로 바꾼다.
⑥ 생성한 배열에 종류가 없다면 배열에 종류를 추가한다.
⑦ 생성한 배열의 길이를 구한다.
⑧ 결과값 결정을 위해 위에서 말한 두가지방법을 이용하여 배열의 길이(종류의수)와 최대 갯수(N/2)를 비교한다.
이를 코드로 표현하면 아래와 같다.
import java.util.*;
class Solution {
public int solution(int[] nums) {
int answer = 0;
// 동일한 종류가 있는지 확인하기위한 check
boolean check = false;
// 최대 선택 갯수
int max = nums.length/2;
// 종류를 담을 ArrayList
ArrayList<Integer> comp = new ArrayList<Integer>();
// 주어진 배열값 하나씩 확인
for(int i = 0; i < nums.length; i++){
// comp 배열과 비교
for(int j = 0; j < comp.size(); j++){
if(comp.get(j) == nums[i]){
check = true;
}
}
//comp배열에 없으면 comp배열에 하나씩 추가
if(check == false){
comp.add(nums[i]);
}
check = false;
}
if(comp.size() >= max){
for(int c = 0; c < comp.size(); c++){
}
answer = max;
}else{
answer = comp.size();
}
return answer;
}
}
당연한 말이지만 문제이해가 정말 중요하다.
그 다음 어떤 방식으로 풀지 생각하고,
구현할때는 import java.util.*;
를 일단 적고 시작하는 습관을 들이자!