문제 설명
알파벳 소문자로 이루어진 문자열 myString이 주어집니다. 알파벳 순서에서 "l"보다 앞서는 모든 문자를 "l"로 바꾼 문자열을 return 하는 solution 함수를 완성해 주세요.
제한사항
1 ≤ myString ≤ 100,000 myString은 알파벳 소문자로 이루어진 문자열입니다.
나의 코드
class Solution {
public String solution(String myString) {
for(int i=0; i<myString.length(); i++) {
if(myString.charAt(i)<'l') {
myString.replace(myString.charAt(i), 'l');
}
}
return myString;
}
}
myString
을 반복문을 통해 돌면서 myString.charAt(i)
가 l
보다 작을 때, replace()
함수를 사용하여 l
로 대체하는 코드를 짰으나 실패
class Solution {
public String solution(String myString) {
StringBuilder sb = new StringBuilder(myString);
for(int i=0; i<sb.length(); i++) {
if(sb.charAt(i)<'l') {
sb.setCharAt(i, 'l');
}
}
return sb.toString();
}
}
앞서 실패한 이유는 String
클래스는 불변하기 때문! 따라서 StringBuilder
를 사용하여 해결
다른 사람 코드
class Solution {
public String solution(String myString) {
return myString.replaceAll("[^l-z]", "l");
}
}
정규표현식
과 replaceAll()
메소드 활용
class Solution {
public String solution(String myString) {
String answer = "";
for (int i = 0; i < myString.length(); i++) {
if (myString.charAt(i) <= 'l') {
answer += "l";
} else {
answer += myString.charAt(i) + "";
}
}
return answer;
}
}
StringBuilder
대신 String
을 사용하려면 직접 새로운 String
을 선언하여 myString
을 돌며 l
보다 작은 부분은 l
로, 나머지 부분은 그대로 추가해줘야함.
느낀 점
String
은 고정된 길이이고, 불변(객체 변경 시 실제로 변경되는 게 아니라 새로운 String객체가 생성됨)의 특징을 생각안하고 첫 번째 코드를 짰다 😅 다시 한 번 내가 관련하여 블로깅한 내용을 복습하고 StringBuilder
활용도 손에 익혀야겠다.
추가적으로 정규표현식에 관해서도 다 외울 순 없지만, 특징들을 기억하고 있으면 이와 유사한 문제들도 쉽게 풀 수 있을 것 같다.