-
프로그래머스 - 억억단을 외우자 [C++]문제 풀이/프로그래머스 2024. 3. 8. 22:51반응형
이 문제는 구현 문제이다.
문제 제목 보고 1억 * 1억 배열이라 다른 방법을 사용할 줄 알았는데 입력으로 주어지는 e가 최대 5백만이라 배열로 만들 수 있었다.
가장 처음 나오는 이중 for문에 5,000,000을 넣고 카운트해보면 약 7,800만 정도의 연산을 수행하게 된다. 따라서 1초 안에 cnt를 모두 셀 수 있다.
범위를 세는 부분이 언뜻 시간을 초과할 것처럼 보이지만, starts 배열을 내림차순 정렬한 뒤 각 루프마다 구간을 계산하면 이전 결과를 활용할 수 있어 O(N)이면 해결된다. 이 때 정렬을 해도 원래 위치를 알 수 있어야 하기 때문에 pair를 사용하였다.
#include <string> #include <vector> #include <iostream> #include <utility> #include <algorithm> using namespace std; #define MAX 5000000 int cnt[MAX + 1]; bool compare(pair<int, int>& a, pair<int, int>& b) { return a.first > b.first; } vector<int> solution(int e, vector<int> starts) { vector<int> answer(starts.size()); for (int i = 1; i <= e; i++) { for (int j = 1; j * i <= e; j++) { cnt[i * j]++; } } vector<pair<int, int>> numbers; int startSize = starts.size(); for (int i = 0; i < startSize; i++) { int start = starts[i]; numbers.push_back({start, i}); } sort(numbers.begin(), numbers.end(), compare); int manyCnt = -1; int many = -1; int start = e; for (pair<int, int>& number : numbers) { int dest = number.first; int index = number.second; for ( ; start >= dest; start--) { if (cnt[start] >= manyCnt) { many = start; manyCnt = cnt[start]; } } answer[index] = many; } return answer; }
반응형'문제 풀이 > 프로그래머스' 카테고리의 다른 글
프로그래머스 - 리틀 프렌즈 사천성 [C++] (0) 2024.08.26 프로그래머스 - 숫자 타자 대회 [C++] (0) 2024.07.03 프로그래머스 - 등대 [C++] (0) 2024.03.08 프로그래머스 - 카드 짝 맞추기 [C++] (0) 2024.03.03 프로그래머스 - 매칭 점수 [C++] (0) 2024.03.02