MAP 7

[프로그래머스] 신고 결과 받기 with C++

문제 설명 제한 사항 및 입출력 예제 개념 id_list에 포함된 사용자가 신고 결과 이메일을 얼마나 많이 받았는지 파악하는 문제다. 각 신고 처리 내역은 "신고자 신고할 사람"의 형식으로 제시된다. 단, 본 문제에서 핵심적인 고려 사항은 동일한 사용자에 대한 중복 신고가 단 한 번의 신고로만 처리된다는 점이다. 따라서, 동일한 대상에 대한 다수의 신고가 있더라도 이를 단일 신고로 간주하며, 이는 신고 결과 이메일의 수를 결정하는 데 중요한 요소가 된다는 점을 놓치면 안 된다. 따라서 map 자료구조를 활용하여 "신고자" "신고한 사람"의 형태의 쌍을 받아 처리할 수 있다. 각 신고자를 키로 설정하고, 신고한 사람을 값으로 설정한다. 동일한 신고자가 동일한 신고한 사람을 여러 번 신고하더라도, map 구..

[알고리즘] 분할 정복 - 맵리듀스

맵리듀스개요 지금까지 우리가 다룬 분할 정복은 주로 알고리즘 설계 패러다임으로 간주했다. 이번엔 이 방식을 일반 컴퓨팅 환경을 초월한 고성능 컴퓨터에 적용하는 방법에 대해 논의하려고 한다. 이러한 확장의 핵심에는 컴퓨터 클러스터(Cluster)라는 개념이 있다. 컴퓨팅 클러스터, 즉 복수의 컴퓨터를 네트워크로 연결하여 단일 시스템처럼 작동하게 하는 방식으로, 이를 통해 더 복잡하고 규모가 큰 문제를 효과적으로 해결할 수 있다.  하지만, 단순히 컴퓨팅 리소스를 확장하는 것만으로 대규모 데이터 처리에 필요한 세밀함과 효율성을 보장하긴 어렵다. 이러한 관점에서 맵리듀스(MapReduce)는 대용량 데이터를 효과적으로 처리할 수 있는 프로그래밍 모델이다. 맵리듀스는 컴퓨팅 클러스터를 활용해 거대한 양의 데이터..

CS/알고리즘 2023.05.20

[백준] 20920 영단어 암기는 괴로워 with C++

문제설명 입출력 예제 개념 주어진 문자열을 빈도수 → 길이순 → 알파벳 순으로 정렬하는 문제다. 자료구조 맵을 이용해 특정 길이 이상의 문자열을 빈도수와 함께 컨테이너에 저장한 후, 주어진 조건에 맞게 정렬하면 문제를 해결할 수 있다. 풀이 #include #include #include #include using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int N, M; string str; map m; cin >> N >> M; 영단어의 개수 N, 외울 단어의 길이 기준 M, 영단어 문자열 str, 단어를 저장할 컨테이너 m을 초기화한다. while (N--) { cin >> str; if (str.size(..

Algorithm/백준 2023.05.05

[백준] 2108 통계학 with C++

문제설명 입출력 예제 개념 다양한 수를 처리하는 문제다. 산술 평균, 중앙값, 범위는 간단하게 해결할 수 있지만, 최빈값을 처리하는 과정이 까다롭고, 시간 초과에 자주 걸리므로 알고리즘 최적화를 잘해야 한다. 풀이 #include #include #include #include #include using namespace std; int main() { int N, sum = 0; cin >> N; vector v(N); unordered_map freq; 수의 개수 N, 산술 평균을 계산하기 위한 sum, 중앙값과 범위를 계산하기 위한 벡터 v, 최빈값을 계산하기 위한 해시맵 freq를 초기화한다. for (int i = 0; i > v[i]; sum += v[i]; fr..

Algorithm/백준 2023.05.04

[백준] 26069 붙임성 좋은 총총이 with C++

문제설명 입출력 예제 개념 ChongChong과 만난 사람은 무지개 댄스를 추게 되므로, key로 아이디를 갖고 value로 무지개 댄스 여부를 확인할 수 있는 map 자료구조를 사용하면 쉽게 풀 수 있다. 즉, 문자열을 검사해 총총이를 만났으면 value값을 true로 바꾸면 된다. 풀이 #include #include using namespace std; int main() { int N, count = 0; cin >> N; map m; string str1, str2; 사람들이 만난 기록의 수 N, 무지개 댄스를 추는 사람의 수 count, 이러한 정보를 기록할 맵 자료구조 m, 사람들의 이름을 초기화할 문자열 str1, str2을 초기화한다. while (N--) { cin >> str1 >> ..

Algorithm/백준 2023.05.03

[백준] 10816 숫자 카드 2 with C++

문제설명 입출력 예제 개념 M개의 카드 중에 N개의 숫자 카드와 같은 것이 몇 개 있는지 출력하는 문제다. map 자료 구조에 저장하여 개수를 출력하면 시간 초과 문제에 걸리게 되는데, 이는 map 자료구조는 연산이 O(logN)의 시간 복잡도를 가지기 때문이다. 즉, M개의 숫자를 하나씩 확인할 때마다 시간 복잡도가 O((N+M) logN)이 되므로 다른 방법을 찾아야 한다. 따라서 시간 복잡도를 줄이는 과정이 필요한데, 이진 탐색을 이용한 std::upper_bound() 함수와 std::lower_bound() 함수를 사용하거나 map의 멤버 함수인 find() 함수와 반복자를 적절하게 이용하면 해결할 수 있다. 풀이 (1) map #include #include #include int main()..

Algorithm/백준 2023.04.19

[백준] 7785 회사에 있는 사람 with C++

문제설명 입출력 예제 개념 key와 value로 이루어진 map 자료구조를 사용하면 쉽게 해결할 수 있는 문제다. leave가 되어 있는 사원은 map에서 제거하고, enter만 되어있는 사원만 출력하면 해결할 수 있다. 마지막에 사전의 역순으로 출력하라고 되어 있음에 유의하자. 풀이 #include #include #include int main() { std::map m; int N; std::cin >> N; 사원의 이름과 상태가 문자열로 되어 있으므로 key와 value 모두 문자열로 받는 맵을 초기화 한다. 그리고 로그 수 N을 초기화한다. while (N--) { std::string name, log; std::cin >> name >> log; m[name] = log; } 이름과 로그를 ..

Algorithm/백준 2023.04.18