BOJ 1357 (뒤집힌 덧셈)

JH·2023년 6월 27일
0

BOJ 알고리즘 (C++)

목록 보기
73/97

  • 문제
    어떤 수 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를 제외하면 나름 잘 읽히지 않을까 싶다..)

시간 복잡도 : O(N)


숏코딩
#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배 적게 든다

profile
블로그 -> 노션

0개의 댓글