코딩 테스트 5회 모의고사

Yun Young Choi·2023년 1월 5일

CodingTest-C

목록 보기
15/15
post-thumbnail

5회차 모의고사 10문제 풀이


1. 도착지까지 충전 횟수를 구하는 함수 작성하기

👀 문제 : 전기 자동차를 사용하여 출발하는 도시를 포함하여 N개의 도시를 지나야한다. 이용할 자동차는 완충시 40km를 탈 수 있고 그 이후엔 충전을 해야한다. 완충 상태로 출발한 이후 도착할 때까지 몇 번 충전해야 하는지 구하기

#include <stdio.h>

int solution(int arr[], int N) {
	int answer = 0;
	int cnt = 0;
	for (int i = 0; i < N; i++) {
		answer += arr[i];
		if (answer >= 40) {
			cnt++;
			answer -= 40;
		}
	}

	return cnt;
}

int main() {
	int arr[] = { 20,10,30,30 };
	int n = 4;
	int ret = solution(arr, n);
	printf("배터리 충전 횟수 : %d\n", ret);
}

코드 설명

  1. answer 변수에 이동 거리를 더한다.
  2. 만약 더한 값이 40km 이상이면 방전됐다는 의미
  3. 충전 횟수 cnt 변수에 1을 더한다.
  4. 충전했으니 40km 더 이동할 수 있으므로 - 40
  5. 충전 횟수 cnt 반환

20
30
60 -> 충전

(60 - 40)
20
50 -> 충전


그림으로 간단하게 표현하자면 이런 느낌일 것이다.


2. 3개 사면 추가 한 개는 50% 할인 행사의 금액을 계산하는 함수 빈칸

👀 문제 : 어떤 편의점 개업 행사로 편의점 내 어떤 상품이든 3개를 사면 추가로 하나의 상품을 50% 할인된 가격으로 살 수 있고, 3개 미만 구매 시 적용 X
예를 들어 [100, 500, 300, 400, 300]인 상품을 가져온 경우 지불할 금액은 100 + 500 + 300 + (400 * 50%) + 300이다.

#include <stdio.h>

int solution(int arr[], int arr_len) {
	int answer = 0;
	int price = 0;

	for (int i = 0; i < arr_len; i++) {
		price = arr[i];
		if (빈칸 % 4 == 0) {
			price[빈칸];
		}

		answer += price;
	}
	
	return answer;
}

int main() {
	int arr1[] = { 100, 500, 200, 400, 300 };
	int arr_len1 = 5;
	int ret1 = solution(arr1, arr_len1);

	printf("가격 : %d", ret1);

	int arr2[] = { 100, 500};
	int arr_len2 = 2;
	int ret2 = solution(arr2, arr_len2);

	printf("가격 : %d", ret2);
}

코드 설명

  1. 구매한 물품의 길이만큼 반복
  2. price 변수에 해당 인덱스의 가격 할당
  3. 만약 물품의 개수가 3개 미만이 아니라면(4로 나누어 떨어진다면)
  4. price 값을 반으로 나눈다.
  5. answer에 price 값을 더한다.

빈칸 채우기

#include <stdio.h>

int solution(int arr[], int arr_len) {
	int answer = 0;
	int price = 0;

	for (int i = 0; i < arr_len; i++) {
		price = arr[i];
		if (arr_len % 4 == 0) {
			price /= 2;
		}

		answer += price;
	}
	
	return answer;
}

int main() {
	int arr1[] = { 100, 500, 200, 400, 300 };
	int arr_len1 = 5;
	int ret1 = solution(arr1, arr_len1);

	printf("가격 : %d", ret1);

	int arr2[] = { 100, 500};
	int arr_len2 = 2;
	int ret2 = solution(arr2, arr_len2);

	printf("가격 : %d", ret2);
}

3. 목재소의 매출액 구하는 함수 잘못된 부분 수정

👀 문제 : 목재 사장은 길이 8인 목재만 취급, 주만받은 길이만큼 잘라 판매
예를 들어 길이 2, 6 으로 2개의 목재로 판매하거나, 길이 2로 4개 팔거나
목재 길이 개당 3,000원에 판매

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

int func_a(int a[], int n, int length) {
	for (int i = 0; i < n; i++) {
		if (a[i] >= length) {
			return i;
		}
	}

	return -1;
}

