문제
https://school.programmers.co.kr/learn/courses/30/lessons/12930
나의 풀이
첫 시도에서는 문자열을 공백 기준으로 split 한 다음, 나뉘어진 요소(단어) 내부의 짝/홀수 인덱스를 판단해 대소문자로 바꾸려고 하였다. 공백을 기준으로 split 하였으니, 각 요소(단어)의 변환이 끝나면 공백 문자를 answer에 하나씩 추가해주었다. split한 배열과, 그 배열의 요소(단어)를 각각 반복하여 2중 for문을 사용해 구현했다.
테스트 케이스에서는 문제가 되지 않았지만, 채점을 하니 예상한대로 결과가 나오지 않았다. 내가 생각하기에는 공백 기준으로 단어별로 잘 나눠서, 각 단어에서 인덱스에 맞게 대/소문자로 변환해 주었으니 문제될 부분이 없었는데 채점에 통과하지 못한다는게 이해가 되질 않았다. 자세히보니 해당 문제 설명의 하단에 힌트가 있길래 정독해보았다.
문제점
프로그래머스에서 제공하는 힌트를 살피고나서 몇 가지 문제점을 발견했다.
1. 문제에서는 '각 단어는 하나 이상의 공백 문자고 구분되어 있'다고 하였다.
따라서 각 단어 사이에 공백 문자를 '하나'만 추가했던 것은 옳지 못한 결과를 만든다.
2. 문자열의 시작과 끝에 공백문자가 존재할 가능성을 생각하지 못했다.
나는 각 단어의 대/소문자 변환이 끝난 후에, 직접 공백 문자를 추가해주었다. 따라서 answer의 마지막에는 항상 공백 문자가 존재하게 되는데, 이것을 의도적으로 trim매소드로 제거해주었다. 문자열의 시작과 끝에 공백 문자가 존재할 가능성은 전혀 생각하지 못했다.
3. 자바의 split 매소드에 대한 이해가 부족했다.
자바의 split 매소드를 써본적도 없으면서 대충 다른 언어에서 제공하는 함수와 같은 결과를 낼 것이라는 생각에 split 매소드에 대해 알아보지도 않고 사용했다. 각 언어마다 제공하는 라이브러리에는 모두 차이점이 있으므로 확실히 알고 사용할 것..!
일단 나는 split매소드를 사용하면, 인자로 전달했던 문자는 '제거'하고, 그 문자를 기준으로 문자열 배열을 만들어 반환한다고 생각했다. 프로그래머스에서 제공한 힌트에서는 또 다른 내용이 있어서, 이 부분에 대한 추가 조사가 필요하다.
1. 나의 코드
일단 split 매소드를 사용하는 것은 split 매소드에 대한 조사를 진행한 이후에 다시 시도해보는 것으로 하고, 다른 방식으로 해당 문제를 해결했다.
가장 크게 문제가 되었던 점은 공백 문자의 위치와 개수였으므로, 공백 문자를 없애지 않고 잘 보존해야겠다고 생각했다. 따라서 이전에는 문자열 배열을 사용했던 것과 다르게 이번에는 문자열을 char 배열로 변환한 다음 각 요소의 대/소문자를 변경해주었다. 공백 다음에 나오는 문자는 단어의 첫 문자이므로, 이에 flag를 적용해서 짝/홀 인덱스를 판별해주었다.
class Solution {
public String solution(String s) {
String answer = "";
char[] charArr = s.toCharArray();
boolean flag = true;
for (int i=0; i < charArr.length; i++) {
// 공백일 경우
if(charArr[i] == ' ') {
answer += " ";
flag = true;
}
// 짝수 번째 문자
else if (flag) {
answer += Character.toUpperCase(charArr[i]);
flag = !flag;
}
// 홀수 번째 문자
else {
answer += Character.toLowerCase(charArr[i]);
flag = !flag;
}
}
return answer;
}
}
다른 풀이
2. split 매소드 사용
💻 참고한 사이트