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

[6차] 문제2. 종이 나누어 주기 답안 및 풀이

by SRin23 2021. 5. 30.

◇ 문제 설명

한 줄로 서 있는 사름들에게 종이를 다음과 같은 방법으로 나눠주려 합니다.
 ▶ 종이 K장을 맨 앞사람에게 줍니다.
 ▶ 맨 앞 사람은 자신이 필요한 만큼 종일ㄹ 챙긴 후, 남은 종이를 뒷사람한테 전달합니다.
 ▶ 뒷 사람 또한 자신이 필요한 만큼 종이를 챙긴 후 남은 종이를 뒷사람에게 전달합니다.
 ▶ 전달할 종이가 없거나, 모든 사람이 필요한 만큼 종이를 가질때까지 계속해서 뒷사람에게 남은 종이를 전달합니다.

한 줄로 서 있는 사람들이 각자 필요로 하는 종이 수가 순서대로 들어있는 배열 papers, papers의 길이 papers_len 처음에 맨 앞사람에게 전달한 종이 수 K가 매개변수로 주어질때, 필요한 만큼의 종이를 받은 사람은 모두 몇 명인지 return하도록 solution함수를 작성했습니다. 그러나 코드 일부분이 잘못되어있기 때문에 몇몇 입력에 대해서는 올바르게 동작하지 않습니다. 주어진 코드에서 한 줄만 변경해서 모든 입력에 대해 올바르게 동작하도록 수정하세요.

 

◇ 매개변수 설명

한 줄로 서 있는 사람들이 각자 필요로 하는 종이 수가 순서대로 들어있는 배열 papers, papers의 길이 papers_len 처음에 맨 앞사람에게 전달한 종이 수 K가 solution함수의 매개변수로 주어집니다.
 ▶ papers의 각 원소는 1이상 20이하인 자연수입니다.
 ▶ paers_len은 1이상 20이하입니다.
 ▶ K는 1이상 400이하인 자연수입니다.

 

◇ return값 설명

필요한 만큼의 종이를 받은 사람은 모두 몇 명인지 return해주세요.

 

◇ 예시

  papers papers_len K return
예시 #1 [2, 4, 3, 2, 1] 5 10 3
예시 #2 [2, 4, 3, 2, 1] 5 14 5

 

◇ 예시 설명

예시 #1
맨 앞사람부터 순서대로 [2장, 4자, 3장, 2장, 1장]의 종이가 필요합니다.
 ▶ 맨 앞사람이 종이 2장을 가지고 남은 8장을 뒷사람에게 넘깁니다.
 ▶ 두번째 사람이 종이 4장을 가지고 남은 4장을 뒷사람에게 넘깁니다.
 ▶ 세번쨰 사람이 종이 3장을 가지고 남은 1장을 뒷사람에게 넘깁니다.
 ▶ 네번째 사람은 종이 2장이 필요한데 넘어온 종이는 1장이므로 원하는 종이 개수만큼 가질 수 없습니다.
 ▶ 나머지 사람들도 종이를 원하는 개수만큼 가질 수 없습니다.
따라서 필요한 만큼의 종이를 받은 사람은 3명입니다.

예시 #2
모든 사람이 필요한 만큼의 종이를 받을 수 있습니다.

 

◇ 초기 내용

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

 


◇ 답안

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>

int solution(int papers[], int papers_len, int K) {
    int length = papers_len;
    for(int i = 0; i < papers_len; i++){
      K -= papers[i];
      if(K <= 0)
        return i;
    }
    return length;
}

int main() {
	int papers1[] = {2, 4, 3, 2, 1};
	int papers_len1 = 5;
	int K1 = 10;
	int ret1 = solution(papers1, papers_len1, K1);

	printf("solution 함수의 반환 값은 %d 입니다.\n", ret1);

	int papers2[] = {2, 4, 3, 2, 1};
	int papers_len2 = 5;
	int K2 = 14;
	int ret2 = solution(papers2, papers_len2, K2);

	printf("solution 함수의 반환 값은 %d 입니다.\n", ret2);
}

 

◇ 답안 힌트

    ▶ K는 현재 가지고 있는 종이개수와 같습니다.

    ▶ 종이는 (음수)개가 될 수 없습니다.

 

◇ 답안 풀이

(※ 실행 흐름 순으로 해석됩니다.)

int solution(int papers[], int papers_len, int K) {
    int length = papers_len; 

 

    // i부터 paper_len전까지 for문을 통해 반복
    for(int i = 0; i < papers_len; i++){

      //초기 종이 개수에서 papers[i], 즉 각 사람이 들고가는 종이수를 뺀다
      K -= papers[i];

      //만약 종이가 없으면 자신이 필요로하는 종이 수만큼 가져간 사람의 수를 return

      // K == 0을 하면, K-=papers[i]에서 0이 아닌, -1이 나오면 끝내지 않고, 계속해서 음수값을 반환
      if(K <= 0)
        return i;
    }

    //만약 모든 사람이 다 자신이 필요로 하는 종이수 만큼 종이를 가져갔으면 모두가 가져갔다는 뜻해서 length 반환
    return length;
}

 

◇ 실행결과

[6차] 문제2) 종이 나누어 주기 실행결과

 

◇ 출처

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

 

댓글