본문 바로가기
코딩테스트 연습

l로 만들기

by 신재은👩🏼‍💻 2024. 4. 12.

문제 설명

알파벳 소문자로 이루어진 문자열 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