알고리즘

프로그래머스, 폰켓몬

giyoung2 2024. 7. 10. 18:47

 

 

 

 

 

 

자. 문제는 이렇습니다. 친숙한 소재 포켓몬이에요. 피카츄 화이팅

 

 

그리고 바로 위는 프로그래머스에서 문제와 함께 제공하는 기본 소스인데 여기에다가

추가를 하거나 수정을 하여서 문제에서 요구하는 답을 낼 수 있는 코드를 작성하시면 됩니다!

 

 

그러면 위의 코드에 대해서 간단하게 설명 및 리뷰를 해볼게요!

 

들어가서,

 

HashSet<Integer> set = new HashSet<>();

 

자바에서 많이들 사용하시는 HashSet과 HashMap 둘 중 하나인 HashSet을 사용하였는데

 

HashSet의 가장 큰 특징은 중복을 허용하지 않는다는 것.

 

HashSet에 대한 자세한 설명은 직접 찾아서 보시면 도움이 많이 될 겁니다.

 

위 코드의 특징 중 하나는 파라미터로 정수형 배열을 입력받는 것인데요

그래서 HashSet의 <>안에 Integer를 넣어줬습니다.

 

그러다가 for루프 안에서 if문이 나오는데 if문 안의 내용은 set과 nums 배열의 각 요소들을 인덱스 0부터 비교하면서 겹치지 않는 요소들을 꺼내서 set에 추가하는 코드입니다.

 

예를 들어

 

nums = {3, 1, 2, 3}을 입력받았고 요소의 개수는 4개 입니다. 그럼 set에는 같은 수의 중복을 허용하지 않으므로 {3, 1, 2}가 들어가게 되고 그러면 set의 요소 개수를 나타내는 set.size()는 3, nums.length는 4가 되겠습니다.

그러면 nums.length / 2 = 2가 되므로 4개의 요소 중에서 두 가지의 원소들을 뽑는

모든 경우의 수를 나열하면 되겠습니다.

 

ex) (3,1), (3,2), (3,3), (1,2), (1,3), (2,3) 이렇게 총 6가지 경우의 수가 생기게 됩니다. 이 중에서 서로 다른 포켓몬을 가질 수 있는 경우의 수는 (3,3)을 제외한 나머지 경우들은 서로 다른 두 수 이므로 return값은 2가되게 됩니다. (return의 반환값에 대해선 마지막에서 설명)

 

한 가지 예를 더 들어서,

 

nums = {3, 3, 3, 2, 2, 4}는 set.size()는 {3, 2, 4}이렇게 3이고 nums.length는 6이 됩니다.

nums.length / 2 = 3.

3마리의 포켓몬을 최대한 다른 종류로 뽑을 수 있는 경우는 {3, 2, 4}이렇게 되어서 return값은 3이 됩니다.

 

이제 이 내용을 바탕으로 코드를 작성해볼게요.

 

int answer = set.size() > nums.length/2 ? nums.length/2 : set.size();

 

이 문제의 핵심! 인데요

 

삼항 연산자를 사용하여 set.size()가 nums.length/2보다 크다면 nums.length/2를 반환하고, 아니라면 set.size()를 반환하는 코드입니다.

 

set.size()는 set안에 있는 요소들의 개수라고 생각하시면 되시고 위에서 들었던 예시 두 가지 그대로에 적용을 하시면 올바른 return값이 반환되게 됩니다 ~~