[프로그래머스] 2019 KAKAO BLIND RECRUITMENT 무지의 먹방 라이브 : https://programmers.co.kr/learn/courses/30/lessons/42891
이번 문제는 효율성 테스트가 있는 문제였다.
회전판(배열)에는 N개의 음식이 있고, 각 음식에는 1부터 N까지 번호가 붙어있다.
무지는 1번 음식부터 먹기 시작하며, 회전판은 번호가 증가하는 순서대로 음식을 무지 앞으로 가져다 놓는다.
K초 후에 무지가 몇 번 음식을 먹을 차례인지 구하는 문제다.
단순하게 생각하면 while문으로 시간을 흐르게 하면서 각 음식의 값을 1씩 낮추면서 반복하면 된다.
하지만 음식의 개수가 최대 200,000이며, k는 최대 2 × 10^13이다.
따라서 순차 탐색으로는 무조건 시간 초과가 날 것이다.
우리가 알고 싶은 것은 K초 후에 무지가 어떤 음식을 먹느냐이다.
K초 근처에서의 값이 중요하지, K초까지 가는 모든 값이 중요한 것은 아니다.
따라서 시간을 증가할 때 음식의 남은 개수만큼 더해주며 증가시킨다.
우선 food_times를 오름차순으로 정렬시킨 뒤, 배열을 따로 저장해준다.
현재 시간(time)에 남은 음식의 수를 더한 값이 K보다 작다면 (while문 조건), 현재 시간에 남은 음식의 수를 더해준다.
이 뜻은 무지가 모든 음식을 먹으면서 한 바퀴를 돌았다는 뜻이 된다.
무지가 몇 바퀴를 돌았는지는 num 변수로 관리한다.
정렬된 배열의 각각의 값에서 num 변수를 뺀 값이 0보다 작다면 음식을 다 먹은 것으로 생각한다.
while문이 끝난다면 이제 K초 근처에 다가왔다는 뜻이다.
이제 남은 음식 중에 K초 후에 몇 번 음식을 먹게 되는지 순차 검색으로 탐색한다.
관리해줘야 할 변수가 많아서 꽤나 헷갈렸지만, 아이디어 자체는 그리 어려운 편이 아니었다.
코드로 보면 좀 더 이해하기 편할 것이다.
총 걸린 시간 : 50분
난이도 : ★★★☆☆
코드
import java.util.Arrays;
class Solution {
public int solution(int[] food_times, long k) {
int n = food_times.length;
int[] sortFood = sort(n, food_times);
int food = n; // 섭취할 수 있는 음식의 수
int idx = 0, num = 0;
long time = 0; // 총 걸린 시간
while (time + food <= k) {
time += food;
num++;
for (int i = idx; i < n; i++) {
if (sortFood[i] == num) {
idx++;
food--;
} else break;
}
if (food == 0) return -1; // 섭취할 수 있는 음식이 없다면
}
long count = k - time + 1;
for (int i = 0; i < n; i++) {
if (food_times[i] - num > 0) {
if (--count == 0) {
return i + 1;
}
}
}
return -1;
}
private int[] sort(int n, int[] food_times) {
int[] result = new int[n];
System.arraycopy(food_times, 0, result, 0, n);
Arrays.sort(result);
return result;
}
}
'Algorithm > Programmers' 카테고리의 다른 글
[프로그래머스] 2019 KAKAO BLIND RECRUITMENT 블록 게임 (Java) (0) | 2020.03.06 |
---|---|
[프로그래머스] 2019 KAKAO BLIND RECRUITMENT 길 찾기 게임 (Java) (0) | 2020.03.06 |
[프로그래머스] 2019 KAKAO BLIND RECRUITMENT 후보키 (Java) (0) | 2020.03.06 |
[프로그래머스] 2020 KAKAO BLIND RECRUITMENT 블록 이동하기 (Java) (1) | 2020.03.01 |
[프로그래머스] 2020 KAKAO BLIND RECRUITMENT 외벽 점검 (Java) (1) | 2020.02.29 |