KimMinJun
Coding Note
KimMinJun
전체 방문자
오늘
어제
  • 분류 전체보기 (486)
    • ALGORITHM (11)
      • 정렬 (6)
      • 최단경로 (1)
      • 자료구조 (1)
      • 슬라이딩 윈도우 (1)
      • etc (2)
    • Git (5)
    • Web (24)
      • Vanilla JS (13)
      • TS (2)
      • React (7)
      • ETC (1)
    • React 공식문서 (번역, 공부) (11)
      • Quick Start (2)
      • Installation (0)
      • Describing the UI (9)
      • Adding Interactivity (0)
      • Managing State (0)
      • Escape Hatches (0)
    • Next.js 공식문서 (번역, 공부) (3)
      • Getting Started (2)
      • Building Your Application (1)
    • PS (431)
      • 백준 (187)
      • Programmers (104)
      • CodeUp (21)
      • STL (3)
      • 제코베 JS 100제 (50)
      • SWEA (0)
      • LeetCode (65)
    • IT (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록
  • 관리

공지사항

인기 글

태그

  • string
  • recursion
  • Level 1
  • 그래프
  • Level1
  • Level 2
  • 제코베 JS 100제
  • js
  • 정렬
  • C++
  • C
  • LeetCode
  • Level 0
  • 수학
  • codeup
  • tree
  • programmers
  • 문자열
  • 다이나믹 프로그래밍
  • 백준

최근 댓글

최근 글

hELLO · Designed By 정상우.
KimMinJun

Coding Note

PS/Programmers

Programmers / Level 1 / 폰켓몬 / C++

2021. 11. 1. 00:22

문제 설명

당신은 폰켓몬을 잡기 위한 오랜 여행 끝에, 홍 박사님의 연구실에 도착했습니다.

홍 박사님은 당신에게 자신의 연구실에 있는 총 N 마리의 폰켓몬 중에서 N/2마리를 가져가도 좋다고 했습니다.
홍 박사님 연구실의 폰켓몬은 종류에 따라 번호를 붙여 구분합니다.

따라서 같은 종류의 폰켓몬은 같은 번호를 가지고 있습니다.

예를 들어 연구실에 총 4마리의 폰켓몬이 있고, 각 폰켓몬의 종류 번호가 [3번, 1번, 2번, 3번]이라면

이는 3번 폰켓몬 두 마리, 1번 폰켓몬 한 마리, 2번 폰켓몬 한 마리가 있음을 나타냅니다.

이때, 4마리의 폰켓몬 중 2마리를 고르는 방법은 다음과 같이 6가지가 있습니다.

  1. 첫 번째(3번), 두 번째(1번) 폰켓몬을 선택
  2. 첫 번째(3번), 세 번째(2번) 폰켓몬을 선택
  3. 첫 번째(3번), 네 번째(3번) 폰켓몬을 선택
  4. 두 번째(1번), 세 번째(2번) 폰켓몬을 선택
  5. 두 번째(1번), 네 번째(3번) 폰켓몬을 선택
  6. 세 번째(2번), 네 번째(3번) 폰켓몬을 선택

이때, 첫 번째(3번) 폰켓몬과 네 번째(3번) 폰켓몬을 선택하는 방법은

한 종류(3번 폰켓몬 두 마리)의 폰켓몬만 가질 수 있지만, 다른 방법들은 모두 두 종류의 폰켓몬을 가질 수 있습니다.

따라서 위 예시에서 가질 수 있는 폰켓몬 종류 수의 최댓값은 2가 됩니다.
당신은 최대한 다양한 종류의 폰켓몬을 가지길 원하기 때문에,

최대한 많은 종류의 폰켓몬을 포함해서 N/2마리를 선택하려 합니다.

N마리 폰켓몬의 종류 번호가 담긴 배열 nums가 매개변수로 주어질 때, N/2마리의 폰켓몬을 선택하는 방법 중,

가장 많은 종류의 폰켓몬을 선택하는 방법을 찾아, 그때의 폰켓몬 종류 번호의 개수를 return 하도록

solution 함수를 완성해주세요.

 

제한사항

  • nums는 폰켓몬의 종류 번호가 담긴 1차원 배열입니다.
  • nums의 길이(N)는 1 이상 10,000 이하의 자연수이며, 항상 짝수로 주어집니다.
  • 폰켓몬의 종류 번호는 1 이상 200,000 이하의 자연수로 나타냅니다.
  • 가장 많은 종류의 폰켓몬을 선택하는 방법이 여러 가지인 경우에도,
    선택할 수 있는 폰켓몬 종류 개수의 최댓값 하나만 return 하면 됩니다.

입출력 예

 

nums result
[3,1,2,3] 2
[3,3,3,2,2,4] 3
[3,3,3,2,2,2] 2

 

입출력 예 설명

 

입출력 예 #1
문제의 예시와 같습니다.

 

입출력 예 #2
6마리의 폰켓몬이 있으므로, 3마리의 폰켓몬을 골라야 합니다.
가장 많은 종류의 폰켓몬을 고르기 위해서는 3번 폰켓몬 한 마리, 2번 폰켓몬 한 마리, 4번 폰켓몬 한 마리를

고르면 되며, 따라서 3을 return 합니다.

 

입출력 예 #3
6마리의 폰켓몬이 있으므로, 3마리의 폰켓몬을 골라야 합니다.
가장 많은 종류의 폰켓몬을 고르기 위해서는 3번 폰켓몬 한 마리와 2번 폰켓몬 두 마리를 고르거나,

혹은 3번 폰켓몬 두 마리와 2번 폰켓몬 한 마리를 고르면 됩니다.

따라서 최대 고를 수 있는 폰켓몬 종류의 수는 2입니다.

 

// 내 풀이
#include <vector>
#include <algorithm>
using namespace std;

int solution(vector<int> nums)
{
    int answer = 1;
    sort(nums.begin(), nums.end());
    
    int n = nums[0];
    for(int i=0; i<nums.size(); i++) {
        if(nums[i] != n) {
            n = nums[i];
            answer++;
        }
        
        if(answer == (nums.size() / 2)) break;
    }
    
    return answer;
}
// 다른사람의 풀이
#include <bits/stdc++.h>
using namespace std;

int solution(vector<int> nums) {
    unordered_set<int> s(nums.begin(), nums.end());

    return min(nums.size() / 2, s.size());
}

먼저 내 풀이부터 설명하자면, 들어온 nums 벡터를 정렬시켜준다.

그리고 반복문을 돌면서 전에 있었던 수와 다르면 answer++를 해주면된다.

그리고 전체 갯수의 반밖에 가져가지 못하므로 answer이 전체의 반이되면 break를 걸어주고 리턴해주면 된다.

만약 반이 안되더라도 반복문 끝까지 돌면서 경우의 수를 세서 리턴한다.

 

다른사람의 풀이를 그 다음으로 살펴보자.

간단하고 깔끔하다.

unordered_set은 중복을 허용하지 않는다.

따라서 nums벡터의 처음부터 끝까지 unordered_set에 넣으면 중복은 자동으로 제거되므로 서로 다른 수들만 남는다.

따라서 set의 사이즈와 입력의 전체의 반과 비교해서 더 작은것을 return 해주면된다.

저작자표시 (새창열림)

'PS > Programmers' 카테고리의 다른 글

Programmers / Level 1 / 두 개 뽑아서 더하기 / C++  (0) 2021.11.04
Programmers / Level 1 / 약수의 개수와 덧셈 / C++  (0) 2021.11.04
Programmers / Level 1 / 체육복 / C++  (0) 2021.10.30
Programmers / Level 1 / 모의고사 / C++  (0) 2021.10.28
    'PS/Programmers' 카테고리의 다른 글
    • Programmers / Level 1 / 두 개 뽑아서 더하기 / C++
    • Programmers / Level 1 / 약수의 개수와 덧셈 / C++
    • Programmers / Level 1 / 체육복 / C++
    • Programmers / Level 1 / 모의고사 / C++
    KimMinJun
    KimMinJun

    티스토리툴바