int soltion(int N, int orders[], int orders_len) {
	int* material = (int*)malloc(sizeof(int) * N);
	int k = 0;
	int price = 0;

	for (int i = 0; i < N; i++) {
		material[i] = 0;
	}

	for (int i = ; i < orders_len; i++) {
		k = func_a(material, N, orders[i]);
		if (k >= 0) {
			material[k] -= orders[i];
			price += 3000 * orders[i];
		}
	}

	return price;
}

코드 설명

func_a 함수
1. 현재 목재 배열,현재 목재 개수, 목재 길이가 저장된 배열을 매개변수로 받는다.
2. 현재 목재 개수만큼 반복을 돌린다.
3. 만약 현재 목재 배열이 주문한 목재 배열 길이보다 짧으면 조각 가능한 목재 개수 리턴


잘못된 부분

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

int func_a(int a[], int n, int length) {
	for (int i = 0; i < n; i++) {
		if (a[i] >= length) {
			return i;
		}
	}

	return -1;
}

int soltion(int N, int orders[], int orders_len) {
	int* material = (int*)malloc(sizeof(int) * N);
	int k = 0;
	int price = 0;

	for (int i = 0; i < N; i++) {
		material[i] = 8; // 0이 아니라 사장이 취급하는 길이인 8로 해야함
	}

	for (int i = ; i < orders_len; i++) {
		k = func_a(material, N, orders[i]);
		if (k >= 0) {
			material[k] -= orders[i];
			price += 3000 * orders[i];
		}
	}

	return price;
}

int main() {
	int 
}

4. 전화번호 형식에 맞추어 변경하는 함수 수정하기

👀 문제 : 영업사원이 지난 일 년간 모은 명합을 정리하려고 한다. 모아보니 다양한 명함이 많다. 그래서 전화번호만 모아 규칙으로 정리
규칙 1. 국가, 지역을 의마 X
규칙 2. 무조건 '0' 으로 시작
규칙 3. A-B-C 형식으로 3-4-4
예를 들어 공백인 곳을 -로 메꿔주거나 10으로 시작하는 번호 맨 앞에 0을 넣어준다거나 임의의 문자열number를 매개변수로 받아 미리 정학 형식의 문자열 return

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

int func_a(char arr[], char src[]) {
	int k = 0;
	for (int i = 0; i < src[i] != 0; i++) {
		if ('0' <= arr[i] && src[i] <= '9') {
			arr[k++] = src[i];
		}
	}

	arr[k] = 0;
	return k;
}

char* solution(char num[]) {
	char* copy = (char*)malloc(sizeof(char) * strlen(num) + 1);
	char* answer = (char*)malloc(sizeof(char) * 14);
	int k = 0;
	if (num[0] != '0') {
		copy[k++] = '0';
	}

	func_a(copy, num);

	if (strlen(copy + 3) < 8) {
		answer[4] = '0';
	}
	k = 0;

	for (int i = 0; i < copy[i] != 0; i++) {
		answer[k++] = copy[i];
		if (k == 3 || k == 8) {
			answer[k++] = '-';
		}
		if (k == 4 && answer[k] == '0') { 
			k++;
		}
	}

	answer[k] = 0;
	free(copy);
	
	return answer;
}

int main() {

}

코드 설명

solution 함수의 첫 번째 if문을 보면 만약 첫 자리가 0이 아니면 copy[k++] = '0'; 으로 0을 삽입하게 해준다.
그 다음에 func_a를 호출하게 되는데 1번부터 복사해야하기 때문에
if문에서 k++이 되어 k = 1이 됐으니까 func_a(copy + k, num); 을 한다.

수정

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

int func_a(char arr[], char src[]) {
	int k = 0;
	for (int i = 0; i < src[i] != 0; i++) {
		if ('0' <= arr[i] && src[i] <= '9') {
			arr[k++] = src[i];
		}
	}

	arr[k] = 0;
	return k;
}

char* solution(char num[]) {
	char* copy = (char*)malloc(sizeof(char) * strlen(num) + 1);
	char* answer = (char*)malloc(sizeof(char) * 14);
	int k = 0;
	if (num[0] != '0') {
		copy[k++] = '0';
	}

	func_a(copy + k, num);

	if (strlen(copy + 3) < 8) {
		answer[4] = '0';
	}
	k = 0;

	for (int i = 0; i < copy[i] != 0; i++) {
		answer[k++] = copy[i];
		if (k == 3 || k == 8) {
			answer[k++] = '-';
		}
		if (k == 4 && answer[k] == '0') {
			k++;
		}
	}

	answer[k] = 0;
	free(copy);
	
	return answer;
}

