COS Pro 1급 (C) 시험문제 (2)
Updated:
NOTICE: 본 포스트는 YBMIT 사이트에서 제공하는 COS Pro 1급 C언어 시험문제 지문입니다. 원본 지문 파일 및 문제, 정답 파일은 다음의 링크에서 다운로드 가능하며 (https://www.ybmit.com/cos_pro/cos_pro_r_test.jsp), 저작권 또한 (주)와이비엠넷
에 있음을 사전에 공지합니다.
문제1
학생들의 학번과 등수가 주어질 때, 학번을 등수 순서대로 정렬하려 합니다(단, 등수가 같은 학생은 없다고 가정합니다). 이를 위해 다음과 같이 구조체를 정의했습니다.
typedef struct Student{
int student_number;
int rank;
}Student;
또한, 다음과 같이 프로그램 구조를 작성했습니다.
1. 학생의 학번과 등수로 구성된 구조체 배열을 생성 및 초기화합니다.
2. 생성된 구조체 배열을 등수 기준으로 오름차순 정렬합니다.
3. 정렬된 구조체 배열에서 학번을 첫 번째 원소부터 순서대로 가져와 새로운 배열에 넣습니다.
4. 생성된 학번 배열을 return 합니다.
학생들의 학번이 들어있는 배열 student_numbers와 student_numbers의 길이 student_numbers_len, 학생들의 등수가 들어있는 배열 ranks와 ranks의 길이 ranks_len이 매개변수로 주어질 때, 학생들의 학번을 등수 순으로 정렬한 배열을 return 하도록 solution 함수를 작성하려 합니다. 위 구조를 참고하여 코드가 올바르게 동작할 수 있도록 빈칸을 채워 전체 코드를 완성해주세요.
1.1 매개변수 설명
학생들의 학번이 들어있는 배열 student_numbers와 student_numbers의 길이 student_numbers_len, 학생들의 등수가 들어있는 배열 ranks와 ranks의 길이 ranks_len이 solution 함수의 매개변수로 주어집니다.
- student_numbers_len은 1 이상 100 이하의 자연수입니다.
- 학생들의 학번은 1 이상 1,000 이하의 자연수입니다.
- ranks_len은 1 이상 100 이하의 자연수입니다.
- ranks에는 1부터 ranks_len 까지의 자연수가 하나씩 들어있습니다.
- student_numbers_len과 ranks_len은 항상 같으며, i 번째 학생의 학번과 등수는 student_numbers[i]와 ranks[i]에 들어있습니다.
1.2 return 값 설명
학생들의 학번을 등수 순으로 정렬한 배열을 return 해주세요.
1.3 예시
student_numbers | student_numbers_len | ranks | ranks_len | return |
---|---|---|---|---|
[2,4,3,6,5] | 5 | [3,5,1,2,4] | 5 | [3,6,2,5,4] |
1.4 예시 설명
학번을 등수순서로 정렬하면 [3, 6, 2, 5, 4]가 됩니다.
문제2
A 지하철역의 오늘 하루 지하철 도착 시각이 순서대로 들어있는 배열이 있습니다. 현재 시간이 주어졌을 때, 지하철을 타기위해서는 최소 몇 분을 기다려야 하는지 구하려 합니다. 이를 위해 다음과 같이 프로그램 구조를 작성했습니다.
1. 00:00을 기준으로 해서 현재 시각을 분 단위로 변환합니다.
2. 배열을 순회하며 다음을 수행합니다.
2-1. 00:00을 기준으로, 각 지하철 도착 시각을 분 단위로 변환합니다.
2-2. 현재 시각과 지하철 도착 시각을 비교하여 최소 대기 시간을 구합니다.
3. 2번 단계에서 구한 최소 대기 시간을 return 합니다.
오늘 하루 동안의 지하철 도착 시각이 순서대로 들어있는 배열 subway_times와 subway_times의 길이 subway_times_len, 현재시간 current_time이 매개변수로 주어질 때, 지하철을 타기 위해 기다려야 하는 최소 대기 시간을 return 하도록 solution 함수를 작성했습니다. 이때, 위 구조를 참고하여 중복되는 부분은 func_a라는 함수로 작성했습니다. 코드가 올바르게 동작할 수 있도록 빈칸을 알맞게 채워 전체 코드를 완성해주세요.
2.1 매개변수 설명
오늘 하루 동안의 지하철 도착 시각이 순서대로 들어있는 배열 subway_times와 subway_times의 길이 subway_times_len, 현재시간 current_time이 solution 함수의 매개변수로 주어집니다.
- subway_times_len은 1 이상 100 이하의 자연수입니다.
- 지하철 도착 시각과 현재 시각은 24시간 표기법을 이용하여 나타냅니다.
- 24시간 표기법은 00:00부터 23:59까지로 시간을 표기합니다.
- 입력으로 주어지는 시간은 항상 “XX:YY”형태로 주어집니다.
- 지하철 첫차 도착 시각은 05:00 이후이며, 막차 도착 시각은 23:59 이전입니다.
2.2 return 값 설명
지하철을 타기 위해 기다려야 하는 최소 대기 시간을 return 해주세요.
- 만약 오늘 탈 수 있는 지하철이 없다면 -1을 return 하면 됩니다.
2.3 예시
subway_times | subway_times_len | current_time | return |
---|---|---|---|
[“05:31”, “11:59”, “13:30”, “23:32”] | 4 | “12:00” | 90 |
[“14:31”, “15:31”] | 2 | “15:31” | 0 |
2.4 예시 설명
예시 #1 현재시간 12:00에서 가장 가까운 지하철 도착 시각은 13:30입니다. 따라서 최소 90분을 기다려야 합니다.
예시 #2 현재 시각은 15:31이며, 15:31분에 도착하는 지하철에 탑승할 수 있습니다. 따라서 0분만 기다리면 됩니다.
문제3
A 사이트에서 아래 조건에 맞는 게시글을 최초로 작성하는 이용자에게 경품을 제공하려 합니다.
- 현재 작성되어있는 가장 마지막 게시글 이후에 작성된 게시글이어야 합니다.
- 게시글 번호의 자릿수가 짝수여야 합니다.
- 게시글 번호가 2n 자릿수 일때, 앞 n 자리의 각 자릿수의 합과 뒤 n 자리의 각 자릿수의 합이 같아야 합니다.
이 사이트의 게시글 번호는 마지막에 작성된 게시글 번호부터 1씩 증가합니다. 예를 들어, 가장 마지막 게시글의 번호가 235386이라면, 이후에 작성되는 게시글의 번호는 235387, 235388 … 이 되며, 번호가 235387 이상인 게시글이 경품당첨의 대상이 됩니다.
당신은 경품을 받기위해 앞으로 게시글을 몇 개 더 작성해야 하는지 구하려 합니다. 이를 위해 다음과 같이 프로그램 구조를 작성했습니다.
1. 게시글 번호를 1 증가시키고 자릿수를 구합니다.
2. 만약 자릿수가 짝수가 아니라면 1로 돌아갑니다.
3. 만약 구한 자릿수가 짝수라면 다음을 수행합니다.
3-1. 앞 자릿수 절반과 뒷 자릿수 절반을 분리합니다.
3-2. 앞 자릿수 절반의 자릿수 합과 뒷 자릿수 절반의 자릿수 합을 구합니다.
3-3. 위에서 구한 합이 서로 같으면 4로 가고, 같지 않으면 1로 돌아갑니다.
4. (3에서 구한 수 - 처음에 매개변수로 주어진 수)를 return 합니다.
가장 마지막 게시글의 번호 num이 매개변수로 주어질 때, 경품을 받기위해 앞으로 더 작성해야 하는 게시글의 개수를 return 하도록 solution 함수를 작성하려 합니다. 위 구조를 참고하여 코드가 올바르게 동작할 수 있도록 빈칸에 주어진 func_a, func_b, func_c 함수와 매개변수를 알맞게 채워주세요.
3.1 매개변수 설명
현재까지 작성된 가장 마지막 게시글의 번호 num이 매개변수로 주어집니다.
- num은 1 이상 50,000,000 이하의 자연수입니다.
3.2 return 값 설명
경품을 받기위해 앞으로 더 작성해야 하는 게시글의 개수를 return 해주세요.
3.3 예시
num | return |
---|---|
1 | 10 |
235386 | 20 |
3.4 예시 설명
예시 #1
가장 마지막에 작성된 게시글의 번호가 1입니다.
당첨조건을 만족하는 게시글 번호는 11이며, 따라서 최소 10번 더 게시글을 작성해야합니다.
예시 #2
가장 마지막에 작성된 게시글의 번호는 6자리이며, 3자리씩 끊으면 다음과 같습니다.
- 앞 4자리 : 235
- 뒤 4자리 : 386
앞 3자리의 각 자릿수 합은 다음과 같습니다.
- 2 + 3 + 5 = 10
뒤 3자리의 각 자릿수 합은 다음과 같습니다.
- 3 + 8 + 6 = 17
앞으로 최소 20개의 글을 더 작성한다면, 글 번호는 235406이 되며, 뒤 3자리의 각 자릿수 합은 다음과 같습니다.
- 4 + 0 + 6 = 10
따라서 경품을 받기 위해 최소 20개의 글을 더 작성하면 됩니다.
문제4
자연수가 중복 없이 들어있는 배열이 있습니다. 이 배열에서 합이 K의 배수가 되도록 서로 다른 숫자 세개를 고르는 방법은 몇 가지인지 세려고 합니다.
자연수가 들어있는 배열 arr와 arr의 길이 arr_len이 매개변수로 주어질 때, 이 배열에서 합이 K의 배수가 되도록 서로 다른 숫자 세개를 고르는 방법의 가짓수를 return 하도록 solution 함수를 완성해주세요.
4.1 매개변수 설명
자연수가 들어있는 배열 arr와 arr의 길이 arr_len이 solution 함수의 매개변수로 주어집니다.
- arr_len은 3 이상 100 이하의 자연수입니다.
- arr에는 1 이상 1,000 이하의 자연수가 중복 없이 들어있습니다.
- K는 1 이상 10 이하의 자연수입니다.
4.2 return 값 설명
배열에서 합이 K의 배수가 되도록 서로 다른 숫자 세개를 고르는 방법의 가짓수를 return 해주세요.
- 그러한 방법이 없다면 0을 return 하면 됩니다.
4.3 예시
arr | arr_len | K | return |
---|---|---|---|
[1, 2, 3, 4, 5] | 5 | 3 | 4 |
4.4 예시 설명
다음과 같이 4가지 방법이 있습니다.
- 1 + 2 + 3 = 6
- 1 + 3 + 5 = 9
- 2 + 3 + 4 = 9
- 3 + 4 + 5 = 12
문제5
자연수가 들어있는 배열이 있습니다. 이 배열에서, 숫자가 연속해서 증가하는 가장 긴 구간의 길이를 구하려 합니다. 단, 바로 전 숫자와 현재 숫자가 같은 경우는 증가한 것으로 보지 않습니다.
예를 들어 배열에 순서대로 [3, 1, 2, 4, 5, 1, 2, 2, 3, 4]가 들어있는 경우, [1, 2, 4, 5]가 들어있는 구간이 숫자가 연속해서 증가한 가장 긴 구간이며, 길이는 4입니다.
자연수가 들어있는 배열 arr와 arr의 길이 arr_len이 매개변수로 주어질 때, 숫자가 연속해서 증가하는 가장 긴 구간의 길이를 return 하도록 solution 함수를 완성해주세요.
5.1 매개변수 설명
자연수가 들어있는 배열 arr와 arr의 길이 arr_len이 solution 함수의 매개변수로 주어집니다.
- arr_len은 2 이상 200,000 이하입니다.
- arr의 원소는 1 이상 1,000,000 이하의 자연수입니다.
5.2 return 값 설명
숫자가 연속해서 증가하는 가장 긴 구간의 길이를 return 해주세요.
- 길이가 2 이상인 증가하는 구간이 없다면 1을 return 해주세요.
5.3 예시
arr | arr_len | return |
---|---|---|
[3, 1, 2, 4, 5, 1, 2, 2, 3, 4] | 10 | 4 |
5.4 예시 설명
숫자 [1, 2, 4, 5]가 들어있는 구간이 숫자가 연속해서 증가하는 가장 긴 구간이며, 길이는 4입니다.
현재 숫자가 바로 이전 숫자와 같은 경우에는 증가했다고 보지 않습니다. [1, 2, 2, 3, 4]가 들어있는 구간은 [2, 2]가 연속해서 증가한 부분이 아니므로, [1, 2]가 들어있는 구간과 [2, 3, 4]가 들어있는 구간으로 나누어야 합니다.
문제6
로봇이 아래 그림과 같이 2차원 평면의 원점 (0, 0)에 서있습니다.
이 로봇은 x축 방향, 혹은 y축 방향으로만 움직일 수 있으며, 알파벳으로 명령을 내릴 수 있습니다. 명령을 내릴 때 사용하는 알파벳은 ‘L’, ‘R’, ‘U’, ‘D’의 4가지이며, ‘L’은 x축 방향으로 -1만큼, ‘R’은 x축 방향으로 +1만큼, ‘U’는 y축 방향으로 +1만큼, ‘D’는 y축 방향으로 -1 만큼 이동하라는 의미입니다.
로봇에게 내린 명령이 순서대로 들어있는 문자열 commands가 매개변수로 주어질 때, 주어진 명령을 모두 수행한 후의 로봇 위치를 return 하도록 solution 함수를 완성해주세요.
6.1 매개변수 설명
로봇에게 내린 명령이 순서대로 들어있는 문자열 commands가 solution 함수의 매개변수로 주어집니다.
- commands는 알파벳 대문자 ‘L’, ‘R’, ‘U’, ‘D’로만 이루어진 문자열이며, 길이는 1 이상 100 이하입니다.
6.2 return 값 설명
주어진 명령을 모두 수행한 후의 로봇 위치를 return 해주세요.
- [x축 좌표, y축 좌표] 형태로 로봇의 최종 위치를 배열에 담아 return 해주세요.
6.3 예시
commands | return |
---|---|
“URDDL” | [0, -1] |
6.4 예시 설명
“URDDL”명령에 따라 (0, 0)에 있는 로봇은 다음과 같이 움직입니다.
- [0, 0] → [0, 1] → [1, 1] → [1, 0] → [1, -1] → [0, -1]
따라서 로봇의 최종 위치는 [0, -1]입니다.
문제7
한국에는 다음과 같이 8가지 종류의 화폐가 있습니다.
- 동전 : 10원, 50원, 100원, 500원
- 지폐 : 1,000원, 5,000원, 10,000원, 50,000원
손님에게 거슬러줘야 하는 금액이 주어질 때, 거슬러주는 동전과 지폐 개수의 합이 최소가 되도록 하려고 합니다.
예를 들어 거슬러줘야 할 금액이 2,760원 이라면, 1,000원짜리 2장, 500원짜리 1개, 100원짜리 2개, 50원짜리 1개, 10원짜리 1개를 거슬러줄 때 동전과 지폐 개수의 합이 최소가 됩니다.
손님에게 거슬러줘야 하는 금액 money가 매개변수로 주어질 때, 거슬러 주는 동전과 지폐 개수합의 최솟값을 return 하도록 solution 함수를 작성하려 합니다. 빈칸을 채워 전체 코드를 완성해주세요.
7.1 매개변수 설명
손님에게 거슬러줘야 하는 금액 money가 solution 함수의 매개변수로 주어집니다.
- money는 10 이상 100,000 이하의 자연수입니다.
- money는 10의 배수로만 주어집니다.
7.2 return 값 설명
거슬러 주는 동전과 지폐 개수합의 최솟값을 return 해주세요.
7.3 예시
money | return |
---|---|
2760 | 7 |
7.4 예시 설명
2760원을 거슬러주는 방법은 여러 가지가 있지만, 다음과 같이 거슬러 줄 때, 필요한 동전과 지폐 개수가 최소가 됩니다.
- 1,000원 : 2장
- 500원 : 1개
- 100원 : 2개
- 50원 : 1개
- 10원 : 1개
따라서 7을 return 하면 됩니다.
문제8
자연수가 들어있는 배열이 주어질 때, 다음 규칙에 따라 새로운 배열을 만들려고 합니다.
- 주어진 배열의 첫 번째 원소를 새로운 배열의 첫 번째 원소에 넣습니다.
- 주어진 배열의 마지막 원소를 새로운 배열의 두 번째 원소에 넣습니다.
- 계속해서 주어진 배열의 남아있는 원소중 가장 앞에있는 원소와 가장 뒤에있는 원소를 번갈아 가져와 새로운 배열에 순서대로 넣습니다.
- 주어진 배열에 더이상 원소가 남아있지 않을 때까지 위 과정을 반복합니다.
자연수가 들어있는 배열 arr와 arr의 길이 arr_len이 매개변수로 주어질 때, 위 과정을 수행해서 만든 새로운 배열을 return 하도록 solution 함수를 작성했습니다. 그러나, 코드 일부분이 잘못되어있기 때문에, 몇몇 입력에 대해서는 올바르게 동작하지 않습니다. 주어진 코드에서 _한 줄_만 변경해서 모든 입력에 대해 올바르게 동작하도록 수정하세요.
8.1 매개변수 설명
자연수가 들어있는 배열 arr와 arr의 길이 arr_len이 solution 함수의 매개변수로 주어집니다.
- arr_len은 1 이상 1,000 이하의 자연수입니다.
- arr의 원소는 1 이상 10,000 이하의 자연수입니다.
8.2 return 값 설명
문제에 주어진 과정을 수행해서 만든 새로운 배열을 return 해주세요.
8.3 예시
arr | arr_len | return |
---|---|---|
[1, 2, 3, 4, 5, 6] | 6 | [1, 6, 2, 5, 3, 4] |
8.4 예시 설명
처음에 주어진 배열은 [1, 2, 3, 4, 5, 6]입니다. 주어진 규칙에 맞게 새로운 배열을 만드는 과정은 다음과 같습니다.
처음 배열 arr | 새로운 배열 |
---|---|
[1, 2, 3, 4, 5, 6] | [ ] |
[2, 3, 4, 5, 6] | [1] |
[2, 3, 4, 5] | [1, 6] |
[3, 4, 5] | [1, 6, 2] |
[3, 4] | [1, 6, 2, 5] |
[4] | [1, 6, 2, 5, 3] |
[ ] | [1, 6, 2, 5, 3, 4] |
문제9
주어진 비밀번호가 안전한지 아닌지 판단하려합니다. 비밀번호의 안전 여부는 다음 규칙으로 판단합니다.
- 연속된 3자리 이상의 알파벳 혹은 숫자를 사용할 수 없습니다. (abc, cba, 012, 987 등)
비밀번호에 사용할 문자열 password가 매개변수로 주어질 때, 주어진 문자열이 위 규칙에 맞으면 true를, 맞지 않으면 false를 return 하도록 solution 함수를 작성했습니다. 그러나, 코드 일부분이 잘못되어있기 때문에, 몇몇 입력에 대해서는 올바르게 동작하지 않습니다. 주어진 코드에서 _한 줄_만 변경해서 모든 입력에 대해 올바르게 동작하도록 수정하세요.
9.1 매개변수 설명
비밀번호에 사용할 문자열 password가 solution 함수의 매개변수로 주어집니다.
- password는 알파벳 소문자와 숫자로만 이루어진 문자열입니다.
- password의 길이는 5 이상 20 이하입니다.
9.2 return 값 설명
주어진 문자열이 주어진 규칙에 맞으면 true를, 맞지 않으면 false를 return 해주세요.
9.3 예시
password | return |
---|---|
“cospro890” | true |
“cba323” | false |
9.4 예시 설명
예시 #1 주어진 문자열에는 연속된 3자리 이상의 문자열 혹은 숫자가 없습니다.
예시 #2 “cba”가 연속된 3자리 문자열이므로 주어진 규칙에 맞지 않습니다.
문제10
0과 1로만 이루어진 문자열에서 연속해서 붙어있는 0들을 하나의 0으로 줄이려 합니다.
예를 들어 “101100011100” 이란 문자열은 “101101110”으로 만들면 됩니다.
0과 1로만 이루어진 문자열 s가 매개변수로 주어질 때, 연속해서 붙어있는 0들을 하나의 0으로 줄인 문자열을 return 하도록 solution 함수를 작성했습니다. 그러나, 코드 일부분이 잘못되어있기 때문에, 몇몇 입력에 대해서는 올바르게 동작하지 않습니다. 주어진 코드에서 _한 줄_만 변경해서 모든 입력에 대해 올바르게 동작하도록 수정하세요.
10.1 매개변수 설명
0과 1로만 이루어진 문자열 s가 solution 함수의 매개변수로 주어집니다.
- s의 길이는 1 이상 1,000 이하입니다.
10.2 return 값 설명
연속해서 붙어있는 0들을 하나의 0으로 줄인 문자열을 return 해주세요.
10.3 예시
s | return |
---|---|
“101100011100” | “101101110” |
10.4 예시 설명
1은 줄이지 않으며, 연속해서 붙어있는 0만 하나의 0으로 줄이면 됩니다.
Comments