ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 10/18 TIL | Java와 JavaScript 사용해서 코딩테스트 풀기!
    📝 기록/매일의 기록 2022. 10. 18. 21:00

    이번 주는 자바스크립트를 배우는 주간! 그동안 공부해 온 자바와 자바스크립트로 오늘의 1일 1코테는 두 번 풀어보았다!

     

    문제 설명

    자연수 N이 주어지면, N의 각 자릿수의 합을 구해서 return 하는 solution 함수를 만들어 주세요.
    예를 들어 N = 123이면 1 + 2 + 3 = 6을 return 하면 됩니다.

    제한 사항

    - N의 범위 : 100,000,000 이하의 자연수

    입출력 예

    N answer
    123 6
    987 24

    나의 문제 풀이

    [📃 SolutionTest.java - 테스트 코드]

    import org.junit.jupiter.api.Test;
    
    import static org.junit.jupiter.api.Assertions.*;
    
    class SolutionTest {
    
        @Test
        void split() {
            Solution solution = new Solution();
    
            Integer[] numbers = {1, 2, 3};
    
            assertArrayEquals(numbers, solution.split(123));
        }
    
        @Test
        void sum() {
            Solution solution = new Solution();
    
            Integer[] numbers = {1, 2, 3};
    
            assertEquals(6, solution.sum(numbers));
        }
    }

    N = 123이면 숫자를 다 쪼개서 그 값을 다 더 한 수인 1 + 2 + 3 = 6을 반환하면 된다. 그렇기에 우선 받은 n을 쪼개는 split 함수와 그 split된 값을 합하는 sum 함수를 만들게끔 테스트를 작성하였다.

    [📃 Solution.java - 문제 풀이 코드]

    import java.util.Arrays;
    
    public class Solution {
        public int solution(int n) {
            return sum(split(n));
        }
    
        public Integer[] split(int n) {
            String number = String.valueOf(n);
            String[] array = number.split("");
    
            return Arrays.stream(array)
                    .mapToInt(i -> Integer.parseInt(i))
                    .boxed()
                    .toArray(Integer[]::new);
        }
    
        public int sum(Integer[] numbers) {
            return Arrays.stream(numbers).mapToInt(i -> i).sum();
        }
    }

    실제 코드는 이렇게 작성되었다. Java는 형변환이 자유롭지 않기 때문에 int로 받은 n을 문자열로 바꿔서 split을 사용하여 쪼개 주었고, 그 값을 stream을 활용해 map을 돌면서 integer로 다시 만들었다. 그렇게 만들어진 배열을 sum해서 문제 풀이 완료!

    [📃 solution.test.js - 테스트 코드]

    import solution from './solution';
    
    test('sum', () => {
      expect(solution(123)).toBe(6);
      expect(solution(987)).toBe(24);
    });

    Jest로도 테스트 코드를 작성해보았는데.. 사실 ㅋㅋㅋ 여기는 쪼개서 테스트하지도 않았다.. 이미 자바에서 열심히 쪼갰으니까 자바스크립트는 그냥 냅.다 123 -> 6 / 987 -> 24를 기대합니다! 해버린..ㅋㅋ

    [📃 solution.js - 문제 풀이 코드]

    // test를 위해 export하였으나 프로그래머스에서 통과하려면 그냥 function만 있어야 한다!
    export default function solution(n) {
      return [...`${n}`].map(Number).reduce((a, b) => a + b);
    }

    입력 받은 숫자를 문자열로 바꿀 수 있게 백틱으로 감싸고 전개 연산자로 배열로 바로 만든 후, map을 돌면서 Number로 형 변환하고 reduce로 누산해서 합을 구하게 만들었다!


    문제 자체가 어렵지는 않아서 오래 걸리지는 않았지만 확실히 자바스크립트로 풀어야 편하다는 걸 느꼈다.. 자바스크립트만의 자유로움...?

    자유로운 자스를 봐 자유로워......!