int main() {

}

5. 주차장 요금 정산하는 함수 빈칸 채우기

👀 문제 : 기본 요금 1,000원, 10분당 500원 추가 요금
주차된 차들이 들어온 시간을 4자리 정수로 두고 나갈 때 요금 청산, 시간은 24제
예를 들어 시간이 14000인 경우 오후 2시, 530인 경우 오전 5시 30분
모든 차량은 밤 10시에 정산 후 나가고 직원 교대 및 식사 후 밤 12시(0시)에 영업 시작

#include <stdio.h>

int func_a(int a) {
	return ((a / 100) * 60) + (a % 100);
}

int solution(int arr[], int arr_len) {
	int answer = 0;
	int min_a;
	int min_b;

	min_a = func_a(빈칸);

	for (int i = 0; i < arr_len; i++) {
		min_b = func_a(빈칸);
		answer += 1000 + ((min_a - min_b) / 10) * 500;
	}

	return answer;
}

코드 설명

func_a 함수
1. 매개 변수로 받은 a를 100으로 나눈 후 a를 100으로 나눈 나머지와 더한다.

solution 함수
1. answer, min_a, min_b 변수 선언
2. min_a는 밤 10시에 정산이 끝나기 때문에 밤 10시를 뜻하는 24시간제 2200을 매개변수로 보낸다.
3. 남아있는 자동차의 길이만큼 반복한다.
4. min_b는 배열 속 차들의 정산 요금을 각각 구한다.
5. answer에 1000 + ((min_a - min_b) / 10) 500을 대입한다
(1000은 기본 요금, min_a - min_b는 밤 10시 - 들어온 시간,
500은 10분당 요금)

빈칸 채우기

#include <stdio.h>

int func_a(int a) {
	return ((a / 100) * 60) + (a % 100);
}

int solution(int arr[], int arr_len) {
	int answer = 0;
	int min_a;
	int min_b;

	min_a = func_a(2200);

	for (int i = 0; i < arr_len; i++) {
		min_b = func_a(arr[i]);
		answer += 1000 + ((min_a - min_b) / 10) * 500;
	}

	return answer;
}

6. KTX 승차 인원 구하는 함수 빈칸 채우기

👀 문제 : 6량 열차로 운행, 각 좌석은 40개이다. 만약 좌석이 부족한 경우 서서 가야한다. 출발-도착까지 N개의 역을 지나는 동안 내리는 사람, 타는 사람이 있습니다. 안전상 서서가는 사람들을 최소화시키기 위해 승차 인원에 대한 조사로 입석인 사람이 가장 많을 때가 몇 명인지 파악하기

#include <stdio.h>

int solution(int down[], int up[], int N) {
	int answer = 0;
	int stand = 0;
	int passenger = 0;

	for (int i = 0; i < N; i++) {
		passenger += up[i] - down[i];
		stand = 빈칸
		if (stand > 0 && stand > answer) {
			answer = 빈칸;
		}
	}

	return answer;
}

코드 설명

  1. 하차 배열, 승차 배열, 출빌-도착역 까지 개수 N 매개변수로 받기
  2. 가장 많은 입석 수를 넣을 answer, 입석 수 stand, passenger 앉은 사람 좌석 수
  3. 역개수까지 반복 돌리기
  4. passenger에 승차 - 하차로 현재 앉은 좌석 구하기
  5. stand = passenger - 240이 서 있는 사람 수
  6. 만약 입석 수가 0보다 크고 answer보다 크다면 answer에 stand 대입

빈칸 채우기

#include <stdio.h>

int solution(int down[], int up[], int N) {
	int answer = 0;
	int stand = 0;
	int passenger = 0;

	for (int i = 0; i < N; i++) {
		passenger += up[i] - down[i];
		stand = passenger - 240;
		if (stand > 0 && stand > answer) {
			answer = stand;
		}
	}

	return answer;
}

7. 판매 이익금 구하는 함수 수정하기

👀 문제 : 상품을 들여오는 원가에 각각 다른 비율로 이익률을 더하여 판매가로 산정한다. 코드 일부분이 잘못되었으니 수정해보자.

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

double func_a(double a[], int n) {
	double min;
	min = a[0];

	for (int i = 0; i < n; i++) {
		if(a[i] < min) {
			min = a[i];
		}
	}


	return min;
}

