개발/코딩테스트

코드업(codeup.co.kr) 1180 : 만능 휴지통 해설 (C언어)

ensuta 2022. 5. 1. 22:44
728x90
반응형

문제 설명 

철수는 발명을 되게 좋아한다.  컴퓨터 프로그램도 굉장히 좋아한다.

어느 날 민호는 컴퓨터를 사용하던 중 휴지통이 꽉 차서 불편했다.

그래서 휴지통이 n만큼 차면 알아서 쓰레기를 압축해주는 휴지통을 만들기로 했다.

이 때 압축하는 알고리즘은 다음과 같다.

10의 자릿수와 1의 자릿수를 서로 바꾸고, 거기에 2를 곱한다.

EX) 70일 경우 14가 된다.( 70 -> 07 -> 14 )

 

이 알고리즘은 가끔 부작용을 일으킨다. 오히려 휴지통의 내용이 더 많아 질지도 모른다.

만약  n 수치가 100이 넘는 이 알고리즘의 심각한 부작용이 일어난다면 100의 자릿수는 무시된다.

입력

휴지통의 자동 압축 기준인 수치 n이 입력된다(1<=n<=99)

출력

1번째 줄에 휴지통을 압축했을 때 양을 출력한다.

2번째 줄에 그 양이 50이하이면 GOOD 을 출력하고, 50을 넘으면 OH MY GOD 을 출력한다.

입력 예시

90

출력 예시

18
GOOD

 

1) 나머지를 이용하는 방법

#include <stdio.h>
 
int main() {
    int n, bin;
  
    scanf("%d", &n);
    
    bin = (n % 10 * 10) + (n / 10);		//십의 자리와 일의 자리를 바꾼다. 
    bin = bin * 2;				//2배 한다.
    bin = bin % 100;				//100의 자리를 무시한다.
    printf("%d\n", bin);
    if (bin<=50){
        printf("GOOD");
    }else{
        printf("OH MY GOD");
    }
    return 0;
}

나눗셈의 특성을 이용하여 십의 자리와 일의 자리를 바꾸는 방법이다.

수학적으로 풀어낸 훌륭한 풀이이다.

n 을 10으로 나눴을 때

10의 자리 = 몫

1의 자리 = 나머지 이므로

 

나머지에 10를 곱한다.

 

1의 자리 -> 10의 자리

몫 -> 1의 자리

100의 자리를 무시하므로 나머지만 취한다.

 

 

2) 십의 자리, 일의 자리를 나눠서 푸는 방법

#include<stdio.h>
int main() {
int n,ten,one;
scanf("%01d%01d",&ten,&one);	//처음부터 십의자리와 일의 자리를 따로 입력받는다.
num = (10*one + ten)*2;			
if(n>100){			//결괏값이 98이하인 것을 이용
    n = n - 100;
}
printf("%d\n",n);
if(num<=50){
    printf("GOOD");
}else{
    printf("OH MY GOD");
}
return 0;
}

n의 정의역을 이용한 방법이다.

n이 알고리즘을 거치면 아무리 커도 98 까지 나오는 특성을 이용한 프로그램이다.

 

반응형