문제 설명
알파벳 소문자로 이루어진 문자열 myString이 주어집니다. 알파벳 순서에서 "l"보다 앞서는 모든 문자를 "l"로 바꾼 문자열을 return 하는 solution 함수를 완성해 주세요.
제한사항
- 1 ≤ myString ≤ 100,000
입출력 예
myString | result |
"abcdevwxyz" | "lllllvwxyz" |
"jjnnllkkmm" | "llnnllllmm" |
import java.util.stream.*;
class Solution {
public String solution(String myString) {
// 이렇게 하면 string을 intstream으로 나눌 수 있다.
return myString.chars()
// 각 int를 문자로 바꾼다.
.mapToObj(c -> (char)c)
// 해당 문자를 대소비교한다. 'char'는 숫자랑 mapping되어 있어 이런 식으로 비교할 수 있다.
.map(c -> c < 'l' ? 'l' : c)
// stringbuilder 객체 만들고 스트림 내 모든 문자를 append한다.
// stringbuilder::append가 2개 붙은 것은 collect 시그니처 때문인데 보통의 상황(단일 스레드 환경)에서는 앞의 것만 기능할 테지만
// 병렬 처리가 됐다면 뒤의 것까지 쓰인다.
.collect(StringBuilder::new, StringBuilder::append, StringBuilder::append)
// solution 메서드 시그니처가 String이니까 tostring으로 반환한다.
.toString();
}
}
class Solution {
public String solution(String myString) {
return myString.replaceAll("[^l-z]", "l");
}
}
와! 진짜 쉽고 좋은 코드다!
말 그대로 l 앞에 있는 걸(더 정확히는 mystring 문자열 내에서 l-z 외의 모든 걸) 다 l로 바꾼다.
import java.util.stream.Collectors;
class Solution {
public String solution(String myString) {
return myString.chars()
.mapToObj(i -> Character.toString(Integer.max(i, 'l')))
.collect(Collectors.joining());
}
}
얘도 좋다.
mystring 문자열을 intstream으로 바꾼다.
각 숫자를 l이랑 비교해서 l보다 작으면 l이 나오고 아니면 i가 나오게 한다(Integer.max()).
거기까지 됐으면 그냥 숫자기 때문에 그걸 character하는데
그걸 tostring까지 한다.
그럼 지금 string stream?이 만들어져 있을 건데
각 string을 다 모은다.
.collect(Collectors.joining());
얘도 내부적으로는 stringbuilder를 사용한다.
.collect(StringBuilder::new, StringBuilder::append, StringBuilder::append)
얘랑 똑같다.
그런데 collectors.joining()은 더 짧다.
'코딩테스트 연습' 카테고리의 다른 글
문자열 잘라서 정렬하기 (0) | 2024.04.12 |
---|---|
간단한 식 계산하기 (0) | 2024.04.12 |
부분 문자열 이어 붙여 문자열 만들기 (0) | 2024.04.11 |
순서 바꾸기 (0) | 2024.04.11 |
5명씩 (0) | 2024.04.11 |