프로그래머스 Lv.1
문자열 s는 한 개 이상의 단어로 구성되어 있습니다. 각 단어는 하나 이상의 공백문자로 구분되어 있습니다. 각 단어의 짝수번째 알파벳은 대문자로, 홀수번째 알파벳은 소문자로 바꾼 문자열을 리턴하는 함수, solution을 완성하세요.
문자열 전체의 짝/홀수 인덱스가 아니라, 단어(공백을 기준)별로 짝/홀수 인덱스를 판단해야합니다.
첫 번째 글자는 0번째 인덱스로 보아 짝수번째 알파벳으로 처리해야 합니다.
s | return |
---|---|
"try hello world" | "TrY HeLlO WoRlD" |
"try hello world"는 세 단어 "try", "hello", "world"로 구성되어 있습니다.
각 단어의 짝수번째 문자를 대문자로, 홀수번째 문자를 소문자로 바꾸면 "TrY", "HeLlO", "WoRlD"입니다.
따라서 "TrY HeLlO WoRlD" 를 리턴합니다.
1 번 째 시도
function solution(s) {
const arr = s.split("");
const newArr = arr.map((el, index) => {
if (index % 2 === 0) {
return el.toUpperCase();
} else if (index % 2 !== 0) {
return el.toLowerCase();
}
});
return newArr.join('');
}
그런데 콘솔로 확인해 보았을 때는 예상대로 잘 나왔으나 제출 후 채점을 해보았더니 오답...
문제가 뭘까 생각하다가 문제를 다시 찬찬히 읽어보았다.
그런데 제한 사항의 첫 번 째 문장을 보니..
문자열 전체의 짝/홀수 인덱스가 아니라, 단어(공백을 기준)별로 짝/홀수 인덱스를 판단해야합니다.
여기서 공백이 있을 때마다 인덱스를 초기화해야 한다는 뜻으로 해석했다.
그렇다면 split 메서드로 배열을 만드는 방식이 아니라 빈 문자열에 하나하나 추가해 나가야 하나? ->
배열을 쓰지 않는다 ? -> map을 쓰지 못한다 ? -> For 문을 써야겠다라는 의식의 흐름으로 다시 작성해 보았다.
2 번째 시도
function solution(s) {
let index = 0;
let result = '';
for (let i = 0; i < s.length; i++) {
if (s[i] === ' ') {
result += ' ';
index = 0;
} else {
index % 2 === 0 ? result += s[i].toUpperCase() : result += s[i].toLowerCase();
index++;
}
}
return result;
}