자. 문제는 이렇습니다. 친숙한 소재 포켓몬이에요. 피카츄 화이팅
그리고 바로 위는 프로그래머스에서 문제와 함께 제공하는 기본 소스인데 여기에다가
추가를 하거나 수정을 하여서 문제에서 요구하는 답을 낼 수 있는 코드를 작성하시면 됩니다!
그러면 위의 코드에 대해서 간단하게 설명 및 리뷰를 해볼게요!
들어가서,
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값이 반환되게 됩니다 ~~
끝
'알고리즘' 카테고리의 다른 글
LEETCODE, Minimum Number (0) | 2024.07.10 |
---|---|
LEETCODE, Valid Parenthesis (0) | 2024.07.10 |
프로그래머스, 같은 숫자는 싫어 (0) | 2024.07.10 |
프로그래머스, 완주하지 못한 선수 (0) | 2024.07.10 |
LEETCODE, Count Pairs Whose Sum is Less than Target (0) | 2024.07.10 |