메모리: 54.3 MB, 시간: 8.18 ms
코딩테스트 연습 > 연습문제
정확성: 70.0
효율성: 30.0
합계: 100.0 / 100.0
2025년 01월 18일 20:36:40
처리해야 할 동일한 작업이 n 개가 있고, 이를 처리하기 위한 CPU가 있습니다.
이 CPU는 다음과 같은 특징이 있습니다.
처리해야 될 작업의 개수 n과, 각 코어의 처리시간이 담긴 배열 cores 가 매개변수로 주어질 때, 마지막 작업을 처리하는 코어의 번호를 return 하는 solution 함수를 완성해주세요.
| n | cores | result |
|---|---|---|
| 6 | [1,2,3] | 2 |
입출력 예 #1
처음 3개의 작업은 각각 1,2,3번에 들어가고, 1시간 뒤 1번 코어에 4번째 작업,다시 1시간 뒤 1,2번 코어에 5,6번째 작업이 들어가므로 2를 반환해주면 됩니다.
출처: 프로그래머스 코딩 테스트 연습, https://school.programmers.co.kr/learn/challenges
문제 풀이

10000 x 10000이라 생각했지만 아니었다. 시간복잡도 계산을 먼저 깊게 해보고 구현해야겠다.
코드
class Solution {
static boolean[][] work;
static int r, c;
public int solution(int n, int[] cores) {
if (n <= cores.length) return n;
int res=0;
work = new boolean[cores.length + 1][10001];
r = 1;
c = 1;
while(n>0 && isValid(r, c)){
if(!work[r][c] && c + cores[r-1] - 1 <= 10000) {
checkWork(cores);
n--;
if(n==0){
res = r;
break;
}
}
convertCoord();
}
return res;
}
private void checkWork(int[] cores){
for(int j=c; j<c+cores[r-1]; j++){
work[r][j] = true;
}
}
private boolean isValid(int r, int c){
return r >= 1 && r <= work.length-1 && c >= 1 && c <= 10000;
}
private void convertCoord(){
if(r == work.length-1) {
if(isValid(1, c+1)){
r=1;
c++;
}
}
else {
if(isValid(r+1, c)) r++;
}
}
}
class Solution {
public int solution(int n, int[] cores) {
int res = 0;
int time = 0;
while(n>0){
for(int i=0; i<cores.length; i++){
if(time%cores[i] == 0){
n--;
if(n==0) {
res = i+1;
break;
}
}
}
time++;
}
return res;
}
}
class Solution {
public int solution(int n, int[] cores) {
if(n <= cores.length) return n;
n -= cores.length;
int left = 1, right = 250000000;
int res = 0;
while(left <= right){
int mid = left + (right - left)/2;
long cnt = 0;
for(int i=0; i<cores.length; i++){
cnt += (long) mid / cores[i];
}
if(cnt >= n){
res = mid;
right = mid-1;
}
else{
left = mid + 1;
}
}
// 일단 res시간까진 작업이 완료된다는걸 찾음
long work = 0;
for(int i=0; i<cores.length; i++){
work += (long) (res-1) / cores[i];
}
int ans = cores.length;
for(int i=0; i<cores.length; i++){
if(res % cores[i] == 0) {
work++;
if(work == n) {
ans = i+1;
break;
}
}
}
return ans;
}
}