글 작성자: HEROHJK

오늘 오후에 시간이 남아서 서핑을 하던 도중, 문제풀이 사이트 CodeWars를 발견하고, 몇가지 문제를 풀어보았습니다. 그중 두가지 문제를 공유합니다.


1. Square Every Digit


Welcome. In this kata, you are asked to square every digit of a number.


For example, if we run 9119 through the function, 811181 will come out, because 9^2 is 81 and 1^2 is 1.


Note: The function accepts an integer and returns an integer


영어 무식자라 해석하는데 한참 시간이 걸렸습니다만..


결론적으로 제곱변환입니다. 9119라는 숫자가 들어오면 9의 제곱인 81, 1의 제곱인 1, 1의 제곱인 1, 9의 제곱인 81이 나열되어 811181이 출력되도록 하는것이 목표입니다.


처음에는 숫자로 풀어보았는데, 코드가 길어져서 문자열로 변환하여 풀었더니 쉽게 풀렸습니다.


public static int SquareDigits(int n)
        public static int SquareDigits(int n)
        {
            string numStr = "";

            foreach (char numChar in n.ToString()) numStr+=((Convert.ToInt32(numChar)-48) * (Convert.ToInt32(numChar)-48));

            int sum;
            Int32.TryParse(numStr, out sum);

            return sum;
        }


대략 이렇게 풀었습니다.


말로 풀어쓰자면 이렇습니다.


1. 먼저 숫자를 문자열로 변환하여 처음부터 순회를 합니다. 


1-1.  numStr이라는 문자열에(처음에는 "") 해당 숫자의 제곱값 넣습니다.


(char인 이유는 어차피 저기에 들어갈 값은 0~9까지입니다. 숫자의 나열이다보니 10이상의 숫자가 나올수가 없기 때문이죠. 

그리고 숫자를 넣는데, Convert메서드를 사용하면 해당 숫자의 Ascii값이 나오게 되므로, -48을 합니다.

-48을 하는 이유는, '0'의 값이 48이고, '9'의 값이 48+9 = 57, 이런식으로 연속된 값이기 때문에 48을 빼주면 해당 숫자값을 가져올 수 있습니다.

그렇게 해서 제곱값을 만들어서 넣습니다.

코드가 지저분하다면,  Math.Pow(Convert.ToInt32(numChar)-48,2) 이런식으로 제곱값을 넣을수도 있겠지만, 애초애 double형이라 암시적 형변환도 일어날 뿐더러, 단순한 제곱값이기에 권장하지는 않습니다.)


2. 저렇게 구한 값을 숫자로 변환하여야 하는데, MSDN의 권장사항대로 문자열을 숫자로 변환하는 로직을 이용하여 변환했습니다(사실 암기에 약해서 찾아서 적용했습니다)


3. 그 후 변환한 값을 출력하며 끝냅니다.


랭크 7의 문제인데요, 수준이 낮아서 그런지 간단하게 풀렸네요.





그럼 두번째 문제를 알려드리겠습니다.


2. Find the odd int


Given an array, find the int that appears an odd number of times.


There will always be only one integer that appears an odd number of times.


숫자 배열을 인자값으로 주는데, 여기서 중복값이 홀수인것을 찾아서 출력하라는 문제입니다.


저는 이 문제를 이렇게 풀었습니다.


public static int find_it(int[] seq) 
      {
        
        foreach(int number in seq){
          int count = 0;
          foreach(int target in seq){
            if(number==target) count++;
          }
          
          if( (count % 2) == 1) return number;
        }
        
        return -1;
      }


말로 풀이하자면 이렇습니다


1. 숫자 배열을 받습니다


2. 배열을 순회합니다


2-1. 개수를 초기화합니다


2-2. 비교대상을 위해 배열을 순회합니다


2-2-1. 숫자와 비교대상이 같으면 개수를 셉니다


2-3. 개수가 홀수일때 그 숫자를 반환합니다


3. 홀수가 없다면 -1을 반환합니다(이건 사실 의미가 없습니다)



이 문제는 해석하는데 30분이 넘게 걸리고 푸는데는 금방 풀었습니다.. 영어공부좀 해야겠네요..


그리고 다른분들의 코드를 보니 LINQ를 사용하여 훨씬 간결하게 풀었는데, 아직 제 내공에서는 많이 부족해 보입니다.

반응형