수+뒤집기

=ACM ICPC 2003 인터넷 예선 문제 A - 수 뒤집기=

수 124를 뒤집으면 421이 되고 이 두 수를 합하면 545가 된다. 124와 같이 원래 수와 뒤집은 수를 합한 수가 좌우 대칭이 되는지 테스트 하는 프로그램을 작성하시오.

I. Input
입력은 표준입력(standard input)을 통해 받아들인다. 입력의 첫 줄에는 테스트 케이스의 개수 T(1 <= T <= 10)가 주어진다. 각 테스트 케이스는 한 줄에 하나의 정수 N(10 <= N <= 100000)이 주어진다.

II. Output
출력은 표준출력(standard output)을 통하여 출력한다. 각 테스트 케이스에 대해서 원래 수와 뒤집은 수를 합한 수가 좌우 대칭이 되면 YES를 아니면 NO를 한 줄에 하나씩 출력한다.

III. Sample Input
4 13 58 120 5056

IV. Sample Output
YES NO YES NO

Java
code format="java5" import java.util.Scanner;

public class Reverse { public static void main(String[] args) {

Scanner scan = new Scanner(System.in);

int T = scan.nextInt;// 테스트 케이스 개수

for(int i = 0; i < T; i++) { int N = scan.nextInt;// 정수

process(N); }   }

public static void process(int n) {

// 원래 수와 뒤집은 수를 합한다. int sum = n + reverse(n);

// 합한 수를 뒤집어 비교한다. if(sum == reverse(sum)) { System.out.println("YES"); } else { System.out.println("NO"); }   }

/**   * 수를 뒤집는다. ex) 123 -> 321   *    * @param num 뒤집을 수    * @return 뒤집힌 수    */    public static int reverse(int num) {

int ret = 0;

while(num > 0) {

// 기존 숫자를 왼쪽 시프트 한다. ret *= 10;

// 마지막 한자리를 떼어낸다. double temp = num % 10; num /= 10;

ret += temp; }

return ret; } } code

VII. Comment
Palindrome(회문: 뒤집어도 같은 단어(ex: 별똥별)) 문제이다. 숫자를 문자열로 바꾸어서 처리해도 되지만, 문자로 바꾸지 않고 바로 뒤집어 보았다. 친구 승철이가 reverse 메소드를 개선하여 주었다. 기존에는 자리수에 대한 변수가 있었는데, 왼쪽 시프트를 먼저 수행함으로써 자리수를 비교해야 되는 필요성이 사라졌다.

VIII. ETC
C++(귀열) code format="cpp"

#pragma once

#include #include #include #include

using std::cout; using std::endl; using std::cin; using std::cerr; using std::string; using std::stringstream;

// 회문 클래스 template   class Palindrome {   public: Palindrome(void); ~Palindrome(void);

public: void Process;

void setT(const T&); T& setNum;

string itos(const T&); T stoi(const string&);

bool isSymmetry(const string&);

private: T *num;       // 숫자를 저장하는 포인터 int t;       // 표준 입력(키보드)으로 들어올 때 숫자 개수를 저장하는 변수 int count;

string *str; };

#include "Palindrome.h"

template   Palindrome::Palindrome(void) {       num = NULL; count = 0; }

template   Palindrome::~Palindrome(void) {       delete[] num; delete[] str; }

template   void Palindrome::setT(const T& t){ if(t < 0 || t > 10){ cerr<<"The number of T is wrong"<t = t;   }

template   T& Palindrome::setNum{ return num[count++]; }

template   void Palindrome::Process{ str = new string[t];

for(int i = 0; i < count; i++){ // 숫자를 문자로 바꾼다. str[i] = itos(num[i]);

// 숫자를 거꾸로 한다. string temp(str[i]); reverse(temp.begin, temp.end);

// 문자를 숫자로 바꾼다. // atoi(str[i].c_str); - by C API int n1, n2; n2 = stoi(temp); n1 = stoi(str[i]);

n1 += n2;

stringstream ss; ss << n1;

str[i] = ss.str;

// 합이 좌우대칭인지 검사한다. if(isSymmetry(str[i])) cout<<"YES"<   string Palindrome::itos(const T& t){ stringstream ss; ss<   T Palindrome::stoi(const string& t){ stringstream ss(t);

T temp; ss>>temp;

return temp; }

template<class T>   bool Palindrome<T>::isSymmetry(const string& str){ int mid = str.length/2;

for(int i = 0; i < mid; i++){ if(str.at(i) != str.at(str.length-i-1)) return false; }       return true; }

int main(char* argv, char** argc){ Palindrome *p = new Palindrome ;

int count; cin>>count;

p->setT(count);

for(int i = 0; i < count; i++) cin>>p->setNum;

p->Process;

return 0; }

code