220808 배우기만 하지말고 써먹기

샨티(shanti)·2022년 8월 8일
0

TIL

목록 보기
65/145
post-thumbnail

하루를 마무리 하기 전, 오늘 있었던 일들을 잔잔히 되짚어봅니다.
성공과 실패의 모든 요소에서 '배울 점'을 찾아내어 기록하고,
더 성장하는 내일의 나를 위해 'action plan'을 세웁니다.

어제에 이어 오늘도 코딩테스트를 푼 경험을 바탕으로 TIL을 써본다.

Stream API와 Map과 친해진지는 채 일주일이 되지 않았다.
일주일 동안 정해진 반복과제를 수행했기 때문에 그 사용 범위가 넓다고도 말할 수 없다.
하지만 확실한 건 이전만큼 stream을 사용하거나 Map을 사용하는 게 어렵지 않다는 점이다.

오늘 주어진 코딩도장 문제는 프로그래머스의 '나누어 떨어지는 숫자 배열'이라는 코딩테스트였다.
문제를 한번 스-윽 읽었을 때 나도 이해하기 어렵지 않았던 수준이기에
아마 난이도 역시 최하에 가까울 것이라 생각한다.

사실 난이도와는 상관없이 나는 그저 for문이나 if문에 익숙하고,
때로는 모든 경우의 수를 다 if문으로 나누어 거의 하드코딩을 하다 시피 하여
효율성도 매우 낮은 편이다.
심지어 지난번에 풀었던 몇몇 문제는 효율성 테스트인가? 거기서 막혀서
답은 맞았지만 통과가 안되는 웃기는 상황도 벌어졌다 ㅎㅎ

근데 지난주 마카오뱅크 강의를 일주일 내도록 반복하고 그 강의 안에서 나온 stream과 Map을 반복 학습하면서
오늘 주어진 문제 역시 이를 활용해 풀어보아야겠다고 생각했고
문제를 풀기시작한지 근 20분 정도만에 해결하는 (ㅋㅋ) 아주 놀~라운 일이 벌어졌다.

문제의 첫 줄, 즉 제한사항과 예시를 제외한 문제 그 자체는 아래와 같았다.

array의 각 element 중 divisor로 나누어 떨어지는 값을 오름차순으로 정렬한 배열을 반환하는 함수, solution을 작성해주세요.
divisor로 나누어 떨어지는 element가 하나도 없다면 배열에 -1을 담아 반환하세요.

아주 얕은 지식이지만 지난주에 stream, 그리고 filter를 사용해보니 사고의 흐름이 아래와 같이 진행되었다.

  1. 오름차순으로 정렬하는 Arrays.sort()를 사용해보자
  2. stream과 함께 filter를 사용해서 모듈라 연산을 활용하자(divisor로 나눈 나머지가 0인 원소만 남기기로)
  3. 그리고 그 원소들을 다시 toArray로 배열화 시키자

솔직히 예전 같았으면 꿈도 꾸지 못할 머릿속 생각의 전개.
하지만 한두 번 해보니 이제는 약간 엄두가 나서 이렇게, 저렇게 해보아야 겠다고 생각했다.

이번 문제는 2개의 방식으로 풀어보았는데, 두 방법 모두 stream을 활용하여 풀게되는 아주 놀라운 일이..ㅎㅎ

첫 번째로 제출했던 풀이는 아래와 같다.

import java.util.Arrays;

public class Solution {
  public int[] solution(int[] arr, int divisor) {
    int[] answer = {};

	// arr를 오름차순으로 정렬
    Arrays.sort(arr);
	
    // arr의 원소를 divisor로 나누었을 때 나머지가 0인 값들만 모아 배열화하여 answer에 할당
    answer = Arrays.stream(arr)
        .filter(i -> i % divisor == 0)
        .toArray();

	// answer의 길이가 0이라면 -1이 든 배열을 answer에 할당하여 반환
    if (answer.length == 0) {
      answer = new int[]{-1};
    }

    return answer;
  }
}

배열에 스트림을 적용하고 나머지가 0인 원소들의 값을 모았을 때, 만약 원소가 하나도 없다면 어떤 결과값이 출력될까?
처음엔 당연히 null이라고 생각했는데 확신이 없어서 테스트를 작성해보았다.

@Test
  void test() {
    Solution solution = new Solution();

    int[] arr = new int[]{3, 2, 6};
    int divisor = 10;

    int[] newArray = Arrays.stream(arr)
        .filter(number -> number % divisor == 0)
        .toArray();

    assertArrayEquals(new int[]{}, newArray);
  }

특정 테스트부분만 가져온건데, 처음엔 assertNull() 로 확인해보았더니 null이 아니라고... 그래서 빈 배열값을 줘보니 맞다는 게 확인됨 ㅎㅎㅎ

오늘 경험을 통해서 나는 반복학습의 중요성을 더욱 느끼게 되었다.
사실 이 TIL을 쓰면서 살짝 걱정되는 건...
이번주 Spring 강의가 나에게는 꽤 어렵게 느껴져서
어떡하나 싶은데.

한편으론 또 이렇게 계속 반복하다보면 어느순간 손에 익고 또 약간의 즐거움도 느낄 수 있지 않을까? 하는 기대도 하게 되고...

어쨌든. 아직은 어렵지만 그래도 예전만큼은 어렵지 않으니
이번주 학습도 소기의 성과를 거두면서 잘 마무리짓고 싶다.

잠을 못잔다는게 좀 짜증은 나지만..ㅎ....
올해까진 별 수 없지 뭐 ㅠㅠ.

배우기만 하지말고 자꾸 적용하려고 노력하자.
이번 퀘스트과제인 '거래내역 조회'도 사실 다 소화한 건 아니라서 걱정되고 불안하지만,
그래도 강의를 봐서 하건 다른 동료들의 코드를 봐서 하건
여러번 쳐보고 또 소화시킬 수 있도록 할 것이다.
미래의 내가 오늘의 나에게 고마워할 수 있도록!

profile
가벼운 사진, 그렇지 못한 글

0개의 댓글