Plite
전자오락 공방
Plite
전체 방문자
오늘
어제
  • 분류 전체보기 (274)
    • 프로젝트 (18)
      • 완성 프로젝트 (3)
      • 프로젝트 진행 내역 (15)
    • 공부 및 정리 (241)
      • 백준 코드 (222)
      • C++ (8)
      • DirectX (2)
      • Unreal Engine (6)
      • 프로그래밍 패턴 (3)
    • 기타 (12)
      • 기타 주저리 (10)
    • 게임과 취미 (1)
    • 대문 (1)

블로그 메뉴

  • 홈
  • 프로젝트
  • 취미, 일상
  • 백준 프로필

공지사항

  • [Read Me]
  • 제 블로그에 방문하신 것을 환영합니다.

인기 글

태그

  • 백준
  • 최소 스패닝 트리
  • 분할정복
  • 백트래킹
  • 이분탐색
  • 조합론
  • 정수론
  • 그래프
  • 투포인터
  • 기하
  • 스택
  • 브루트포스
  • 수학
  • 문자열
  • 큐
  • KMP
  • 트리
  • 세그먼트 트리
  • LCA
  • 구현
  • 정렬
  • 동적계획법
  • C++
  • SCC
  • 유니온 파인드
  • UC++
  • 우선순위큐
  • 위상 정렬
  • 트라이
  • 누적합

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Plite
공부 및 정리/백준 코드

[C++]백준 - 10816번 문제

[C++]백준 - 10816번 문제
공부 및 정리/백준 코드

[C++]백준 - 10816번 문제

2021. 6. 23. 21:36

10816번: 숫자 카드 2 (acmicpc.net)

 

10816번: 숫자 카드 2

첫째 줄에 상근이가 가지고 있는 숫자 카드의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 숫자 카드에 적혀있는 정수가 주어진다. 숫자 카드에 적혀있는 수는 -10,000,000보다 크거나 같고, 10,

www.acmicpc.net

 

10816번 : 숫자 카드 2


숫자 카드는 정수 하나가 적혀져 있는 카드이다. 상근이는 숫자 카드 N개를 가지고 있다. 정수 M개가 주어졌을 때, 이 수가 적혀있는 숫자 카드를 상근이가 몇 개 가지고 있는지 구하는 프로그램을 작성하시오.

 

입력


첫째 줄에 상근이가 가지고 있는 숫자 카드의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 숫자 카드에 적혀있는 정수가 주어진다. 숫자 카드에 적혀있는 수는 -10,000,000보다 크거나 같고, 10,000,000보다 작거나 같다.

셋째 줄에는 M(1 ≤ M ≤ 500,000)이 주어진다. 넷째 줄에는 상근이가 몇 개 가지고 있는 숫자 카드인지 구해야 할 M개의 정수가 주어지며, 이 수는 공백으로 구분되어져 있다. 이 수도 -10,000,000보다 크거나 같고, 10,000,000보다 작거나 같다.

 

 

출력


첫째 줄에 입력으로 주어진 M개의 수에 대해서, 각 수가 적힌 숫자 카드를 상근이가 몇 개 가지고 있는지를 공백으로 구분해 출력한다.

 

 

 


 

생각해 볼 점


파이썬이나 자바스크립트 등이라면, dictionary 타입을 사용하면 간단하게 풀 수 있을 것입니다.

 

저는 C++이므로 map 라이브러리를 사용해 풀었습니다.

 

해당 문제의 분류는 "이분 탐색"이지만, 해시의 find 메서드가 속도가 크게 느리지는 않은 것으로 알고 있으므로, 그냥 map 구조를 사용해 풀었습니다.

 

만약, 이분 탐색을 구현하려면 vector 등의 자료구조에 pair 형태로 숫자와 개수를 저장하여 정렬 후 풀면 될 것 같습니다.

 

코드


#include <iostream>
#include <map>
using namespace std;

int main() {
	int N, M;
	scanf("%d", &N);
	map<int, int> hash;		//딕셔너리 <숫자, 갯수>
	
	for(int i = 0; i < N; i++)
	{
	    int input;
	    scanf("%d", &input);
	    map<int, int>::iterator it = hash.find(input);
	    if(it == hash.end()) hash.insert(make_pair(input, 1));	//없으면 <input, 1> 추가
	    else it->second++;	//있으면 개수 증가
	}
	
	scanf("%d", &M);
	for(int i = 0; i < M; i++)
	{
	    int target;
	    scanf("%d", &target);
	    
	    map<int, int>::iterator it = hash.find(target);
	    if(it == hash.end()) printf("0 ");
	    else printf("%d ", it->second);
	}
	return 0;
}

 

그 외


반복문 내부에서 출력이 일어나는 경우 cin, cout의 출력 시간에 유의하는 것이 좋습니다.

'공부 및 정리 > 백준 코드' 카테고리의 다른 글

[C++]백준 - 2630번 문제  (0) 2021.06.23
[C++]백준 - 2565번 문제  (0) 2021.06.23
[C++]백준 - 11054번 문제  (0) 2021.06.23
[C++]백준 - 11053번 문제  (0) 2021.06.18
[C++]백준 - 2156번 문제  (0) 2021.06.18
  • 10816번 : 숫자 카드 2
  • 입력
  • 출력
  • 생각해 볼 점
  • 코드
  • 그 외
'공부 및 정리/백준 코드' 카테고리의 다른 글
  • [C++]백준 - 2630번 문제
  • [C++]백준 - 2565번 문제
  • [C++]백준 - 11054번 문제
  • [C++]백준 - 11053번 문제
Plite
Plite
개발 일지, 게임 이야기 등을 적어두는 공간입니다.

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.