기록하고 까먹지 말기

Mid Coding Test 본문

전공/C

Mid Coding Test

yha97 2021. 6. 22. 10:13

이번 중간고사때 있었던 코딩테스트다

 

중간고사이기도 하고 개념이 쉬운 개념만 나왔기 때문에 문제는 전반적으로 어렵지는 않았다.

 

제한시간도 1시간밖에 되지 않았고 다 푸니까 30분정도 남았어서 지루하게 기다렸던 기억이 있다.

 

#include <stdio.h>

int main(){
	int time = 0; // input seconds from user 
	int h, m, s; // declaring variables
	
	printf("Q) seconds? "); // asking and enter a time
	scanf("%d", &time);
	
	// calculating hour, minute and seconds
	h = time / 3600;
	time %= 3600;
	m = time / 60;
	time %= 60;
	s = time;
	
	// printing outputs
	printf("A) %d hours %d minutes %d seconds", h, m, s);
	return 0;
}

먼저 첫 번째 문제다. 

 

variable 챕터에 있는 것처럼 time을 입력받은 후 시, 분, 초 단위로 나누어 출력하는 문제다.

 

div와 mod를 적절히 사용한다면 간단하게 해결 가능하다.

 

#include <stdio.h>

int main(){
	int n; // declaring variable
	
	printf("Q) number? ");
	scanf("%d", &n); // entering number from user
	
	//printinf outputs
	printf("A)\n");
	printf("decimal number: %d\n", n); // printing in decimal
	printf("octal humber: %o\n", n); // printing in octal
	printf("hexadecimal number: %x", n); // printing in hexadecimal
	
	return 0;
}

두 번째 문제다. 수를 입력받고 2진수, 8진수, 16진수를 출력하는 문제다.

 

각 진수별 출력방식만 알고 있으면 쉽게 해결 가능하다.

 

#include <stdio.h>

int main(){
	int n1, n2; // declaring 2 numbers
	char op; // deslaring operator
	
	// entering n1, n2, and operator from user
	printf("Q) num1 operator num2? ");
	scanf("%d %c %d", &n1, &op, &n2);
	
	// printing outputs
	
	// devide cases between entered operator(charactor)
	switch(op){
		case '+': // addition case
			printf("A) %d", n1+n2);
			break;
		case '-': // subtraction case
			printf("A) %d", n1-n2);
			break;
		case '*': // multiplication case
			printf("A) %d", n1*n2);
			break;
		case '/': // division case
			if(n2 == 0){ // if dividing with 0
				printf("num2 error!"); // printing error
				break;
			}
			printf("A) %d...%d", n1/n2, n1%n2); // printing division and rests
			break;
		default : // etc case
			printf("operator error!");
	}
	
	return 0;
}

세 번째 문제다.

 

숫자 연산자 숫자를 차례대로 입력받고 연산자에 따라 계산을 하는, 즉 계산기를 만드는 프로그램이다.

 

연산자에 기반하여 switch문을 만들고 거기에 default문을 넣어 operator error까지 넣으면 끝.

 

덧셈
뺄셈
곱셈
나눗셈(나머지까지 함께 출력)
잘못된 operator 입력시

 

#include <stdio.h>

void Check(int n){ // declaring function check if it is a leap year
	if((n % 4 == 0) && (n % 100 != 0)) // multiple of 4 and not multiple of 100 -> leap year
		printf("A Leap year"); // printing output
	else if((n % 400) == 0) // multiple of 400 -> leap year
		printf("A Leap year"); // printing output
	else // etc -> not leap year
		printf("Not a leap year"); // printing output
	
	return;
}

int main(){
	int y; // declare year
	printf("year? ");
	scanf("%d", &y); // inputs year from user
	
	// check if entered year is positive, and under 10000
	if(y < 0 || y >= 10000){
		printf("year error");
		return 0;
	}
	
	Check(y); // send value to function as parameter
	return 0;
}

윤년을 판별하는 문제다.

 

윤년은 연도가 4의 배수이면서, 100의 배수가 아닐 때 또는 400의 배수일 때이다. (출처 : 위키피디아)

 

윤년 판독을 위한 함수를 만들고 그 안에 if~else문을 사용하여 아웃풋을 출력하는 방식으로 해결했다.

 

또한 지정된 범위가 아닌 수를 입력받은 경우 프로그램을 종료하는 조건이 있었기 때문에 입력받은 이후 원하는 범위가 아닐 경우 return 0;을 통해 프로그램을 종료하도록 만들었다.

 

#include <stdio.h>

void CheckPalindrome(int n){ // declaring function checking it parameter is palindrome number
	int comp = 0; // comp : comparing number with parameter
	int temp = n; // temporary number
	
	while(temp > 0){
		comp += temp % 10; // adding modular of temp to comp
		comp *= 10; // multiply 10 to comp
		temp /= 10; // divide 10 to temp
	}
	comp /= 10; // after exit while loop, dividing 10
	
	// comparing comp and parameter
	if(n == comp) // if same
		printf("A palindrome number"); // printing output
	else // if not
		printf("Not a palindrome number."); // printin output
	
	return ;
}

int main(){
	int num=0; // declaring variable
	
	printf("Palindrome number? ");
	scanf("%d", &num); // enter a number from user
	
	// check if entered number is positive number
	if(num <= 0){
		printf("Entered number is not positive number!");
		return 0; // if not, quit program
	}
	
	CheckPalindrome(num); // send value to function checking if number is palindrome number
	
	return 0;
}

수를 입력받은 후 그 수가 Palindrome number인지 판별하는 문제이다.

 

Palindrome number는 각 수의 자리수를 비교했을 때 정확히 대칭인 수이다.

 

예를 들어 12345의 경우 1 과 5, 2와 4를 비교했을 때 서로 다르기 때문에 12345는 Palindrome number가 아니라고 할 수 있다. 만면, 12321의 경우 첫 번째와 다섯번째 자리의 경우 모두 1, 두 번째와 네 번째 자리의 경우 모두 2이기 때문에 12321은 Palindrome number라고 할 수 있다.

 

문제를 풀기 위해 먼저 입력받은 수가 양수인지 판별하였다.

 

그리고 그 수를 Palindrome number 여부를 체크하기 위해 이를 위한 함수로 값을 보냈다.

 

CheckPalindrome 함수에서는 비교 목적의 변수인 comp를 초기화하여 인자인 n의 자릿수에서 역순으로 만드는 방식으로 while문을 만듦으로써 비교 대상을 만들었다. 즉, 12345인 경우 comp는 54321인 형식으로 구현, n과 comp가 최종적으로 동일한 경우 palindrome number라는 결론이 나타나도록 만든 것이다.

 

때문에 서로 동일 한 경우와 동일하지 않은 경우를 if~else문을 통해 결과를 출력하였다.

 

 

 

 

이번 코딩테스트는 위에 있던 것처럼 배운 개념이 어렵지 않았기 때문에 과제를 스스로 풀었다면 큰 어려움은 없었을 것이라고 생각한다.

 

이 코드를 마음대로 긁어가서 사용하는것은 상관 없지만.... 이걸 본다면 다른 사람들도 본다는 것이기 때문에 적당히 참고용으로만 사용하기를 바란다.

'전공 > C' 카테고리의 다른 글

과제8 - Pointer_Array (1 ~ 5)  (0) 2021.06.22
과제7 - Array (1 ~ 4)  (0) 2021.06.22
과제 6 - Function (6 ~ 9)  (0) 2021.06.22
과제 6 - Function (1 ~ 5)  (0) 2021.06.21
과제 5 - Control Flow 2 (6 ~ 9)  (0) 2021.06.21