ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 2022년 6월 22일 TIL - 기본을 놓치지 않아야 한다
    Today I Learned 2022. 6. 23. 00:42

     

    메가테라 백엔드 트레이닝 과정에는 오전 9시부터 1시간 동안 주어지는 몇 개의 문제를 풀어서 제출하는 코딩 도장 시간이 있다. 이번 주부터는 코딩 도장 문제로 실제 기업 입사 시험이나 경진대회에서 출제되거나 그에 준하는 수준의 코딩 문제들이 여럿 수록되어 있는 사이트인 '프로그래머스'에 올라와 있는 문제들 중 하나가 주어지고 있다. 오늘의 문제는 어떤 정수와 자연수가 주어졌을 때, 주어진 정수로부터 시작해 자기자신의 크기만큼 증가하는 숫자들을 자연수의 개수만큼 지니는 배열을 생성하여 반환하는 문제였다.

     

    문제를 바로 처음 봤을 때에는 '주어지는 n은 문제마다 다른 값을 가질 테니까 원시 long 타입으로 배열을 선언하면 (ex. long[] array = new long[n]) n 값의 변화에 대응할 수 없을꺼야'라는 생각이 들었고, 따라서 문제를 풀기 위해 List<Long> 타입 변수에 값들을 담아준 뒤 해당 변수를 원시 타입 배열로 변환해야겠다고 마음먹었다. 문제의 반환형은 long[] 이었기에 이를 위해서는 Wrapper Class 형태인 Long을 long으로 바꿔줄 수 있는 형태의 연산을 사용해야 했다. 구글링을 통해 stream API의 stream() 메서드와 그 반환 타입들에 대해 사용할 수 있는 메서드들의 조합으로 이를 구현해낼 수 있다는 사실을 파악했지만, 그 메서드들을 사용하기 위해 구체적으로 어떤 인자들을 줘야 하는지는 잘 모르고 있는 상태였다. 일단은

     

    - List<Long>형 변수를 stream()해서 Stream<Long>형으로 변환하고,

    - 그것을 다시 mapToLong()해서 LongStream으로 변환하고,

    - 그것을 다시 toArray()해서 최종적으로 long[] 형태로 변환한다.

     

    라는 사실까지 찾아냈지만, mapToLong()에서 계속해서 오류가 발생했다. 이유를 찾고 찾은 결과 인자로 람다식이 주어져야 하는 것을 확인했다. 나는 "element -> element" 와 같이 입력했었는데, 풀었던 당시에는 명확한 이유를 찾지 못했고, 지금은 Stream<Long>의 각각의 개별 값들 중 람다식 오른쪽의 조건에 해당하는 값에 대해 mapToLong을 수행해준다는 의미로 일단은 받아들였다. (물론 이에 대한 근거를 확고히 하기 위해 stream API에 대해 시간을 들여 학습해야 할 것이다.) 즉 "element -> element"는 Stream<Long> 각각의 개별 값들 모두를 LongStream의 개별 값들로 그대로 옮겨준다는 의미로 볼 수 있다. 그렇게 10시가 되기 5분 전에서야 문제를 겨우 풀어서 제출한 뒤, 팀원들과 제출한 문제들에 대해 공유하는 시간을 가졌다.

     

    팀원분들의 풀이를 보고는 머리가 띵한 느낌이 들었다. 원시 타입인 long[] 배열만으로도 문제를 풀 수 있었던 것이었다. 사실 생각해보면 문제에서 주어지는 n 값을 통해 배열의 길이를 바로 특정할 수 있었다. 그러나 나는 귀신에 홀린 듯 나는 스스로 문제를 풀어내는 가장 쉬운 길이였던 원시 타입의 배열을 이용한 풀이를 머릿속에서 배제해버렸고, (선택하지 않은 것이 아니라 아예 배제했다.) 언젠가는 해야 했던 stream 사용법을 익히는 시간을 의도치 않게 가졌다. 당연히 알고 있다고 생각하고, 당연히 기본이라고 생각할 법한 것들도 완전히 손에 익을 정도로 익히기 전에는 놓칠 수 있음을 인지할 수 있었다.

     

     

     

     

     

     

     

     

    댓글

Designed by Tistory.