algorithm reverse and add - andstudy/forge GitHub Wiki

Mastojun

문제 풀이

  • 숫자λ₯Ό μž…λ ₯λ°›μ•„, κ·Έ 숫자λ₯Ό λ’€μ§‘κ³  μ„œλ‘œ λ”ν•΄μ„œ νšŒλ¬ΈμΈμ§€ κ²€μ‚¬ν•˜λŠ” λ¬Έμ œμž…λ‹ˆλ‹€. μ •μˆ˜ν˜• λ³€μˆ˜λ₯Ό κ°€μ§€κ³  μ΄λŸ¬ν•œ μž‘μ—…μ„ ν•˜κΈ° μœ„ν•΄μ„œλŠ” λ‚˜λˆ„κΈ° κ³±ν•˜κΈ° λ‚˜λ¨Έμ§€ λ“±μ˜ μ‚°μˆ˜λ₯Ό λ³΅μž‘ν•˜κ²Œ μ‚¬μš©ν•΄μ•Ό ν•΄μ„œ λ¬Έμžμ—΄μ˜ νž˜μ„ 빌렀 ν’€μ—ˆμŠ΅λ‹ˆλ‹€.

μ†ŒμŠ€μ½”λ“œ (ANSI C)

    #include <stdio.h>
    #include <string.h>
    
    int isOk(char *P)
    {
    	int len = strlen(P) - 1;
    	int i;
    
    	for(i = 0; i <= len/2; i++ )
    	{
    		if( P[i] != P[len-i] ) return 0;
    	}	
    
    	return 1;
    }
    
    void Reverse(char *P)
    {
    	int i;
    	char TempP[11]={0};
    	int len = strlen(P)-1;
    
    	for(i = 0; P[i]; ++i )
    	{
    		TempP[len-i] = P[i];
    	}
    
    	strcpy(P, TempP);
    }
    
    void ReverseAdd(char *P)
    {
    	int i;
    	char TempP[11];
    	int carry = 0;
    
    	strcpy(TempP, P);
    	Reverse(TempP);
    
    	for(i = 0; P[i]; ++i )
    	{
    		P[i] = P[i]-'0'+TempP[i]-'0'+carry;
    		if(P[i] >= 10 )
    		{
    			P[i] -= 10;
    			carry = 1;
    		}
    		else
    		{
    			carry = 0;
    		}
    
    		P[i] += '0';
    	}
    
    	if(carry)
    	{
    		P[i] = carry+'0';
    		P[i+1] = 0;
    	}
    }
    
    int main()
    {
    	int N;
    	char P[11];
    	int result;
    	scanf("%d", &N);
    
    	while( N --> 0 )
    	{
    		scanf("%s", P);
    		Reverse(P);
    
    		result = 0;
    
    		while( !isOk(P) )
    		{
    			ReverseAdd(P);
    			result++;
    		}
    
    		printf("%d %s\n", result, P);
    	}
    
    	return 0;
    }

CynicJJ

  • μž…μΆœλ ₯ 처리 μ—†μŒ
  • 각쒅 μ–Έμ–΄λ‘œ λͺ‡λ²ˆμ΄λ‚˜ ν’€μ–΄λ΄€λ˜ 문제
  • 196 이 μ•ˆλœλ‹€λŠ”κ±΄ 처음 μ•Œμ•˜μŒ

