- 문제
어떤 수 X가 주어졌을 때, X의 모든 자리수가 역순이 된 수를 얻을 수 있다. Rev(X)를 X의 모든 자리수를 역순으로 만드는 함수라고 하자. 예를 들어, X=123일 때, Rev(X) = 321이다. 그리고, X=100일 때, Rev(X) = 1이다.
두 양의 정수 X와 Y가 주어졌을 때, Rev(Rev(X) + Rev(Y))를 구하는 프로그램을 작성하시오- 입력
첫째 줄에 수 X와 Y가 주어진다. X와 Y는 1,000보다 작거나 같은 자연수이다.- 출력
첫째 줄에 문제의 정답을 출력한다.
#include<iostream>
#include<vector>
#include<cmath>
using namespace std;
int X, Y;
vector<int> temp;
void fast_io() {
ios_base::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
}
void input() {
cin >> X >> Y;
}
int reverseNum(int number) {
while (number > 0)
{
temp.push_back(number % 10);
number = number / 10;
}
int result = 0;
for (int i = 0; i < temp.size(); i++)
{
result += temp[i] * pow(10, temp.size() - 1 - i);
}
temp.clear();
return result;
}
int main() {
fast_io();
input();
int RevX = reverseNum(X);
int RevY = reverseNum(Y);
cout << reverseNum(RevX + RevY);
return 0;
}
문제의 조건이 1000까지의 숫자이고 2초가 주어졌다.
입력의 범위가 적고 시간이 충분하여 그냥 단순 구현을 어떻게 할 것인가 물어보는 문제인 것 같다.
숫자를 뒤집기 위해 해당 숫자의 나머지를 vector에 넣고 pow(10,~)를 통해서 다시 원상복구를 시켰다. (이때 reverseNum 함수에서 vector를 비워주지 않으면 쓰레기 값이 출력될 것이다)
클린코드 책의 내용 적용과 모듈화를 간단한 문제에서부터 연습을 꾸준히 해야할 것 같다. (이정도면 X,Y를 제외하면 나름 잘 읽히지 않을까 싶다..)
#include <stdio.h>
int rv(int n){
int r=0;
while(n>0){
r=r*10+n%10;
n/=10;
}
return r;
}
main(){
int a,b;
scanf("%d %d",&a,&b);
printf("%d",rv(rv(a)+rv(b)));
}
r=r*10+n%10 을 통해 숫자를 거꾸로 복원 가능하다 (벡터를 만들지 않아 메모리 절약 가능)
-> 내 코드와 메모리 차이가 거의 2배 적게 든다