πŸ”₯ PS(Problem Solving) πŸ”₯/BOJ

[BOJ] #13414 μˆ˜κ°•μ‹ μ²­

dar0m! 2020. 5. 2. 03:12
μ‹œκ°„ μ œν•œ λ©”λͺ¨λ¦¬ μ œν•œ μ •λ‹΅ λΉ„μœ¨
 1초  256MB 19.578%

 

 

13414번: μˆ˜κ°•μ‹ μ²­

μž…λ ₯ λ°μ΄ν„°λŠ” ν‘œμ€€ μž…λ ₯을 μ‚¬μš©ν•œλ‹€. μž…λ ₯은 1개의 ν…ŒμŠ€νŠΈ λ°μ΄ν„°λ‘œ κ΅¬μ„±λœλ‹€. μž…λ ₯의 첫 번째 μ€„μ—λŠ” κ³Όλͺ©μ˜ μˆ˜κ°• κ°€λŠ₯ 인원 K(1 ≤ K ≤ 100,000)와 학생듀이 λ²„νŠΌμ„ ν΄λ¦­ν•œ μˆœμ„œλ₯Ό κΈ°λ‘ν•œ λŒ€κΈ°λͺ©λ‘μ˜ 길이 L(1 ≤ L ≤ 500,000)이 μ£Όμ–΄μ§„λ‹€. 두 번째 쀄뢀터 L개의 μ€„μ—λŠ” μˆ˜κ°•μ‹ μ²­μ„ λ²„νŠΌμ„ ν΄λ¦­ν•œ ν•™μƒμ˜ ν•™λ²ˆμ΄ 클릭 μˆœμ„œλŒ€λ‘œ μ£Όμ–΄μ§„λ‹€. ν•™λ²ˆμ€ 8자리의 숫자둜 이루어져 μžˆλ‹€.

www.acmicpc.net

 

문제

 

μ‹œν–‰μ°©μ˜€

μ²˜μŒμ— 접근을 잘λͺ»ν•΄μ„œ 열라 많이 ν‹€λ¦Ό. λŸ°νƒ€μž„μ—λŸ¬λ„ λ‚¬μ—ˆκ³  λŸ°νƒ€μž„μ—λŸ¬ μž‘μœΌλ‹ˆ μ‹œκ°„μ΄ˆκ³Ό λ– μ„œ μ™„μ „ λ©˜λΆ•..

μž…λ ₯으둜 λ“€μ–΄μ˜¨ ν•™λ²ˆλ“€μ„ λ‹€λ₯Έ 배열에 μ €μž₯ν•˜μ§€ μ•Šκ³  λ‹¨μˆœ map으둜만 ν’€ 수 μžˆμ§€ μ•Šμ„κΉŒ μ‹Άμ–΄μ„œ map에 {ν•™λ²ˆ, μˆœμ„œ}λ₯Ό μ €μž₯ν–ˆκ³  κ·Έ 후에, keyκ°€ μ•„λ‹Œ value둜 μ •λ ¬ν•˜κ³  μ‹Άμ–΄μ„œ vector둜 λ³΅μ‚¬ν•˜κ³ , cmpν•¨μˆ˜ μ‚¬μš©ν•΄μ„œ μ •λ ¬ν•˜κ³ , 좜λ ₯ν•˜λŠ” λ°©μ‹μœΌλ‘œ ν–ˆμ—ˆλ‹€.

그런데 μ‹œκ°„μ΄ˆκ³Όκ°€ μ•ˆλ‚  것 κ°™μ•˜λŠ”λ° λ³΅μ‚¬ν•˜λŠ”λ° μ˜€λž˜κ±Έλ¦°κ±΄μ§€.. λ„λŒ€μ²΄ μ™œ μ‹œκ°„μ΄ˆκ³Ό λ‚¬λŠ”μ§€ 아직도 잘 λͺ¨λ₯΄κ² μ§€λ§Œ κ²°κ΅­ μ „λΆ€ μ§€μš°κ³  λ‹€μ‹œν’€μ—ˆλŠ”λ°, map을 valueκ°’μœΌλ‘œ μ •λ ¬ν•˜λŠ” 것보닀 μž…λ ₯λ°›μ•˜μ„ λ•Œ μž…λ ₯받은 ν•™λ²ˆλ“€μ„ 배열에 μ €μž₯ν•΄μ„œ 배열을 μ΄μš©ν•΄μ„œ ν’€ 수 μžˆμ—ˆλ‹€.