!ReverseAndAdd.vb

    Public Class ReverseAndAdd
    
    	Private _count As Integer
    	ReadOnly Property Count() As Integer
    		Get
    			Return _count
    		End Get
    	End Property
    
    	Private _resultPalindrome As Integer
    	ReadOnly Property ResultPalindrome() As Integer
    		Get
    			Return _resultPalindrome
    		End Get
    	End Property
    
    	Sub Init()
    		_count = 0
    		_resultPalindrome = 0
    	End Sub
    
    	Function GetReversed(ByVal number As Integer) As Integer
    		Dim strNumber() As Char = String.Format("{0:D}", number).ToCharArray()
    		Array.Reverse(strNumber)
    		Return Integer.Parse(New String(strNumber))
    	End Function
    
    	Function IsPalindrome(ByVal number As Integer) As Boolean
    		Return (number = GetReversed(number))
    	End Function
    
    	Sub DoReverseAndAdd(ByVal number As Integer)
    		Init()
    
    		While Not IsPalindrome(number)
    			number += GetReversed(number)
    			_count += 1
    		End While
    
    		If IsPalindrome(number) Then
    			_resultPalindrome = number
    		End If
    	End Sub
    End Class

!ReverseAndAddTest.vb

    <TestClass()> _
    Public Class ReverseAndAddTest
    
    	<TestMethod()> _
    	Public Sub GetReversedTest()
    		Dim rna As ReverseAndAdd = New ReverseAndAdd
    		Assert.AreEqual(321, rna.GetReversed(123))
    	End Sub
    
    	<TestMethod()> _
    	Public Sub IsPalindromeTest()
    		Dim rna As ReverseAndAdd = New ReverseAndAdd
    		Assert.IsTrue(rna.IsPalindrome(1221))
    	End Sub
    
    	<TestMethod()> _
    	Public Sub DoReverseAndAddTest()
    		Dim rna As ReverseAndAdd = New ReverseAndAdd
    		rna.DoReverseAndAdd(195)
    		Assert.AreEqual(4, rna.Count)
    		Assert.AreEqual(9339, rna.ResultPalindrome)
    	End Sub
    
    	<TestMethod()> _
    	Public Sub DoReverseAndAddTestMore()
    		Dim rna As ReverseAndAdd = New ReverseAndAdd
    
    		rna.DoReverseAndAdd(265)
    		Assert.AreEqual(5, rna.Count)
    		Assert.AreEqual(45254, rna.ResultPalindrome)
    
    		rna.DoReverseAndAdd(750)
    		Assert.AreEqual(3, rna.Count)
    		Assert.AreEqual(6666, rna.ResultPalindrome)
    	End Sub
    End Class

