티스토리 뷰

인프런 - it 취업을 위한 알고리즘 문제풀이 (with C/C++) : 코딩테스트 대비 강의를 바탕으로 공부한 내용입니다.

문제는 비공개로 입력예제와 출력예제만을 가지고 포스팅

 

 

입력예제 1

3

1

2

3

5

 

출력예제 1 

3

 

풀이 

- 시뮬레이션 문제, 45-공주구하기 문제와 비슷한 로직

- 주의해야 할 점

(1) 배열 크기가 클 때는 전역변수로 선언, 지역변수로 선언 시 잘못된 값이 들어갈 수 있으나 전역변수로 선언 시 0으로 모두 초기화

(2) 총 작업의 크기와 정전되는 시간이 같거나, 정전되는 시간이 더 클 시에는  정전 된 후에 할 작업이 없음 => 이때는 -1을 출력함

(3) 정전이 되고 난 후에 해야할 작업의 값이 0이라면, 그 다음 값을 찾아서 출력해주어야 함

 

- 생각해야 할 점

(1) 총 작업의 크기를 구해서 정전되는 시간과 비교해 -1을 리턴하는 로직이 필요

=> tot에 a[i]값을 더하며 저장하고, 이가 k보다 작거나 같은지를 비교 => true일 시 -1을 출력

(2) 정전이 되고 난 후에 해야할 작업 값이 0일때 0이 아닌 위치를 찾아 리턴하는 로직이 필요

=> 정전된 부분까지 작업이 완료되었기 때문에 그 다음 위치부터 옮겨가면서 0이 아닌 작업의 위치를 찾는다

 

#include <stdio.h>
#include <vector>
#include <algorithm>
using namespace std;
int a[2001];

// 46. 멀티태스킹(카카오 먹방 문제 변형)

int main() {
    int n, k, i, pos=0, bp=0, tot=0;
    scanf("%d", &n); //작업의 개수
    for(i=1;i<=n;i++){
        scanf("%d", &a[i]);
        tot+=a[i];
    }
    scanf("%d", &k); //정전 시간
    if(tot<=k){
        //정전 나기 전 일이 끝남
        printf("-1\n");
        return 0;
    }
    while(1){
        pos++;
        if(pos>n){
            pos=1; //배열1로 포지션 이동
        }
        if(a[pos]==0) continue; //무시하고 반복문 증가
        a[pos]--; //작업 1감소
        bp++; //1초 증가
        if(bp==k) break; //정전, pos까지 작업
    }
    while(1){
        pos++;
        if(pos>n){
            pos=1;
        }
        if(a[pos]!=0) break; //정전 후, 0이 아닌 다음 작업 찾음
    }
    
    printf("%d\n", pos);

    
    return 0;
}
 

'알고리즘' 카테고리의 다른 글

48. 각 행의 평균과 가장 가까운 값  (0) 2020.12.24
47. 봉우리  (0) 2020.12.23
45. 공주구하기  (0) 2020.12.21
44. 마구간 정하기  (0) 2020.12.18
43. 뮤직비디오  (0) 2020.12.17
최근에 올라온 글
Total
Today
Yesterday