본문 바로가기
Cospro 2급/C언어

[5차] 문제10. 가장 오래 일한 사람을 구해주세요. 답안 및 풀이

by SRin23 2021. 5. 30.

◇ 문제 설명

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시간 일했습니다.

 

◇ 초기 내용

[출처]goormedu COSPRO 2급 기출문제 [5차] 문제10 초기내용


◇ 답안

#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;
}

 

 

◇ 실행결과

[5차] 문제10) 가장 오래 일한 사람을 구해주세요. 실행결과

 

◇ 출처

https://edu.goorm.io/learn/lecture/16921/cos-pro-2%25EA%25B8%2589-%25EA%25B8%25B0%25EC%25B6%259C%25EB%25AC%25B8%25EC%25A0%259C-c%25EC%2596%25B8%25EC%2596%25B4

 

COS PRO 2급 기출문제 - C언어 - 구름EDU

YBM IT에서 시행하는 COS Pro 자격증 기출문제를 직접 풀어볼 수 있는 실습 위주의 강좌입니다.

edu.goorm.io

 

댓글