kukuman

  • 계속 wrong answerμ΄λ„€μš” γ… γ…  이리저리 고쳐보닀 포기 γ… γ… 

    • UVa에 μ œμΆœν•˜λ©΄ Runtime Errorκ°€ λ°œμƒν•˜λ„€μš”
    • 온라인 νŒμ‚¬λ‹˜μ—κ² μ‹ κ²½ λ„κΈ°λ‘œ ν–ˆλŠ”λ° 그게 잘 μ•ˆλ˜λ„€μš”.
      • 51814 λ¬΄ν•œ 루프 λ„λŠ”κ²ƒ 같은데
      • {{{double addend = getReverseNum(curSum);}}} μ—μ„œ long 으둜 λ°”κΏ”μ•Ό 함
      • κ·Έλž˜λ„ wrong answer
    • Solved νŒμ • 받은 Mastojunλ‹˜ ν’€μ΄λŠ” 001κ³Ό 1을 λ‹€λ₯΄κ²Œ μ²˜λ¦¬ν•¨
      • ν˜Ήμ‹œ 이것 λ•Œλ¬Έμ΄λΌλ©΄ OTL
      • μž‘λ…„μ— μ œμΆœν–ˆλ˜ μ½”λ“œλŠ” 001κ³Ό 1을 κ°™κ²Œ μ²˜λ¦¬ν•˜λŠ”λ° Solvedλ°›μ•˜μ–΄μš”.
  • μ½”λ“œ

      import java.io.BufferedReader;
      import java.io.InputStreamReader;
      
      class Main implements Runnable{
      	public Long readLine(){
      		BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
      		try {
      			return new Long( reader.readLine().trim() );
      		} catch (Exception e) {
      			return null;
      		}
      	}
      	public static void main(String[] args) {
      		Main myWork = new Main();  // Construct the bootloader
      		myWork.run();            // execute
      	}
      	
      	public void run() {
      		long caseCount = readLine().longValue();
      		for(int i=0;i<caseCount;i++){
      			String result = ReverseAdder.GetReverseResult(readLine().longValue());
      			System.out.println(result);
      		}
      	}
      }
      
      
      class ReverseAdder {
      	public static long getReverseNum(long num){
      		String strNum = new Long(num).toString();
      		StringBuilder builder = new StringBuilder();
      		for(int i=0;i<strNum.length();i++){
      			builder.insert(0,strNum.charAt(i));
      		}
      		return Long.parseLong(builder.toString());
      		
      	}
      
      	public static String GetReverseResult(long num) {
      		int loopCount =0;
      		long curSum = num;
      		while(curSum != getReverseNum(curSum)){
      			loopCount++;
      			double addend = getReverseNum(curSum);
      			curSum += addend;
      		}
      		return loopCount + " "+ curSum;
      	}
      }
    
  • ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€

      import junit.framework.TestCase;
      
      
      public class ReverseTestCase extends TestCase {
      	public void testGetReverse(){
      		assertEquals(123,  ReverseAdder.getReverseNum(321));
      		assertEquals(1234,  ReverseAdder.getReverseNum(4321));
      		assertEquals(3,  ReverseAdder.getReverseNum(3));
      		assertEquals(13,  ReverseAdder.getReverseNum(31));
      	}
      	public void testCheckPalindrome(){
      		assertEquals(123, ReverseAdder.getReverseNum(ReverseAdder.getReverseNum(123)));
      	}
      	
      	public void testGetReverseResult(){
      		assertEquals("4 9339", ReverseAdder.GetReverseResult(195));
      		assertEquals("5 45254", ReverseAdder.GetReverseResult(265));
      		assertEquals("3 6666", ReverseAdder.GetReverseResult(750));
      	}
      }
    

