길민호(ethan.mino)
코딩수첩
길민호(ethan.mino)
전체 방문자
오늘
어제
  • 분류 전체보기 (215)
    • Computer Science (0)
    • Web (6)
      • CSS (0)
      • HTML (0)
    • Node.js (0)
    • Javascript (2)
    • Java (46)
      • Spring (27)
      • Jsp (0)
    • C\C++ (2)
    • Programming (0)
    • AI (0)
    • Database (7)
    • Git (5)
    • Algorithm (119)
      • Stack (0)
      • Queue (0)
      • Linked List (0)
      • Sort (0)
      • Simulation (27)
      • Recursion (0)
      • Backtracking (4)
      • Two Pointer (3)
      • Dynamic Programming (19)
      • Greedy (10)
      • Graph (3)
      • Dijkstra (1)
      • BFS\DFS (8)
      • Floyd (1)
      • MST (4)
      • Tree (4)
      • Binary Search (8)
      • Binary Search Tree (4)
    • IntelliJ (4)
    • Vscode (0)
    • Operating System (0)
    • 후기 (3)
    • 성장일지 (13)
    • 스터디 (7)
    • 설치 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • ㅡ

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
길민호(ethan.mino)

코딩수첩

Algorithm

[백준 11652번] 카드 (C++)

2022. 4. 12. 02:40

https://www.acmicpc.net/problem/11652

 

11652번: 카드

준규는 숫자 카드 N장을 가지고 있다. 숫자 카드에는 정수가 하나 적혀있는데, 적혀있는 수는 -262보다 크거나 같고, 262보다 작거나 같다. 준규가 가지고 있는 카드가 주어졌을 때, 가장 많이 가지

www.acmicpc.net


카드 문제는 수의 범위가 너무 넓기 때문에 빈도수 배열로는 해결할 수 없습니다. 먼저, 같은 수가 연속되도록 주어진 정수들을 정렬하고, 배열의 처음부터 각 수의 빈도수를 계산하여 최대 빈도수를 구하면 문제를 해결할 수 있습니다. 또한 수의 범위가 int형의 범위를 넘어가므로 long long형 배열을 선언해야합니다.

 

아래는 전체 코드입니다. 

#include <bits/stdc++.h>
using namespace std;

#define num first
#define freq second
long long arr[100000];

int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    int n; cin >> n;
    for(int i = 0; i < n; i++) cin >> arr[i];
    
    sort(arr, arr + n); // 배열 정렬
    pair<long long, int> m = {0, INT_MIN};  // 배열 내의 최대 빈도수와 해당 숫자를 저장하는 변수
    int start = 0; // 연속된 숫자들의 첫 idx를 나타내는 변수
    
    while(start < n){
        int cur = start;
        while(cur < n && arr[cur] == arr[start]) cur++; // start부터 다른 숫자가 나올 때까지 cur 증가
    
        // cur이 n이거나 arr[cur] != arr[start]인 경우
        // start ~ cur - 1은 같은 수
        int f = cur - (start + 1); // arr[start]의 빈도수
        if(m.freq < f) m = {arr[start], f}; // 빈도수가 더 클 때만 업데이트(같을 때는 작은 수가 출력되어야 함)
        start = cur;    // cur부터 다시 빈도수 체크
    }

    cout << m.num; 
}

'Algorithm' 카테고리의 다른 글

[백준 5648번] 역원소 정렬 (C++)  (0) 2022.04.12
[백준 1431번] 시리얼 번호 (C++)  (0) 2022.04.12
[백준 1541번] 잃어버린 괄호 (C++)  (0) 2022.04.07
[백준 11660번] 구간 합 구하기 5 (C++)  (0) 2022.04.07
[백준 5525번] IOIOI (C++)  (0) 2022.04.06
    'Algorithm' 카테고리의 다른 글
    • [백준 5648번] 역원소 정렬 (C++)
    • [백준 1431번] 시리얼 번호 (C++)
    • [백준 1541번] 잃어버린 괄호 (C++)
    • [백준 11660번] 구간 합 구하기 5 (C++)
    길민호(ethan.mino)
    길민호(ethan.mino)
    💻 호기심 많은 서버 개발자 길민호입니다.

    티스토리툴바