반응형
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 |
Tags
- 프로그래머스
- 몰입캠프후기
- 프래그먼트
- 자바
- computergraphics
- 안드로이드스튜디오
- 백준
- 위상정렬
- 컴퓨터그래픽스
- 자바스크립트
- 알고리즘
- glfw
- 카이스트맛집
- html
- 타입스크립트
- 우선순위큐
- 분리집합
- node.js
- DP
- 후기
- 궁동
- 앱개발
- 어은동맛집
- MySQL
- 리사이클러뷰
- nodeJS
- 몰입캠프
- BFS
- 대전맛집
- 카이스트
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 |