soomong

  • μž…λ ₯은 μƒλž΅ν•˜μ˜€μŠ΅λ‹ˆλ‹€. accept λ°›λŠ”κ²ƒλ„ 계속 μƒλž΅ν•˜κ²Œ λ˜λ„€μš” ^^;;

      public class ReverseAdd {
      
      	
      	public boolean isPalindrome(char[] num) {
      	
      		for(int i=0, j= num.length-1 ; i< num.length && i<=j ; i++, j--)		{
      
      			if( num[i] != num[j] )
      				return false;
      		}
      				
      		return true;	
      	}
      
      	public char[] reverse(char[] num) {
      		
      		char[] temp = new char[num.length];
      		
      		for(int i=0, j=num.length-1; i< num.length ; i++,j--) {
      			temp[j] = num[i];
      		}
      		
      		return temp;
      	}
      
      	public char[] add(char[] fir, char[] sec) {
      		
      		int result = Integer.parseInt(String.valueOf(fir)) + Integer.parseInt(String.valueOf(sec));
      		
      		return String.valueOf(result).toCharArray();
      	}
      
      
      
      	public int calReverseCount(char[] num) {
      	
      		int count =0;
      		
      		while(isPalindrome(num) == false && count < 1000 ) {
      		
      			num = add(num,reverse(num));
      			count++;
      			
      		}
      		
      		System.out.println(count+" "+ String.valueOf(num));
      		
      		return count;
      	}
      
      
      }
    
    
    
      import java.util.Arrays;
      
      import junit.framework.TestCase;
      
      
      public class ReverseAddTest extends TestCase {
      
      	ReverseAdd ra = new ReverseAdd();
      	
      	public void testIsPalindrome() {
      	
      		assertTrue(ra.isPalindrome(new char[] {'9','3','3','9'}));
      		assertFalse(ra.isPalindrome(new char[] {'9','2','3','3','9'}));
      		assertTrue(ra.isPalindrome(new char[] {'4','5','2','5','4'}));
      		assertTrue(ra.isPalindrome(new char[] {'6','6','6','6'}));
      		assertTrue(ra.isPalindrome(new char[] {'1'}));
      		assertFalse(ra.isPalindrome(new char[] {'1','2'}));
      	}
      	
      	public void testReverse() {
      		
      		assertTrue(Arrays.equals(ra.reverse(new char[] {'1','9','5'}),new char[] {'5','9','1'}));
      		assertTrue(Arrays.equals(ra.reverse(new char[] {'7','8','6'}),new char[] {'6','8','7'}));
      		assertTrue(Arrays.equals(ra.reverse(new char[] {'1','4','7','3'}),new char[] {'3','7','4','1'}));
      		assertTrue(Arrays.equals(ra.reverse(new char[] {'5','2','1','4'}),new char[] {'4','1','2','5'}));
      		assertFalse(Arrays.equals(ra.reverse(new char[] {'5','2','1','4'}),new char[] {'4','1','3','5'}));
      		assertTrue(Arrays.equals(ra.reverse(new char[] {'1'}),new char[] {'1'}));
      	}
      	
      	public void testAdd() {
      		assertTrue(Arrays.equals(ra.add(new char[] {'1','9','5'},new char[] {'5','9','1'}),new char[] {'7','8','6'}));
      		assertTrue(Arrays.equals(ra.add(new char[] {'7','8','6'},new char[] {'6','8','7'}),new char[] {'1','4','7','3'}));
      		assertTrue(Arrays.equals(ra.add(new char[] {'1','9'},new char[] {'5','9'}),new char[] {'7','8'}));
      		assertFalse(Arrays.equals(ra.add(new char[] {'1','0'},new char[] {'5','0'}),new char[] {'6','8'}));
      	}
      	
      	public void testCalReverseCount() {
      		assertEquals(4,ra.calReverseCount(new char[] {'1','9','5'}));
      		assertEquals(5,ra.calReverseCount(new char[] {'2','6','5'}));
      		assertEquals(3,ra.calReverseCount(new char[] {'7','5','0'}));
      		assertEquals(0,ra.calReverseCount(new char[] {'1','1','1'}));
      		assertEquals(0,ra.calReverseCount(new char[] {'1','1','1'}));
      	}
      	
      }
    

