Algorithm

[λ°±μ€€/C++] 13701. 쀑볡 제거

bba_dda 2021. 8. 3. 15:29
λ°˜μ‘ν˜•

문제

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

 

13701번: 쀑볡 제거

문제: N개의 μ •μˆ˜ A1, A2, ..., AN 을 읽고, 이듀 μ€‘μ—μ„œ λ°˜λ³΅λ˜λŠ” 수λ₯Ό μ œμ™Έν•˜κ³  남은 N'개의 수 B1, B2, ..., BN’ 을 μž…λ ₯된 μˆœμ„œλŒ€λ‘œ 좜λ ₯ν•˜μ‹œμ˜€. μ΄λ•Œ, 0 ≤ Ai < 225 = 33554432, i=1,2,…,N. μž…λ ₯의 개수 N은 1

www.acmicpc.net

N개의 μ •μˆ˜ A1, A2, ..., AN μ„ 읽고, 이듀 μ€‘μ—μ„œ λ°˜λ³΅λ˜λŠ” 수λ₯Ό μ œμ™Έν•˜κ³  남은 N'개의 수 B1, B2, ..., BN’ μ„ μž…λ ₯된 μˆœμ„œλŒ€λ‘œ 좜λ ₯ν•˜μ‹œμ˜€. μ΄λ•Œ,

  1. 0  Ai < 2^25 = 33554432, i=1,2,…,N.
  2. μž…λ ₯의 개수 N은 1 이상 500만 μ΄ν•˜μ΄λ‹€.

풀이

숫자λ₯Ό μˆœμ„œλŒ€λ‘œ μž…λ ₯λ°›μ•„μ„œ, 이전에 λ“€μ–΄μ˜¨μ μ΄ μ—†λŠ” 숫자면 좜λ ₯ν•˜λŠ” μ•„μ£Ό κ°„λ‹¨ν•΄λ³΄μ΄λŠ” λ¬Έμ œμ˜€μ§€λ§Œ, 

λ©”λͺ¨λ¦¬ μ΄ˆκ³Όκ°€ 이 문제의 ν•΅μ‹¬μ΄μ—ˆλ‹€. 

숫자의 λ²”μœ„κ°€ 2^25κΉŒμ§€μ˜€κΈ° λ•Œλ¬Έμ—, μ€‘λ³΅μ²΄ν¬ν•˜λŠ” λ°°μ—΄μ˜ 크기λ₯Ό 1<<2^25둜 작으면 이 문제의 λ©”λͺ¨λ¦¬ μ œν•œμΈ 8MBλ₯Ό λ„˜μ–΄λ²„λ¦¬κΈ° λ•Œλ¬Έμ΄λ‹€. 

 

λ”°λΌμ„œ, λΉ„νŠΈ 마슀크λ₯Ό μ΄μš©ν•΄μ•Ό ν•˜λŠ” λ¬Έμ œμ˜€λ‹€. ν’€μ΄λŠ” λ‹€λ₯Έ μ—¬λŸ¬ λΈ”λ‘œκ·Έλ“€μ„ μ°Έκ³ ν–ˆλ‹€! λ‹€λ“€ λΉ„μŠ·ν•œ λ°©μ‹μœΌλ‘œ 풀이λ₯Ό ν•œ 것 κ°™λ‹€.

 

intκ°€ 32λΉ„νŠΈλΌλŠ” 것이 핡심이닀. 

λ°°μ—΄μ˜ 크기λ₯Ό (1<<2^25) / 32둜 μ •ν•˜κ³ , μž…λ ₯된 숫자 A에 λŒ€ν•΄ 

A/32 : 인덱슀, 1<<(A%32) : κ°’ 으둜 λ„£μ–΄μ£Όλ©΄ λœλ‹€. 

 

μ²˜μŒμ—” 이게 λ¬΄μŠ¨λ§μΈμ§€ 이해가 μ•ˆλ˜μ—ˆμœΌλ‚˜ 그림을 κ·Έλ €λ³΄λ©΄μ„œ 이해할 수 μžˆμ—ˆλ‹€.

 

λ°°μ—΄ ν•œ 칸은 int이닀. 그리고 intλŠ” 32개의 λΉ„νŠΈλ‘œ ν‘œν˜„λœλ‹€. 

λ”°λΌμ„œ, 숫자λ₯Ό μž…λ ₯ν–ˆμ„ λ•Œ μ•„λž˜μ™€ 같은 κ²°κ³Όκ°€ λ‚˜νƒ€λ‚˜κ³  결둠적으둜 λΉ„νŠΈλ§ˆμŠ€ν‚Ήμ„ μ΄μš©ν•΄ λ°°μ—΄ ν•œ 칸에 32개의 숫자λ₯Ό ν‘œν˜„ν•¨μœΌλ‘œμ¨ λ©”λͺ¨λ¦¬λ₯Ό 32λ°° μ•„λ‚„ 수 μžˆλŠ” 것이닀. 

μ½”λ“œ

#include <iostream>

using namespace std;

int check[(1 << 25)/32];
int main() {
	ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
	int input;
	while (cin>>input){
		int idx = input / 32;
		int val = 1 << (input % 32);
		if (!(check[idx]&val)) {
			check[idx] += val;
			cout << input << " ";
		}
	}
	return 0;
}

κ²°κ³Ό

μ–Όλ§ˆμ „λΆ€ν„° cin,cout λŒ€μ‹ μ— scanf, printf둜 μž…μΆœλ ₯을 λŒ€μ‹ ν•˜κ³  μžˆλŠ”λ°, 

이번 λ¬Έμ œμ—μ„œλŠ” cin,cout이 μ‹œκ°„μ΄ 더 적게 κ±Έλ Έλ‹€. μ™œμ§€..? 

(맨 μ•„λž˜ : scanf,printf이용, μœ„μ— λ‘κ°œ : cin,cout이용)

 

 

λ°˜μ‘ν˜•