해당 게시글은 [Java] 어서와! 자료구조 알고리즘은 처음이지?https://programmers.co.kr/learn/courses/13577를 간략히 요약한 게시글이며 모든 출처는 해당강의에 있습니다
첫 글자만 대문자로 변환하는, InitCap으로 전환하는 문제입니다.
import java.util.*;
class Solution {
public String solution(String s) {
String[] strings = s.split(" ");
String[] answer = Arrays.stream(strings)
.map(h -> {
if(h.equals(" ")) return h;
h = h.toLowerCase();
String pre = h.substring(0,1);
String post = h.substring(1);
if(h.charAt(0) >= 'a' && h.charAt(0) <= 'z')
pre = pre.toUpperCase();
return pre + post;
})
.toArray(String[]::new);
return String.join(" ",answer);
}
}
억지로 스트림으로 풀어보려고 하였습니다. 첫 글자와 나머지 글자들을 구분하여 첫글자를 대문잘 수정하려고 하였었습니다. 하지만 공백이 2개이상 나올때 split()
메서드로 공백이 연속적으로 여러개 나오는 문자열을 반영할 수 없으므로 단어 단위로 나누어 계산하는 방법은 잘못된 방식이었습니다.
문자열.charAt(인덱스)
: char
데이터 타입을 반환합니다. Character
객체의 메서드를 사용할 수 없습니다(Character.toUppercase() 같은 메서드 사용 불가)예상했다 싶이 이전 문자가 공백이면 대문자로 수정합니다.
배열을 하나 더 추가해서 이전 문자를 기억하도록 하면 간편히 구현할 수 있습니다.
class Solution {
public String solution(String s) {
StringBuilder answer = new StringBuilder();
// 모두 소문자로
s = s.toLowerCase();
// 첫글자는 대문자
char last = ' ';
for(char c : s.toCharArray()){
// 이전 문자가 공백이면 대문자로 저장
if(last == ' ') c = Character.toUpperCase(c);
answer.append(c);
last = c;
}
return answer.toString();
}
}
변수 = 문자.toUpperCase(변수)
가 아니라 변수 = Character.toUpperCase(변수)
가 옳바른 사용방법입니다. Character
의 스태틱 메서드임을 알고 사용해야 합니다.