반응형
250x250
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- MySQL
- 분리집합
- 프래그먼트
- 컴퓨터그래픽스
- 백준
- 타입스크립트
- BFS
- 카이스트맛집
- 몰입캠프후기
- glfw
- 자바
- 알고리즘
- 카이스트
- DP
- 어은동맛집
- 자바스크립트
- 리사이클러뷰
- 후기
- 대전맛집
- 우선순위큐
- html
- 궁동
- 몰입캠프
- node.js
- computergraphics
- 위상정렬
- nodeJS
- 프로그래머스
- 안드로이드스튜디오
- 앱개발
Archives
- Today
- Total
소근소근
[프로그래머스 - 무지의 먹방 라이브] Lv.4 c++ 본문
728x90
반응형
SMALL
단순 구현은 쉬우나, 효율성 때문에 오래 걸린 문제.
무작정 k에 대해서 돌며 index를 구하면 터지게 되어 있음. k의 최대가 2*10^13
k초에 네트워크 에러가 나고, 그 뒤에 무엇을 먹어야 하는지 구해야 한다. 결국 간단하게는 `k+1 초에 몇 번 째 음식을 먹는지` 구하는 문제다.
위 그림처럼 표로 정리해보면, food_item[idx] 값 만 큼만 column 이 채워지는 것을 볼 수 있다.
item의 모든 합보다 k+1 이 더 크다면, 이때는 먹을 음식이 이미 고갈 된 것이므로 -1을 리턴하는 것으로 먼저 전처리를 해주었다.
while 문을 돌며 하나의 row씩 보면, 해당 row에 들어가는 k의 범위를 구하는 방식으로 접근했다.
일단 sorted에서 가장 작은 수 * len(food_items) 만큼의 k는 full row로 채워진다. (그림의 첫번째 행과 두번째 행)
다른 경우
row = 4 )
row 값 이상인 item column에만 채워지므로, 4 4 7 에만 k값들이 채워진다.
이때, 매번 row보다 크거나 같은 값을 배열에서 찾을 필요 없이, 처음 idx 변수를 두고 while문 안에서 증가시켜주는 식으로 시간 복잡도를 최대한 줄여야 한다.
#include <string>
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
vector <pair<int,int>> sorted;
long long total;
void set_sorted(int len, vector<int> food_times) {
for (int i=0; i<len; i++) {
total += food_times[i];
sorted.push_back({food_times[i], i+1});
}
sort(sorted.begin(), sorted.end());
}
int solution(vector<int> food_times, long long k) {
long long len = food_times.size();
set_sorted(len, food_times);
k += 1;
if (k > total) return -1;
long long val = sorted[0].first * len;
if (k>=1 && k<=val) {
int ret = k % len;
return ret == 0 ? len : ret;
}
int row = sorted[0].first + 1;
long long idx = 0;
while (1) {
while (sorted[idx].first < row) {
idx++;
}
long long diff = len - idx;
long long left = val + 1;
long long right = val + diff;
if (k <= right && k >= left) {
vector <int> v;
for (int i=idx; i<len; i++) {
v.push_back(sorted[i].second);
}
sort(v.begin(), v.end());
return v[k - left];
}
row++;
val = val + diff;
}
return 0;
}
채점 결과
728x90
반응형
LIST
'Algorithm' 카테고리의 다른 글
[백준 BOJ 25097 Controlled Inflation gold2] C++, 그리디, Dynamic Programming (1) | 2023.04.12 |
---|---|
[백준 BOJ 14500 테트로미노 gold4] C++ DFS (0) | 2023.03.27 |
[프로그래머스] 경주로 건설 (0) | 2022.05.01 |
[프로그래머스 - 오랜 기간 보호한 동물(2)] MYSQL , DATETIME , STRING (0) | 2022.02.06 |
[프로그래머스 - 중성화 여부 파악하기] MYSQL, STRING DATE (0) | 2022.02.06 |