int solution(int arr[][2], int arr_len) {
	double* sales = (double*)malloc(sizeof(double) * arr_len);
	double percent;

	for (int i = 0; i < arr_len; i++) {
		if (arr[i][0] < 5000) percent = 0.25;
		else if (arr[i][0] < 15000) percent = 0.2;
		else if (arr[i][0] < 100000) percent = 0.15;
		else percent = 0.1;

		sales[i] = arr[i][0] * percent + arr[i][1];
	}

	return (int)func_a(sales, arr_len);
}

코드 설명

func_a 함수 설명
1. 매개변수로 들어온 a 배열과 a의 길이 n
2. a 배열의 첫 번째를 임의의 최솟값으로 지정
3. a의 길이로 반복하기
4. 만약 a의 첫 값이 해당 인덱스의 a배열보다 크면 min 변수는 a[i]의 값을 가짐
5. 즉 최소값을 구하는 함수

solution 함수
1. 판매가를 넣을 배열을 동적할당
2. 세일 퍼센트를 넣을 변수
3. 배열의 길이만큼 반복
4. 만약 5000원 미만이면 세일률 : 0.25%
... 쭉쭉
5. 판매가를 넣을 배열 = 상품 원가 할인률 + 상품 개수
가 아니라 = **상품 원가
할인률 * 상품 개수** 여야 하므로


코드 수정

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

double func_a(double a[], int n) {
	double min;
	min = a[0];

	for (int i = 0; i < n; i++) {
		if(a[i] < min) {
			min = a[i];
		}
	}


	return min;
}

int solution(int arr[][2], int arr_len) {
	double* sales = (double*)malloc(sizeof(double) * arr_len);
	double percent;

	for (int i = 0; i < arr_len; i++) {
		if (arr[i][0] < 5000) percent = 0.25;
		else if (arr[i][0] < 15000) percent = 0.2;
		else if (arr[i][0] < 100000) percent = 0.15;
		else percent = 0.1;

		sales[i] = arr[i][0] * percent * arr[i][1];
	}

	return (int)func_a(sales, arr_len);
}

8. 직선 교차하는 두 직선, x축선이 이루는 삼각형 면적 구하는 함수 작성하기

#include <stdio.h>

double solution(int x, int y) {
	double answer;
	double b1 = y - x;
	double b2 = y + x;
	double a1 = (y * (x - b1)) / 2.0;
	double a2 = (y * (b2 - x)) / 2.0;

	answer = a1 + a2;

	return answer;
}

9. 업다운 숫자게임 정답 찾는 함수 빈칸 새우기

👀 문제 : 컴퓨터와 철수가 숫자 게임한다. 컴퓨터가 부른 숫자가 답보다 작으면 d 입력, 크면 u 입력 같으면 c 입력
예를 들어 정답은 17, 컴퓨터가 25면 u, 17이면 c로 같으니까 종료

#include <stdio.h>

int solution(char answer[]) {
	int min = 1;
	int max = 100;
	int result;

	for (int i = 0; i < answer[i] != 0; i++) {
		result = (max + min) / 2;

		if (min == max || answer[i] == 'c') break;
		if (answer[i] == 'u') 빈칸;
		if (answer[i] == 'd') 빈칸;
	}

	return answer;
}

빈칸 고치기

#include <stdio.h>

int solution(char answer[]) {
	int min = 1;
	int max = 100;
	int result;

	for (int i = 0; i < answer[i] != 0; i++) {
		result = (max + min) / 2;

		if (min == max || answer[i] == 'c') break;
		if (answer[i] == 'u') max = result;
		if (answer[i] == 'd') min = result;
	}

	return answer;
}

10. 빌라 세대별 전기 요금

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

int* solution(int arr[], int arr_len, int bill) {
	int* result = (int*)malloc(sizeof(int) * arr_len);
	int unit_price = (bill / arr[0]) + 1;
	for (int i = 0; i < 8; i++) {
		result[i] = arr[i] * unit_price;
	}

	return result;
}
#include <stdio.h>
#include <stdlib.h>

int* solution(int arr[], int arr_len, int bill) {
	int* result = (int*)malloc(sizeof(int) * arr_len);
	int unit_price = (bill / arr[0]) + 1;
	for (int i = 0; i < 8; i++) {
		result[i] = arr[i + 1] * unit_price;
	}

	return result;
}
profile
안냥하세요

0개의 댓글