그리고 또 ν•˜λ‚˜ μ–΄λ €μ› λ˜ 점은 string을 μ“°μ§€ μ•Šκ³  intν˜•μœΌλ‘œ μž…λ ₯을 λ°›λ‹€λ³΄λ‹ˆ 0000000 이런 값은 0으둜 μΈμ‹λ˜μ–΄μ„œ 8자리λ₯Ό λ§žμΆ”κΈ° μœ„ν•˜μ—¬ 좜λ ₯ν˜•μ‹μ„ "%08d" μ΄λ ‡κ²Œ 썼닀. μ˜λ―ΈλŠ” 8자리 μ™Όμͺ½μ •렬이며 빈 곡간은 0으둜 μ±„μš°κ² λ‹€λŠ” μ˜λ―Έμ΄λ‹€. %08d ν˜•μ‹μ§€μ •μžλ₯Ό μ”€μœΌλ‘œμ¨ string을 μž…μΆœλ ₯을 μœ„ν•΄ μ‚¬μš©ν•΄μ•Όν•˜λŠ” μ•„λž˜ λ¬Έμž₯듀을 μ•ˆμ¨λ„ λΌμ„œ μ°Έ μ’‹μ•˜λ‹€.

ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

 

μ°Έκ³  링크 1. vector μ •λ ¬: vector cmp ν•¨μˆ˜ κ΄€λ ¨

 

How do I sort a vector of pairs based on the second element of the pair?

If I have a vector of pairs: std::vector<std::pair<int, int=""> > vec; Is there and easy way to sort the list in increasing order based on the second element of the pair? I know I can w...</std::pair<int,>

stackoverflow.com

μ°Έκ³  링크 2. 언어별 input method 비ꡐ: cin, cout μ“Έ λ•Œ μœ„μ˜ λ¬Έμž₯을 μ¨μ•Όν•˜λŠ” 이유

 

algospot.com :: μžμœ κ²Œμ‹œνŒ: 각 언어별 input method 비ꡐ

각 언어별 input method 비ꡐ 13개의 λŒ“κΈ€μ΄ μžˆμŠ΅λ‹ˆλ‹€.

algospot.com

μ½”λ“œ 일뢀

bool cmp(const p& a, const p& b) {
	return a.second < b.second;
}


// λ©”μΈν•¨μˆ˜
map<int, int> m;
...
// map 볡사
vector<p> v(m.begin(), m.end());
//sort(v.begin(), v.end(), cmp);

// c++14 μ—μ„œλŠ” autoλ₯Ό ν™œμš©ν•˜μ—¬ μ΄λ ‡κ²Œ μ •λ ¬ν•  μˆ˜λ„ μžˆλ‹€.
sort(v.begin(), v.end(), [](auto& left, auto& right) {
		return left.second < right.second;
});

...

 

ν•΄κ²°

key point, map을 ν™œμš©ν•΄μ„œ 각 학생이 μ΅œμ’…μ μœΌλ‘œ λͺ‡ 번째둜 λ“€μ–΄μ™”λŠ”μ§€ μ €μž₯ν•œλ‹€.
  1. ν•™λ²ˆμ„ key둜, λ“€μ–΄μ˜¨ μˆœμ„œλ₯Ό value둜 map을 κ΅¬μ„±ν•œλ‹€.
  2. μž…λ ₯받은 ν•™λ²ˆμ€ 또 λ‹€λ₯Έ int배열에 μˆœμ„œλŒ€λ‘œ μ €μž₯ν•œλ‹€.
  3. 1λΆ€ν„° λ§ˆμ§€λ§‰ μˆœμ„œκΉŒμ§€ μ°¨λ‘€λ‘œ λŒλ©΄μ„œ i번째둜 λ“€μ–΄μ˜¨ 학생이 mapμ—μ„œ μ €μž₯ν•œ μˆœμ„œμ™€ 같은지 νŒλ‹¨ν•˜μ—¬ κ°™μœΌλ©΄ 좜λ ₯ν•˜κ³  cntλ₯Ό μ¦κ°€μ‹œν‚¨λ‹€.
  4. cntκ°€ k와 κ°™μ•„μ§€λ©΄ kλͺ…κΉŒμ§€ λͺ¨λ‘ μ„ μ •λœ κ²ƒμ΄λ―€λ‘œ λ°˜λ³΅λ¬Έμ„ μ’…λ£Œν•œλ‹€.

 

μ½”λ“œ

λ©”λͺ¨λ¦¬ μ‹œκ°„
 13312 KB  472 ms
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
#include <algorithm>
#include <map>
using namespace std;
int k, l, arr[500005];
map<intint> m;
int main() {
    scanf("%d %d"&k, &l);
    string s;
    for (int i = 0; i < l; i++) {
        scanf("%d"&arr[i]);
        m[arr[i]] = i;
    }
    int cnt = 0;
    for (int i = 0; i < l; i++) {
        if (cnt >= k)break;
        if (m[arr[i]] == i) {
            printf("%08d\n", arr[i]);
            cnt++;
        }
    }
    
    return 0;
}
cs

 

ν›„κΈ°

처음 접근을 잘λͺ»ν•΄μ„œ 큰 μ½” λ‹€μΉœ 문제.. μžŠμ§€ μ•Šκ² μ–΄
그리고 이번 문제 λ˜ν•œ kλŒ€μ‹  μƒμˆ˜λ₯Ό μ¨μ„œ 많이 ν‹€λ ΈλŠ”λ°... λ§ˆμ§€λ§‰ μ‹€μˆ˜μ΄κΈΈ