COS Pro 1급 (C) 시험문제 (4)

Updated:

NOTICE: 본 포스트는 YBMIT 사이트에서 제공하는 COS Pro 1급 C언어 시험문제 지문입니다. 원본 지문 파일 및 문제, 정답 파일은 다음의 링크에서 다운로드 가능하며 (https://www.ybmit.com/cos_pro/cos_pro_r_test.jsp), 저작권 또한 (주)와이비엠넷 에 있음을 사전에 공지합니다.


문제1

어떤 단어가 XX 사전의 몇 번째 단어인지 알고 싶습니다. XX 사전에는 대문자 알파벳 ‘A’, ‘E’, ‘I’, ‘O’, ‘U’를 사용해 만들 수 있는 길이가 5 이하인 모든 단어가 수록되어 있습니다.

예를 들어, 사전의 첫 번째 단어는 “A”이고, 그다음은 “AA”입니다. 마지막 단어는 “UUUUU”입니다.

문자열 word가 매개변수로 주어질 때, word가 사전의 몇 번째 단어인지 return 하도록 solution 함수를 작성했습니다. 그러나, 일부 코드가 잘못되어 코드가 바르게 동작하지 않습니다. 주어진 코드가 모든 입력을 바르게 처리하도록 코드를 수정해주세요. 코드는 _한 줄_만 수정해야 합니다.


1.1 매개변수 설명

문자열 word가 solution 함수의 매개변수로 주어집니다.

  • word는 ‘A’, ‘E’, ‘I’, ‘O’, ‘U’로만 구성됩니다.
  • word의 길이는 5 이하입니다.

1.2 return 값 설명

사전에서 word가 몇 번째 단어인지 return 해주세요.


1.3 예시

word return
“AAAAE” 6
“AAAE” 10

1.4 예시 설명

사전엔 단어가 다음과 같이 수록됩니다. “A”, “AA”, “AAA”, “AAAA”, “AAAAA”, “AAAAE”, “AAAAI”, “AAAAO”, “AAAAU”, “AAAE”, …

예시 #1 “AAAAE”는 여섯 번째에 나옵니다.

예시 #2 “AAAE”는 열 번째에 나옵니다.


문제2

알파벳 소문자와 대문자로 구성된 문자열을 압축하려 합니다. 압축이란 대표 문자와 대표 문자가 연속되는 개수를 함께 표현하는 것입니다. 이때, 대문자와 소문자는 구분하지 않으며, 대표 문자는 소문자로 표현합니다.

예를 들어, 문자열 “YYYYYbbbBbbBBBMmmM”을 압축하면 “y5b9m4”입니다.

문자열 s가 매개변수로 주어질 때, s를 압축한 문자열을 return 하도록 solution 함수를 작성했습니다. 그러나, 일부 코드가 잘못되어 코드가 바르게 동작하지 않습니다. 주어진 코드가 모든 입력을 바르게 처리하도록 코드를 수정해주세요. 코드는 _한 줄_만 수정해야 합니다.


2.1 매개변수 설명

문자열 s가 solution 함수의 매개변수로 주어집니다.

  • s의 길이는 1 이상 100000 이하입니다.
  • s는 알파벳 소문자, 대문자로만 구성됩니다.
  • 알파벳이 반복되는 횟수는 9회 이하로만 주어집니다.
  • 즉, “sssSSSSsss” 와 같은 경우는 주어지지 않습니다.

2.2 return 값 설명

s를 압축한 결과를 return 해주세요.


2.3 예시

s return
“YYYYYbbbBbbBBBMmmM” “y5b9m4”

2.4 예시 설명

예시 #1 문제의 예와 같습니다.


문제3

정확히 n 일 연속으로 스키장 이용하는데 필요한 최소 비용을 계산하려 합니다. 다음은 스키장에서 판매하는 이용권입니다.

이용권 종류 스키장을 사용할 수 있는 일수 가격
one_day 구매한 날 하루 동안 사용 가능 one_day_price
multi_day 구매한 날부터 multi_day일간 사용 가능 multi_day_price

예를 들어 one_day_price = 3, multi_day = 5, multi_day_price = 14라면, 1일 이용권은 3원, 5일 이용권은 14원입니다. n = 6일 때 정확히 6일 연속으로 스키장을 이용하는데 필요한 비용은 다음과 같이 계산합니다.

  • 1일 이용권 x 6장 → 6 x 3원 = 18원
  • 1일 이용권 x 1장 + 5일 이용권 x 1 장 → 1 x 3원 + 1 x 14원 = 17원

따라서 정확히 6일 연속 스키장을 이용하려면 최소 17원이 듭니다. ※ 스키장을 정확히 6일간 이용해야 하므로 5일 이용권을 두 장 살 수는 없습니다.

solution 함수의 매개변수로 one_day_price, multi_day, multi_day_price, n가 주어집니다. 이때 정확히 n일 연속 스키장을 이용하는데 필요한 최소 금액을 계산해서 return 하도록 solution 함수를 작성했습니다. 그러나, 일부 코드가 잘못되어 코드가 바르게 동작하지 않습니다. 주어진 코드가 모든 입력을 바르게 처리하도록 코드를 수정해주세요. 코드는 _한 줄_만 수정해야 합니다.


3.1 매개변수 설명

one_day_price, multi_day, multi_day_price, n이 순서대로 solution 함수의 매개변수로 주어집니다.

  • one_day_price는 1일 이용권의 가격을 나타냅니다.
  • one_day_price는 1 이상 1000 이하인 자연수입니다.
  • multi_day_price는 multi_day일 이용권의 가격을 나타냅니다.
  • multi_day_price는 1 이상 1000 이하인 자연수입니다.
  • multi_day는 3 이상 5 이하인 자연수입니다.
  • n은 1 이상 10^12 이하인 자연수입니다.

3.2 return값 설명

정확히 n일 연속으로 스키장을 이용하는데 필요한 최소 금액을 return 해주세요.


3.3 예시

one_day_price multi_day multi_day_price n result
3 5 14 6 17
2 3 5 11 19

3.4 예시 설명

예시 #1 앞서 설명한 예와 같습니다.

예시 #2 1일 이용권은 2원, 3일 이용권은 5원입니다. 정확히 11일 동안 스키장을 이용할 때 드는 최소 비용은 다음과 같습니다.

  • 1일 이용권 x 2장 + 3일 이용권 x 3 장 → 2 x 2원 + 3 x 5원 = 19원

문제4

마방진이란 가로, 세로, 대각선 방향의 수를 더한 값이 모두 같은 정사각형 행렬입니다. 마방진에는 1부터 정사각형 넓이까지, 수가 하나씩 배치되어야 합니다. 아래는 가로, 세로, 대각선 방향의 수를 더한 값이 모두 34인 4 x 4 마방진입니다.

KakaoTalk_Photo_2018-09-15-17-58-10.png

4 x 4 행렬의 두 빈칸을 채워 행렬을 마방진으로 완성하려 합니다. 빈칸은 0으로 표시합니다. 이를 위해 다음과 같이 프로그램 구조를 작성했습니다.

1. 두 빈칸의 위치를 찾습니다.
2. 숫자 1 ~ 16 중 존재하지 않는 숫자 2개를 찾습니다.
3. 첫 번째 빈칸에 작은 숫자를, 두 번째 빈칸에 큰 숫자를 넣어 행렬이 마방진이 되는지 검사합니다.
  4-1. 마방진이라면 [작은 숫자의 행 번호, 작은 숫자의 열 번호, 작은 숫자, 큰 숫자의 행 번호, 큰 숫자의 열 번호, 큰 숫자]를 return 합니다.
  4-2. 마방진이 아니라면 [큰 숫자의 행 번호, 큰 숫자의 열 번호, 큰 숫자, 작은 숫자의 행 번호, 작은 숫자의 열 번호, 작은 숫자]를 return 합니다.

4 x 4 크기 2차원 배열 matrix가 매개변수로 주어질 때, 이때 빈칸의 위치와 각 칸에 들어갈 수를 담은 배열을 return 하도록 solution 함수를 작성하려 합니다. 위 구조를 참고하여 코드가 올바르게 동작하도록 빈칸에 주어진 func_a, func_b, func_c 함수와 매개변수를 알맞게 채워주세요.

  • 주어진 행렬은 빈칸을 채우면 반드시 마방진으로 완성할 수 있습니다.

4.1 매개변수 설명

2차원 배열 matrix가 solution 함수의 매개변수로 주어집니다.

  • matrix는 크기가 4 x 4인 2차원 배열입니다.
  • matrix에는 0이 반드시 두 개 들었습니다.
  • matrix에는 1 이상 16 이하인 자연수 14개가 겹치지 않게 들었습니다.

4.2 return 값 설명

빈칸의 위치와 각 칸에 들어갈 수를 담은 배열을 return 해주세요.


4.3 예시

matrix return
[[16,2,3,13],[5,11,10,0],[9,7,6,12],[0,14,15,1]] [4,1,4,2,4,8]

4.4 예시 설명

예시 #1

KakaoTalk_Photo_2018-09-15-18-01-27.png

위 그림에서 빈칸은 (4, 1)과 (2, 4)입니다. 각 칸에 4와 8을 채우면 마방진이 완성됩니다. 따라서 [작은 숫자의 행 번호, 작은 숫자의 열 번호, 작은 숫자, 큰 숫자의 행 번호, 큰 숫자의 열 번호, 큰 숫자]를 return 해야 합니다. 답은 [4, 1, 4, 2, 4, 8]입니다.

KakaoTalk_Photo_2018-09-15-18-01-27 (1).png


문제5

다음과 같이 새로운 숫자를 생성할 때, n번째 생성할 숫자를 구하려고 합니다.

1. 첫 번째 수는 1입니다.
2. 다음수를 1의 자리에 추가합니다.
3. 만든 숫자를 뒤집습니다.
4. 숫자 1부터 9까지 추가하면서 2, 3번째 단계를 반복합니다.
5. 숫자 9까지 추가했다면 다시 숫자 1부터 추가합니다.

n이 매개변수로 주어질 때, n번째로 생성할 수를 문자열 형태로 return 하는 solution 함수를 작성하려 합니다. 위 구조를 참고하여 코드가 바르게 동작하도록 빈칸을 채워주세요.


5.1 매개변수 설명

숫자 n이 solution 함수의 매개변수로 주어집니다.

  • n은 1 이상 1,000 이하인 자연수입니다.

5.2 return값 설명

solution 함수는 n번째 수를 문자열 형태로 return 합니다.


5.3 예시

n return
5 “53124”

5.4 예시 설명

첫 번째 숫자: 1 두 번째 숫자: 21 세 번째 숫자: 312 네 번째 숫자: 4213 다섯 번째 숫자: 53124

따라서 답은 “53124”입니다.


문제6

어떤 자리 수 k가 주어졌을 때 각 자릿수의 k 제곱의 합이 원래 수가 되는 수를 자아도취 수라고 합니다. 예를 들어 153은 세 자리 자아도취 수입니다.

IMG

자연수 k가 매개변수로 주어질 때, k 자리 자아도취 수들을 배열에 오름차순으로 담아 return 하도록 solution 함수를 작성하려 합니다. 빈칸을 채워 전체 코드를 완성해주세요.


6.1 매개변수 설명

k가 solution 함수의 매개변수로 주어집니다.

  • k는 3 이상 6 이하인 자연수입니다.

6.2 return 값 설명

k 자리 자아도취 수를 오름차순으로 정렬한 뒤 배열에 담아 return 합니다.


6.3 예시

k return
3 [153, 370, 371, 407]

6.4 예시 설명

  • 153 = 1^3 + 5^3 + 3^3 = 1 + 125 + 27 = 153
  • 370 = 3^3 + 7^3 + 0^3 = 27 + 343 + 0 = 370
  • 371 = 3^3 + 7^3 + 1^1 = 27 + 343 + 1 = 371
  • 407 = 4^3 + 0^3 + 7^3 = 64 + 0 + 343 = 407

문제7

직사각형의 왼쪽 아래 꼭지점의 좌표, 오른쪽 위꼭지점의 좌표가 주어집니다. 이때 오른쪽 위 꼭지점의 좌표를 x축 방향으로 plus_x만큼, y축 방향으로 plus_y만큼 이동했을 때 사각형의 넓이가 얼마나 증가하는지 구하려 합니다.

먼저 좌표평면 위의 한 점을 나타내는 구조체 Point2D와 직사각형을 나타내는 구조체 Rectangle 을 다음과 같이 정의했습니다.

typedef struct Point2D {
    int x;
    int y;
}Point2D;
typedef struct Rectangle{
    Point2D* LeftDown;
    Point2D* RightUp;
}Rectangle;

또한, 직사각형 넓이가 얼마나 커졌는지 구하기 위해 다음과 같이 프로그램 구조를 작성했습니다.

1. 점과 직사각형을 나타내는 변수를 생성 및 초기화 합니다.
2. 1단계에서 만든 직사각형의 넓이 first_width를 구합니다.
3. 직사각형의 오른쪽 위 꼭지점의 좌표를 주어진 값(plus_x, plus_y) 만큼 이동합니다.
4. 좌표를 이동한 후 직사각형의 넓이 second_width를 구합니다.
5. 4단계에서 구한 직사각형의 넓이 second_width에서 2단계에서 구한 직사각형의 넓이 first_width를 뺀 값을 return 합니다.

직사각형의 왼쪽 아래 꼭지점의 x좌표 x1, y좌표 y1, 직사각형의 오른쪽 위 꼭지점의 x좌표 x2, y좌표 y2, x축 방향으로 꼭지점을 이동시킨 거리 plus_x, y축 방향으로 꼭지점을 이동시킨 거리 plus_y가 매개변수로 주어질 때, 꼭지점을 이동시킨 후 직사각형의 넓이가 얼마나 커졌는지 return 하도록 solution 함수를 작성하려 합니다. 위 구조를 참고하여 코드가 올바르게 동작할 수 있도록 빈칸을 채워 전체 코드를 완성해주세요.


7.1 매개변수 설명

직사각형의 왼쪽 아래 꼭지점의 x좌표 x1, y좌표 y1, 직사각형의 오른쪽 위 꼭지점의 x좌표 x2, y좌표 y2, x축 방향으로 꼭지점을 이동시킨 거리 plus_x, y축 방향으로 꼭지점을 이동시킨 거리 plus_y가 solution 함수의 매개변수로 주어집니다.

  • x1, y1, x2, y2, plus_x, plus_y는 각각 1 이상 100 이하의 자연수입니다.
  • x1 < x2, y1 < y2인 경우만 입력으로 주어집니다.

7.2 return 값 설명

꼭지점을 이동시킨 후 직사각형의 넓이가 얼마나 커졌는지 return해주세요.


7.3 예시

x1 y1 x2 y2 plus_x plus_y return
1 1 5 5 2 1 14

7.4 예시 설명

rectangle.png

  • 직사각형 왼쪽 아래 꼭지점 좌표 : (1, 1)
  • 직사각형 오른쪽 위 꼭지점 좌표 : (5, 5)

따라서 첫 번째 사각형의 넓이는 4 x 4 = 16 입니다.

오른쪽 위 꼭지점의 좌표를 x축으로 2 만큼, y 축으로 1 만큼 이동 하면 오른쪽 위 꼭지점의 좌표는 (7, 6)이 됩니다.

따라서 두 번째 사각형의 넓이는 6 x 5 = 30 이 되며, 두 사각형의 넓이 차이 30 - 16 = 14를 return 하면 됩니다.


문제8

1 이상 9 이하 숫자가 적힌 카드를 이어 붙여 숫자를 만들었습니다. 이때, 숫자 카드를 조합해 만든 수 중에서 n이 몇 번째로 작은 수인지 구하려 합니다.

예를 들어, 숫자 카드 1, 2, 1, 3로 만들 수 있는 수를 작은 순으로 나열하면 [1123, 1132, 1213, 1231, 1312, … , 3121, 3211]입니다. n이 1312라면, 숫자 카드를 조합해 만든 수 중 n은 n은 5번째로 작은 수입니다.

숫자 카드를 담은 배열 card, card의 길이 card_len, 수 n이 매개변수로 주어질 때 숫자 카드를 조합해 만든 수 중에서 n이 몇 번째로 작은 수인지 return 하도록 solution 함수를 완성해주세요.


8.1 매개변수 설명

카드에 적힌 숫자를 담은 배열 card, card의 길이 card_len, 수 n이 solution 함수의 매개변수로 주어집니다.

  • card_len은 항상 9 입니다.
  • card의 원소는 1 이상 9 이하인 자연수입니다.
  • n은 999,999,999 이하인 자연수입니다.
  • n의 자릿수는 card_len과 같습니다.
  • n의 각 자리의 숫자는 1 이상 9 이하입니다.

8.2 return 값 설명

숫자 카드를 조합해 만든 수 중에서 n이 몇 번째로 작은 수인지 return 해주세요.

  • 만약, n을 만들 수 없다면 -1을 return 해주세요.

8.3 예시

card n return
[1, 2, 1, 3] 1312 5
[1, 1, 1, 2] 1122 -1

8.4 예시 설명

예시 #1 앞서 설명한 예와 같습니다.

예시 #2 숫자 카드를 조합하면 [1112, 1121, 1211, 2111]를 만들 수 있습니다. 따라서 1122는 만들 수 없습니다.


문제9

hour 시 minute 분에 아날로그 시계의 시침과 분침이 몇 도를 이루는지 계산하려 합니다. 예를 들어, 3시 00분에 시침과 분침은 90˚를 이룹니다.

어떤 시점의 시 hour, 분 minute이 매개변수로 주어질 때, hour 시 minute 분에 아날로그 시계의 시침과 분침이 이루는 각도를 소숫점 첫번째 자리까지 표현한 문자열을 return 하도록 solution 함수를 작성해주세요.


9.1 매개변수 설명

어떤 시점의 시 hour, 분 minute이 solution 함수의 매개변수로 주어집니다.

  • hour는 1 이상 12 이하인 자연수입니다.
  • minute은 0 이상 59 이하인 정수입니다.

9.2 return 값 설명

hour 시 minute 분에 아날로그 시계의 시침과 분침이 이루는 각도를 소숫점 첫번째 자리까지 표현한 문자열을 return 하세요.

  • 단, 각도는 소수점 이하 첫째 자리까지 표현하세요.

9.3 예시

hour minute return
3 0 “90.0”

9.4 예시 설명

앞서 설명한 예와 같습니다.


문제10

자연수를 제곱한 수는 제곱수, 세 제곱한 수는 세제곱 수라고 합니다. 예를 들어 2^2 = 4 는 제곱수, 3^3 = 27은 세제곱수 입니다.

두 자연수 a, b가 주어질 때 a 이상 b 이하인 자연수 중 _소수_의 제곱수와 세제곱수의 개수를 구하려 합니다. 예를 들어 a = 6, b = 30일 때 소수의 제곱수는 [9, 25]로 2개, 소수의 세제곱수는 [8, 27]로 2개로 총 4개입니다.

두 자연수 a, b가 매개변수로 주어질 때, a 이상 b 이하인 제곱수와 세제곱수의 개수의 합을 return 하도록 solution 함수를 완성해주세요.


10.1 매개변수 설명

두 자연수 a, b가 solution 함수의 매개변수로 주어집니다.

  • a, b는 각각 1 이상 1,000,000,000 이하인 자연수입니다.
  • a ≤ b인 경우만 입력으로 주어집니다.

10.2 return 값 설명

a 이상 b 이하인 제곱수와 세제곱수의 개수의 합을 return 해주세요.


10.3 예시

a b return
6 30 4

10.4 예시 설명

6 이상 30 이하인 수중 소수의 제곱수는 다음과 같습니다.

  • 3^2 = 9
  • 5^2 = 25

소수의 세제곱 수는 다음과 같습니다.

  • 2^3 = 8
  • 3^3 = 27

따라서 4를 return 하면 됩니다.

Comments