코딩테스트를 위한 Stream 적응하기

코딩테스트를 준비하다보니 Stream의 필요성을 느끼게 되어 작성한다.

대부분 입력 문자열을 정수로 처리해야하지만 문자열배열로 주어지는 경우가 많았다.

예시 문제로 프로그래머스 Level2 호텔 대실 문제의 경우 입력 테스트 케이스가 다음과 같이 입력된다.

[["15:00", "17:00"], ["16:40", "18:20"], ["14:20", "15:20"], ["14:10", "19:20"], ["18:20", "21:20"]]

나의 경우 시간과 분을 :을 기준으로 나누고 으로 치환하고 싶었다.

String time = "15:00"

int [] timeToMinutes = Arrays.stream(time.split(":")).mapToInt(Integer::parseInt).toArray();

내가 원하는 값은 “15:00”을 [15, 0]으로 변환하는 것이고 단계별로 살펴보자면 다음과 같다.

// Step 1: 토큰 단위로 나눈다. 편의상 A라고 치환한다면
time.split(":");
// result : ["15", "00"]

// Step 2: Stream 구조로 변환한다.
Arrays.stream(A);

// Step 2-1: 만약 배열구조가 아닌 Collection 타입이라면
A.stream();

// Step 3-1: Stream -> IntStream으로 변환한다.
Arrays.stream(A).mapToInt(Integer::parseInt);

// Step 3-2
Arrays.stream(A).mapToInt(num -> Integer.parseInt(num));

// IntStream을 Array로 변환한다
Arrays.stream(A).mapToInt(Integer::parseInt).toArray();

또한 배열안에서의 최대값을 찾고 싶을 때 주로 반복문을 돌렸지만 Stream을 통해 해결할 수 있었다.

int nums [] = { data };

// 기존의 방식
int max = Integer.MIN_VALUE;
for(int i = 0; i < nums.length; i++) {
	max = Math.max(max, nums[i]);
}

// Stream을 사용한 방식
int max = Arrays.stream(nums).max().getAsInt();

해당 범위의 값을 1씩 늘리고 싶다면

int count [] = new int [100];

// 기존의 방식
for(int i = start; i < end; i++) {
	count[i]++;
}

// Stream을 사용한 방식
IntStream.range(start, end).forEach(i -> count[i]++);

IntStream 이외에도 Stream에 다양한 메서드를 활용하면 파이썬과 같이 편하게 코딩할 수 있는 것 같다. Stream을 더 공부해봐야 될 것 같다.




Enjoy Reading This Article?

Here are some more articles you might like to read next:

  • 자바 로드맵
  • 자바 기초 [1]
  • [DACON] 해커톤 경진대회 회고
  • 블록체인이란
  • 솔리디티 기본 문법