ParkPD

  • compile μ—λŸ¬λžλ‹ˆλ‹€. gcc μ—μ„œλŠ” include 같은 κ±Έ λ‹€λ₯΄κ²Œ ν•΄ μ€˜μ•Ό ν•˜λ‚˜ λ³΄λ„€μš”.

  • μ–Έμ œ GCC μ“°λŠ” 법 ν•œ 번 λ°°μ›Œμ•Ό κ² μ–΄μš”.

  • μ—λŸ¬...

      In file included from /usr/lib/gcc/i686-pc-linux-gnu/4.1.2/include/g++-v4/backward/strstream:51,
                       from pgdaemon.tmp.cpp:12:
      /usr/lib/gcc/i686-pc-linux-gnu/4.1.2/include/g++-v4/backward/backward_warning.h:32:2: warning: #warning This file includes at least one deprecated or antiquated header. Please consider using one of the 32 headers found in section 17.4.1.2 of the C++ standard. Examples include substituting the <X> header for the <X.h> header for C++ includes, or <iostream> instead of the deprecated header <iostream.h>. To disable this warning use -Wno-deprecated.
      pgdaemon.tmp.cpp:169:26: warning: no newline at end of file
      pgdaemon.tmp.cpp: In static member function 'static std::string CReverseAdder::ToString(int)':
      pgdaemon.tmp.cpp:84: error: '_itoa' was not declared in this scope
    
  • Cμ–Έμ–΄ 해더λ₯Ό C++ν‘œμ€€ν˜•μ‹μœΌλ‘œ λ°”κΎΈμ…”μ•Ό ν•©λ‹ˆλ‹€. stdlib.h -> cstdlib

  • itoaλŠ” λΉ„ν‘œμ€€μž…λ‹ˆλ‹€. gcc/g++μ—μ„œλŠ” κ΅¬ν˜„λ˜μ–΄ μžˆμ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

  • μ†ŒμŠ€μ½”λ“œμ˜ λ§ˆμ§€λ§‰μ—λŠ” λΉˆμ€„μ΄ κΌ­ μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€. μ™œκ·ΈλŸ°μ§„ λͺ¨λ₯΄κ² μ§€λ§Œμš”

      /* @JUDGE_ID:parkpd 10038 C "test" */
      
      /* @BEGIN_OF_SOURCE_CODE */
      
      #define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1
      #define _CRT_SECURE_NO_DEPRECATE 1 
      
      #include <stdlib.h>
      #include <iostream>
      #include <vector>
      #include <set>
      #include <strstream>
      #include <algorithm>
      
      using namespace std;
      
      //#define _UNIT_TEST
      
      #ifdef _UNIT_TEST
      
      #include "../../UnitTest++/src/UnitTest++.h"
      
      int main()
      {
      	UnitTest::RunAllTests();
      
      	char temp;
      	cin >> temp;
      
      	return 0;
      }
      
      #endif
      
      class CReverseAdder
      {
      public:
      	static void GetOutput(int num, int& iter, int& palindrome);
      	static int MakeReverse(int num);
      	static bool IsPalindrome(int num);
      	static string ToString(int num);
      	static int ToInt(string s);
      };
      
      void CReverseAdder::GetOutput(int num, int& iter, int& palindrome)
      {
      	iter = 0;
      	while (!IsPalindrome(num))
      	{
      		num += MakeReverse(num);
      		iter++;
      	}
      	palindrome = num;
      }
      
      bool CReverseAdder::IsPalindrome(int num)
      {
      	string s = ToString(num);
      	const int size = s.size();
      	for (int i = 0; i < size / 2; ++i)
      	{
      		char a = s[i];
      		char b = s[size - i - 1];
      		if (a != b)
      		{
      			return false;
      		}
      	}
      
      	return true;
      }
      
      int CReverseAdder::MakeReverse(int num)
      {
      	string s = ToString(num);
      	reverse(s.begin(), s.end());
      	return ToInt(s.c_str());
      }
      
      std::string CReverseAdder::ToString( int num )
      {
      	// max : 4,294,967,295
      	char buffer[12];
      	_itoa(num, buffer, 10);
      	return string(buffer);
      }
      
      int CReverseAdder::ToInt( string s )
      {
      	return atoi(s.c_str());
      }
      
      #ifndef _UNIT_TEST
      
      int main()
      {
      	vector<int> testNums;
      
      	int count;
      	cin >> count;
      
      	int num;
      	for (int i = 0; i < count; ++i)
      	{
      		cin >> num;
      		testNums.push_back(num);
      	}
      
      	int iter;
      	int palindrome;
      	for (int i = 0; i < count; ++i)
      	{
      		CReverseAdder::GetOutput(testNums[i], iter, palindrome);
      		cout << iter << " " << palindrome << "\n";
      	}
      
      	return 0;
      }
      
      #else
      
      struct FixtureReverseAdder : public CReverseAdder
      {
      	int iter;
      	int palindrome;
      };
      
      TEST_FIXTURE(FixtureReverseAdder, ToStringToInt)
      {
      	string s = ToString(1423);
      	CHECK_EQUAL("1423", s);
      	int n = ToInt(s);
      	CHECK_EQUAL(1423, n);
      }
      
      TEST_FIXTURE(FixtureReverseAdder, MakeReverse)
      {
      	int n = 5214;
      	n = MakeReverse(n);
      	CHECK_EQUAL(4125, n);
      	n = MakeReverse(n);
      	CHECK_EQUAL(5214, n);
      }
      
      TEST_FIXTURE(FixtureReverseAdder, IsPalindrome)
      {
      	CHECK(!IsPalindrome(5214));
      	CHECK(IsPalindrome(9339));
      	CHECK(IsPalindrome(45254));
      }
      
      TEST_FIXTURE(FixtureReverseAdder, GetOutput)
      {
      	GetOutput(195, iter, palindrome);
      	CHECK_EQUAL(4, iter);
      	CHECK_EQUAL(9339, palindrome);
      
      	GetOutput(265, iter, palindrome);
      	CHECK_EQUAL(5, iter);
      	CHECK_EQUAL(45254, palindrome);
      
      	GetOutput(750, iter, palindrome);
      	CHECK_EQUAL(3, iter);
      	CHECK_EQUAL(6666, palindrome);
      }
      
      #endif
      
      /* @END_OF_SOURCE_CODE */
    

