문자열 문제
문제링크
풀이 접근
- 문자열과 공백이 중요한데 자바에서는 String 과 char 구조에 따라 조금씩 다르다. String 데이터가 숫자인지 확인하려면 정규식을 사용하거나 char 데이터로 변환해야되는 번거로움이 있어 그냥 char 로 처음부터 바꿔서 진행
- Boolean 타입을 사용해서 공백이 발생하면 true 에서 false로 바꿔서 소문자는 그대로 진행하고 공백이 나올경우 다시 true로 바꿔줘서 첫 글자가 대문자로 변환하도록 한다.
- 주의할 사항은 첫 글자가 숫자거나 공백일 경우인데 아래와 같이 처리해서 문제를 풀었다.
구현 코드
class Solution {
public String solution(String s) {
StringBuilder z = new StringBuilder();
char[] charArray = s.toCharArray();
Boolean flag = true;
for (char c : charArray) {
if (flag && !Character.isDigit(c) && c != ' ') {
z.append(Character.toUpperCase(c));
flag = false;
} else if (c == ' ') {
flag = true;
z.append(c);
} else {
z.append(Character.toLowerCase(c));
flag = false;
}
}
return z.toString();
}
}
삼항 연산자로 더 간단하게 풀기
class Solution {
public String solution(String s) {
String answer = "";
String[] sp = s.toLowerCase().split("");
boolean flag = true;
for(String ss : sp) {
answer += flag ? ss.toUpperCase() : ss;
flag = ss.equals(" ") ? true : false;
}
return answer;
}
}
정리
- 단순히 알고리즘을 풀 때 반복문을 적게 쓰는 것만 사용했는데 반복문을 적게 사용하더라도 불필요한 연산을 줄일 수 있는 방법도 함께 생각하는데 성능을 높이는 주요한 열쇠라는걸 다시 한 번 알게 되었다.
import java.util.regex.*;
class Solution {
public String solution(String s) {
Matcher m = Pattern.compile("\\b([\\w])([\\w]*)").matcher(s);
while (m.find()) {
s = s.replaceAll("\\b" + m.group(), m.group(1).toUpperCase() + m.group(2).toLowerCase());
}
return s;
}
}
댓글남기기