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