IT Contents/프로그래밍 팁

Strip Comments, CodeWars Kata 자바 솔루션

비빔뉴스 2021. 4. 16. 07:00

 

Strip Comments, CodeWars Kata

사진: 코드워즈

Strip Comments

Complete the solution so that it strips all text that follows any of a set of comment markers passed in. Any whitespace at the end of the line should also be stripped out.

Example:

Given an input string of:

apples, pears # and bananas
grapes
bananas !apples

The output expected would be:

apples, pears
grapes
bananas

The code would be called like so:

var result = solution("apples, pears # and bananas\ngrapes\nbananas !apples", ["#", "!"])
// result should == "apples, pears\ngrapes\nbananas"

 

문제 해석

주석으로 간주되는 문자열 뒷 부분은 삭제하고 출력하는 문제입니다.

입력값

  • String text: 주석이 포함된 문자열
  • String[] commentSymbols: 주석으로 간주되는 문자들의 배열

출력값

  • String result: 주석이 제거된 문자열

 

 

My Solution

입력 문자열을 개행문자 기준으로 나누고, 이를 Stream을 이용해서 처리했습니다. map API를 이용해 각 행을 처리했고요. 정규식을 이용해 commentSymbols를 포함한 나머지 문자열을 공백으로 치환했습니다.

솔루션 코드

테스트 코드

package com.codewars;

import java.util.Arrays;
import java.util.stream.Collectors;

public class StripComments {
    public static String stripComments(String text, String[] commentSymbols) {
        return Arrays.stream(text.split("\n"))
                .map(line -> line.replaceAll("[" + String.join("", commentSymbols) + "].*", "").stripTrailing())
                .collect(Collectors.joining("\n"));

    }
}

 

Best Practice

BP도 제 솔루션과 거의 유사하게 처리했습니다. 다만 패턴 문자열을 Stream 바깥쪽에서 미리 조립해두어 Stream에서 처리할 때마다 패턴 문자열이 재조립되는 과정을 피했네요.

import java.util.Arrays;
import java.util.stream.Collectors;

public class StripComments {

  public static String stripComments(String text, String[] commentSymbols) {
    String pattern = String.format(
        "[ ]*([%s].*)?$",
        Arrays.stream( commentSymbols ).collect( Collectors.joining() )
    );
    return Arrays.stream( text.split( "\n" ) )
        .map( x -> x.replaceAll( pattern, "" ) )
        .collect( Collectors.joining( "\n" ) );
  }

}

 

728x90