본문 바로가기
개발/알고리즘 풀이...

[백준] 2908 풀이

by p_human 2019. 12. 29.

오랜만에 심심해서 알고리즘을 풀어봤습니다.

참고로 이 문제는 문자열 관련 알고리즘을 사용해서 푸는 문제인데, 귀찮아서 숫자로 풀었습니다.

상근이의 동생 상수는 수학을 정말 못한다. 상수는 숫자를 읽는데 문제가 있다. 
이렇게 수학을 못하는 상수를 위해서 상근이는 수의 크기를 비교하는 문제를 내주었다. 
상근이는 세 자리 수 두 개를 칠판에 써주었다. 그 다음에 크기가 큰 수를 말해보라고 했다.

상수는 수를 다른 사람과 다르게 거꾸로 읽는다. 
예를 들어, 734과 893을 칠판에 적었다면, 상수는 이 수를 437과 398로 읽는다. 
따라서, 상수는 두 수중 큰 수인 437을 큰 수라고 말할 것이다.

두 수가 주어졌을 때, 상수의 대답을 출력하는 프로그램을 작성하시오.

입력
첫째 줄에 상근이가 칠판에 적은 두 수 A와 B가 주어진다. 두 수는 같지 않은 세 자리 수이며, 0이 포함되어 있지 않다.

출력
첫째 줄에 상수의 대답을 출력한다.

예제 입력 1
734 893
예제 출력 1
437

문제가 이런식으로 되어 있더라고요. 저번에는 너무 어렵게 생각해서(어렵게 생각할 것도 없지만...)문자열이라는 생각을 버리고 숫자로 접근을 하니 쉽게 풀렸습니다.

 

 

예를 들면 786과 345라는 숫자가 있습니다.

786에서 각각의 자리수를 추출하려면 어떻게 해야 할까요?

손으로 풀어보는게 최고죠...

손으로 풀었다고 가정하고, 정답 공개...

int create_num(int num){
	// 첫 번째 자리수
	int first = num % 10 * 100;
	// 두 번째 자리수
	int second = ((num % 100) / 10) * 10;
	// 세 번째 자리수
	int third = num / 100;
	return first + second + third;
}

 

전 이렇게 풀고 나서, 좀 더 생각을 해보니 초등학생도 이해할 수 있는게 생각이 났습니다. 길게 말 안하고 바로 풀이를 보여드리겠습니다...

int create_num(int num){
	int first = num / 100;
	int third = num % 10;
	int dif = first - third;
	num = num - (dif*100) + dif;
	return num;
}

어짜피 10의 자리는 움직이지 않으니까 100의 자리수와 1의 자리수를 빼서 나온 값을 사용하면 뭔가 나오지 않을까? 해서 나온 결과네요...

예를들어서 456이라는 숫자를 가지고 해볼게요.

먼저 4와 6을 추출해서 빼면 2가 되죠. 굳이 식으로 나타내자면 4 - 6 = -2가 됩니다.

그 다음 100의 자리수를 변경해보겠습니다.

구해놓은 -2 * 100을 빼줍니다. 식을 세워보면 456 - ((-2) * 100)이 됩니다. 결과는 656이라는 값이 나오고요.

 

그리고 이번에는 1의 자리수를 변경할 차례입니다.

위에서 구해놓은 656에 -2를 더하게 되면 654가 됩니다.

 

이렇게 해서 전체적인 식은 위의 정답과 같이

num - (dif*100) + dif가 되겠습니다.

 

허접한 글 봐주셔서 감사합니다.

'개발 > 알고리즘 풀이...' 카테고리의 다른 글

[백준] 4796번 문제 풀이  (0) 2021.03.12
[백준] 1946번 문제  (0) 2021.03.10
[백준] 2217번 문제  (0) 2021.03.09
[백준] 11052번 문제 풀이  (0) 2021.03.05
[백준] 1316 풀이  (0) 2020.06.05