◇ 문제 설명
n명이 시간표에 따라 교대 근무에 들어갑니다. 이때 가장 오래 일한 사람이 몇 시간 일했는지 알아내려 합니다. 근무 순번은 첫번째 사람부터 n번쨰 사람순으로 합니다. n번 사람이 일을 한 뒤에는 다시 첫번째 사람부터 일을 합니다.
예를 들어 시간표가 [1, 5, 1, 9]이고 n이 3이면 첫번째 사람은 1+9시간, 두번째 사람은 5시간, 세번쨰 사람은 1시간 근무합니다. 따라서 첫 번째 사람이 가장 오래 일했으며 10시간 일했습니다.
근무 시간표를 담은 배열 time_table, 배열 time_table의 길이 time_table_len, 사람 수 n이 매개변수로 주어질때, 가장 오래 일한 사람은 몇 시간 일했는지 return하도록 soltuion함수를 작성해주세요.
◇ 매개변수 설명
시간표를 담은 배열 time_table, 배열 time_table의 길이 time_table_len, 사람 수 n이 solution함수의 매개변수로 주어집니다.
▶ time_table_len은 1이상 100이하입니다.
▶ time_table의 원소는 1이상 100이하인 자연수입니다.
▶ n은 1이상 time_table_len이하인 자연수입니다.
◇ return값 설명
가장 오래 일한 사람이 몇 시간 일했는지 return합니다.
◇ 예시
time_table | time_table_len | n | return | |
예시 #1 | [1, 5, 1, 9] | 4 | 3 | 10 |
예시 #2 | [4, 8, 2, 5, 4, 6, 7] | 7 | 4 | 14 |
◇ 예시 설명
예시 #1
앞선 예와 같습니다.
예시 #2
첫번째 사람은 4+4시간만큼 근무를 합니다.
두번째 사람은 8+6시간만큼 근무를 합니다.
세번째 사람은 2+7시간만큼 근무를 합니다.
네번째 사람은 5시간만 근무를 합니다.
따라서 가장 오래 근무를 한 사람은 14시간 일했습니다.
◇ 초기 내용
◇ 답안
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
int solution(int time_table[], int time_table_len, int n) {
int answer = 0;
int* sum = (int *)malloc(sizeof(int) * n);
for(int i = 0; i<time_table_len; i++){
sum[(i%n)-1] += time_table[i];
if(sum[(i%n)-1]>answer)
answer = sum[(i%n)-1];
}
return answer;
}
int main() {
int time_table1[] = {1, 5, 1, 9};
int time_table_len1 = 4;
int n1 = 3;
int ret1 = solution(time_table1, time_table_len1, n1);
printf("solution 함수의 반환 값은 %d 입니다.\n", ret1);
int time_table2[] = {4, 8, 2, 5, 4, 6, 7};
int time_table_len2 = 7;
int n2 = 4;
int ret2 = solution(time_table2, time_table_len2, n2);
printf("solution 함수의 반환 값은 %d 입니다.\n", ret2);
}
◇ 답안 힌트
▶ 각 사람의 근무 시간을 더하고 저장할 변수 sum을 정의해주세요.
▶ 0부터 time_table_len까지 반복하는 변수 i를 n으로 나눈 나머지, 즉 (i%n)이 자신의 자신을 가리키면 자신의 차례이다.
◇ 답안 풀이
(※ 실행 흐름 순으로 해석됩니다.)
int solution(int time_table[], int time_table_len, int n) {
int answer = 0;
//각 사람의 근무 시간을 계산할 메모리 할당
int* sum = (int *)malloc(sizeof(int) * n);
for(int i = 0; i<time_table_len; i++){
//(i%n)이 1이면 1번째로 근무한 사람이 근무를 다시 해야한다.
//하지만 배열의 인덱스는 0부터 시작하므로 그 값에 -1을 해주어 sum[(i%n)-1]에 근무시간를 더한다
sum[(i%n)-1] += time_table[i];
//만약, 근무시간이 answer 즉, 최대시간보다 크면 최대시간을 그사람의 근무시간으로 바꾼다.
if(sum[(i%n)-1]>answer)
answer = sum[(i%n)-1];
}
return answer;
}
◇ 실행결과
◇ 출처
COS PRO 2급 기출문제 - C언어 - 구름EDU
YBM IT에서 시행하는 COS Pro 자격증 기출문제를 직접 풀어볼 수 있는 실습 위주의 강좌입니다.
edu.goorm.io
'Cospro 2급 > C언어' 카테고리의 다른 글
[6차] 문제2. 종이 나누어 주기 답안 및 풀이 (0) | 2021.05.30 |
---|---|
[6차] 문제1. 저는 따뜻한 날이 좋아요. 답안 및 풀이 (0) | 2021.05.30 |
[5차] 문제9. 시험 등수 구하기 답안 및 풀이 (0) | 2021.05.30 |
[5차] 문제8. 상수도 요금 구하기.(물을 아껴 씁시다) 답안 및 풀이 (0) | 2021.05.26 |
[5차] 문제7. 계산대 두개에서 계산시간을 구해주세요! 답안 및 풀이 (0) | 2021.05.26 |
댓글