Codewars 문제풀기 (04/20)

Number of People in the Bus

  • ArrayList<int[]>를 인자로 받는다.

  • int[]의 크기는 2 이며, {버스 탄 사람, 버스에서 내린 사람}이다.

  • 최종 버스에 남은 사람을 리턴한다.

  • ArrayList<int[]> list = new ArrayList<int[]>(); list.add(new int[] {10,0}); 👉 counterPassengers(list) 👉 10 list.add(new int[] {3,5}); 👉 counterPassengers(list) 👉 8 list.add(new int[] {2,5}); 👉 counterPassengers(list) 👉 5

1. Test와 리팩토링

  • 테스트 1 - list가 {0, 0}이면 0을 리턴한다.

    • 테스트 코드

      @Test
      public void testShouldReturn0WhenBusIsEmpty() {
        // Given: Set get in, and get out people 0
        ArrayList<int[]> inAndOutPeopleList = new ArrayList<>();
        inAndOutPeopleList.add(new int[]{0, 0});
        // When: Call countPassengers method
        int actual = Metro.countPassengers(inAndOutPeopleList);
        // Then: Should return 0
        assertEquals(0, actual);
      }
      
    • 실제 코드

      import java.util.ArrayList;
          
      public class Metro {
          
        public static int countPassengers(ArrayList<int[]> stops) {
          return 0;
        }
      }
      
    • 리팩토링 1

      import java.util.ArrayList;
          
      public class Metro {
          
        public static int countPassengers(ArrayList<int[]> stops) {
          int peopleInBus = 0;
          for (int i = 0; i < stops.size(); i++) {
            peopleInBus = peopleInBus + stops.get(i)[0];
            peopleInBus = peopleInBus - stops.get(i)[1];
          }
          return peopleInBus;
        }
      }
      
      • for문을 돌면서 각 int[] element의 첫번째 element는 탄 사람 수, 두번째 element는 내린 사람 수 이므로 계속 더해줬다.
    • 리팩토링 2 - 식을 한번으로 줄이고, 향상된 for문 사용

      import java.util.ArrayList;
          
      public class Metro {
          
        public static int countPassengers(ArrayList<int[]> stops) {
          int peopleInBus = 0;
          for (int[] stop : stops) {
            peopleInBus += stop[0] - stop[1];
          }
          return peopleInBus;
        }
      }
      
  • 테스트 2 - 첫번째 stop에서 10명 타고 0명 내리면 10을 리턴한다.

    • 테스트 코드

      @Test
      public void testShouldReturn10WhenPeopleGetInBus10AndOff0() {
        // Given: Set first stop : get in, get out people 0
        // Given: Set second stop : get in 10, get out 0
        ArrayList<int[]> inAndOutPeopleList = new ArrayList<>();
        inAndOutPeopleList.add(new int[]{0, 0});
        inAndOutPeopleList.add(new int[]{10, 0});
          
        // When: Call countPassengers method
        int actual = Metro.countPassengers(inAndOutPeopleList);
            
        // Then: Should return 10
        assertEquals(10, actual);
      }
      
    • 실제 코드 그대로

  • Stream으로도 풀 수 있을 것 같은데.. ArrayList<int[]>인데 int[]로 어떻게 해결할지 잘 몰라서 그냥 이대로 제출했다. (약 10분)

2. 답 비교, 느낀점

Best Practice 가장 많이 받은 코드

import java.util.ArrayList;

class Metro {

  public static int countPassengers(ArrayList<int[]> stops) {
    return stops.stream()
                .mapToInt(x -> x[0] - x[1])
                .sum();
  }
}
  • x가 int[]형인데 x[0] - x[1]을 x에 저장할 수 있나..? 스트림을 잘 모르니 구조도 이해가 잘 안된다.. 공부해야하는데 흑

댓글남기기