[Java] 12930 이상한 문자 만들기
1. 문제
이상한 문자 만들기
2. 오답정리
첫번째 시도
class Solution {
public String solution(String s) {
// 먼저 얘를 공백 기준으로 분리해서 배열에 넣고
String[] str = s.split(" ");
for (int i = 0; i < str.length; i++) {
for (int j = 0; j < str[i].length(); j++) {
if (j % 2 == 0) {
str[i].charAt(j) = str[i].charAt(j).UpperCase();
} else {
str[i].charAt(j) = str[i].charAt(j).LowerCase();
}
}
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < str.length; i++) {
sb.append(str[i]);
sb.append(" ");
}
return sb.toString();
}
}
class Solution {
public String solution(String s) {
// 먼저 얘를 공백 기준으로 분리해서 배열에 넣고
String[] str = s.split(" ");
for (int i = 0; i < str.length; i++) {
for (int j = 0; j < str[i].length(); j++) {
if (j % 2 == 0) {
str[i].charAt(j) = str[i].charAt(j).UpperCase();
} else {
str[i].charAt(j) = str[i].charAt(j).LowerCase();
}
}
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < str.length; i++) {
sb.append(str[i]);
sb.append(" ");
}
return sb.toString();
}
}
틀린 이유
str[i].charAt(j)=
- charAt(j)는 문자를 읽는 것만 가능하고, 거기에 값을 넣을 수 없음
- 문자열은 immutable이라 직접 수정 X, StringBuilder 써야 함
str[i].charAt(j).UpperCase();
- char에는 UpperCase() 같은 메서드가 없다.
- 대신 Character.toUpperCase(char) / Character.toLowerCase(char)을 써야 한다.
두번째 시도
class Solution {
public String solution(String s) {
// 먼저 얘를 공백 기준으로 분리해서 배열에 넣고
String[] str = s.split(" ");
StringBuilder sb = new StringBuilder();
for (int i = 0; i < str.length; i++) {
for (int j = 0; j < str[i].length(); j++) {
if (j % 2 == 0) {
sb.append(Character.toUpperCase(str[i].charAt(j)));
} else {
sb.append(Character.toLowerCase(str[i].charAt(j)));
}
}
sb.append(" ");
}
// 마지막 공백 제거
sb.deleteCharAt(sb.length() - 1);
return sb.toString();
}
}
틀린 이유
내가 해결한 로직
- split(" ")로 s를 공백 기준으로 분리해서 String배열로 담음
- 이렇게 하면 구분자인 공백은 제외하고 글자만 담김
- 그래서 바깥 for문 실행 마다, 한 단어가 끝나면 뒤에 sb.append(" ")로 공백 추가
- 단, 이렇게 하면 마지막 문자 뒤에도 공백이 붙음
- sb.deleteCharAt() 으로 마지막 공백 제거
예상 원인
테스트 케이스 중에 연속 공백이 들어가는게 있느 것 같음..... 문제에는 그런 말 없는데 연속 공백 처리가 안되서 그런것같다
split(" ", -1) 쓰니까 한번에 해결됨
3. 정답코드
class Solution {
public String solution(String s) {
String[] str = s.split(" ", -1); // 이렇게 하면 연속 공백도 보존됨
StringBuilder sb = new StringBuilder();
for (int i = 0; i < str.length; i++) {
for (int j = 0; j < str[i].length(); j++) {
if (j % 2 == 0) {
sb.append(Character.toUpperCase(str[i].charAt(j)));
} else {
sb.append(Character.toLowerCase(str[i].charAt(j)));
}
}
sb.append(" ");
}
// 마지막 공백 제거
sb.deleteCharAt(sb.length() - 1);
return sb.toString();
}
}
split() 안 쓰고 문자열을 통째로 순회하는 방법
class Solution {
public String solution(String s) {
StringBuilder sb = new StringBuilder();
int idx = 0; // 단어 안에서의 인덱스
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c == ' ') {
sb.append(" ");
idx = 0; // 단어가 끊겼으니 인덱스 초기화
} else {
if (idx % 2 == 0) {
sb.append(Character.toUpperCase(c));
} else {
sb.append(Character.toLowerCase(c));
}
idx++;
}
}
return sb.toString();
}
}