인프런 - 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 |