본문 바로가기

# 프로그래밍 개발/04. 알고리즘 문제풀이

백준 알고리즘 2909번 [캔디 구매] - 수학/구현 알고리즘 문제 풀이코드 공개

반응형
대문 이미지

오늘은 화이트데이이다. 상근이는 여자친구를 위해서 사탕을 사려고 한다. 하지만, 상근이는 독특한 성격을 가지고 있어서, 특정 액면가의 지폐만 가지고 있는다. 또, 거스름돈은 받지 않는다. 따라서, 사탕 가게의 사장과 상근이는 다음과 같은 합의를 했다. 상근이는 사장에게 자신이 가지고 있는 지폐의 액면가를 말해준다. 그럼 사장은 상근이가 지불할 수 있는 가장 가까운 금액으로 사탕의 가격을 반올림해준다.

예를 들어, 상근이가 가지고 있는 지폐의 액면가가 100원이라고 하자. 만약 상근이가 고른 사탕의 가격이 150원이라면, 사장은 가격을 200원으로 반올림해서 상근이가 낼 수 있도록 해준다. 또, 가격이 149원이라면, 사장은 가격을 100원으로 반올림해서 상근이가 지불할 수 있도록 해준다.

상근이가 가지고 있는 지폐의 액면가는 항상 1, 10, 100, 1000, ..., 1,000,000,000 중 하나이다. 또, 지폐를 무한개 가지고 있다.

사탕 가격과 상근이가 가지고 있는 지폐의 액면가가 주어졌을 때, 사장은 가격을 얼마로 바꿔줄 것인지 구하는 프로그램을 작성하시오.

입력

첫째 줄에 사탕의 가격 C와 상근이가 가지고 있는 지폐의 액면가에 적혀있는 0의 개수 K가 주어진다. (0 ≤ C ≤ 1,000,000,000, 0 ≤ K ≤ 9)

출력

첫째 줄에 상근이가 내야하는 가격을 출력한다.

 

 

출처

Contest > Croatian Open Competition in Informatics > COCI 2009/2010 > Contest #3 2번

알고리즘 분류

 

문제 풀이 코드 제출 결과
왜 틀린거지..?

 

반응형

먼저 틀린 코드 부터 공개하겠습니다. 왜 틀린지 알아야 다른 분들도 안 틀리겠죠? 

#include<cstdio>
int main(){
	long long int c;
	int k;
	scanf("%lld %d",&c,&k);
	if(k == 0){
		printf("%lld\n",c);
	}else{
		int t = 1;
		for(int i = 0 ; i < k ; i++){
			t *= 10;
		}
		long long int a = c / t * t;
		if((c % t) % t/10 >= 5){
			a += t/10*10;
		}
		printf("%lld\n",a);
	}
}

다음은 정답 코드입니다. 

#include<cstdio>
int main(){
	long long int c;
	int k;
	scanf("%lld %d",&c,&k);
	if(k == 0){
		printf("%lld\n",c);
	}else{
		int t = 1;
		for(int i = 0 ; i < k ; i++){
			t *= 10;
		}
		long long int a = c / t * t;
		if((c % t) / (t/10) >= 5){
			a += t/10*10;
		}
		printf("%lld\n",a);
	}
}

일단 이 문제는 값의 법위로 장난치는 문제인 것은 확실하네요. 데이터 출력 형태가 %lld 라니.. 이걸 현업에서 쓰는 분들은 누구일까요?  아마.. 빅데이터를 처리하시는 분? 아니면 금융권에서 쓰지 않을까 싶어요. 아니면 게임 화폐라든지 코인? 도 쓸 수는 있겠네요. 하지만 저같은 연구쟁이는 쓰지 않는답니다 하하 무튼. 

몫을 구해야하는데 나머지를 구하는 연산을 사용해서 틀려버렸네요. 

실수하지 말아야 겠습니다. 

수학이나 구현문제는 여러 문제를 접해보는 것이 무엇보다도 중요합니다. 문제를 출제하시는 분들도 다 어디선가 유형을 보고 와서 출제하는 것이고, 문제에 대한 백그라운드(?) 설명문은 중요하지 않고 안에 내용이 중요하니까요. 유형은 다 거기서 거기입니다. 그러니 많이 풀어보시고 코딩테스트에 임하시길 바라겠습니다. 

이상 다이어릿이었습니다! 

 

반응형