MovingSpotlight

1μ°¨ 풀이

  • μ›Ήμ—μ„œ κ²€μ‚¬λŠ” μ•ˆλ°›μ•˜μœΌλ‚˜, wrong answer이지 μ•Šμ„κΉŒ μ‹Άλ„€μš”...

      #include <iostream>
      #include <vector>
      
      #ifdef	_UNITTEST
      	#include "../UnitTest++/src/UnitTest++.h"
      	#include "../UnitTest++/src/TestReporterStdout.h"
      #endif	//_UNITTEST
      
      using namespace std;
      
      int GetReverseInt(int n)
      {
      	int reverse_int = 0;
      	int each_digit = 0;
      
      	while(n > 0)
      	{
      		reverse_int *= 10;
      		reverse_int += n % 10;
      		n /= 10;
      	}
      
      	return reverse_int;
      }
      
      bool IsPalindromeInt(int n)
      {
      	int org = n;
      	int cmp = GetReverseInt(n);
      
      	return (org == cmp);
      }
      
      bool GetCountMakePalindrome(int n, int *out_count, int *out_palindrome)
      {
      	bool bRet = true;
      	*out_count = 0;
      	*out_palindrome = 0;
      
      	int reverse_int = 0;
      	int temp_int = n;
      
      	while(1)
      	{
      		(*out_count)++;			
      
      		reverse_int = GetReverseInt(n);
      		temp_int = reverse_int + n;
      
      		if(!IsPalindromeInt(temp_int))		
      			n = temp_int;		
      		else
      		{
      			*out_palindrome = temp_int;
      			break;
      		}
      
      		if(*out_count >= 1000)
      		{
      			*out_count = 0;
      			*out_palindrome = 0;
      			bRet = false;
      			break;
      		}
      	}
      
      	return bRet;
      }
      
      int main()
      {
      #ifdef	_UNITTEST
      	UnitTest::RunAllTests();
      #endif	//_UNITTEST
      
      	return 0;
      }
      
      #ifdef	_UNITTEST
      //TEST(testSetUp)
      //{
      //}
      //TEST(testTearDown)
      //{
      //}
      
      TEST(testGetReverseInt)
      {
      	CHECK_EQUAL(321, GetReverseInt(123));
      	CHECK_EQUAL(591, GetReverseInt(195));
      }
      
      TEST(testIsPalindromeInt)
      {
      	CHECK_EQUAL(true, IsPalindromeInt(9339));
      	CHECK_EQUAL(false, IsPalindromeInt(9338));
      }
      
      TEST(testGetCountMakePalindrome)
      {
      	int count;
      	int palindrome;
      
      	CHECK_EQUAL(true, GetCountMakePalindrome(195, &count, &palindrome));
      	CHECK_EQUAL(4, count);
      	CHECK_EQUAL(9339, palindrome);
      }
      
      #endif	//_UNITTEST
    
⚠️ **GitHub.com Fallback** ⚠️