메모리: 33.4 MB, 시간: 0.19 ms
코딩테스트 연습 > 연습문제
정확성: 100.0
합계: 100.0 / 100.0
2025년 01월 09일 10:05:11
문자열 s는 한 개 이상의 단어로 구성되어 있습니다. 각 단어는 하나 이상의 공백문자로 구분되어 있습니다. 각 단어의 짝수번째 알파벳은 대문자로, 홀수번째 알파벳은 소문자로 바꾼 문자열을 리턴하는 함수, solution을 완성하세요.
s | return |
---|---|
"try hello world" | "TrY HeLlO WoRlD" |
"try hello world"는 세 단어 "try", "hello", "world"로 구성되어 있습니다. 각 단어의 짝수번째 문자를 대문자로, 홀수번째 문자를 소문자로 바꾸면 "TrY", "HeLlO", "WoRlD"입니다. 따라서 "TrY HeLlO WoRlD" 를 리턴합니다.
split(' ')
을 수행한 후, 중첩 for문을 돌렸다.1차 : 분리된 문자열에 대한 forEach
2차 : 각 문자열의 길이만큼 for
그래서 1차에 각각의 분리된 문자열을 불러온 후, 2차로 그 길이만큼 홀수/짝수에 따라 toUpperCase()
/toLowerCase()
처리를 수행했는데..
간과한 것은 공백이 끼어있는 경우.
그래서 반례인 "a------a---" (dash = 공백)을 찾아 시도하는데 처리가 어려웠다.
function solution(s) {
let words = s.split(' '); // 공백을 기준으로 문자열을 분리
let result = words.map(word => { // 각 단어별로 처리
let transformedWord = '';
for (let i = 0; i < word.length; i++) {
if (i % 2 === 0) {
transformedWord += word[i].toUpperCase(); // 짝수 인덱스는 대문자
} else {
transformedWord += word[i].toLowerCase(); // 홀수 인덱스는 소문자
}
}
return transformedWord;
});
return result.join(' '); // 변환된 단어들을 공백으로 다시 합침
}
map()
의 사용과 return
시의 join()
수행이 눈에 띄었다.정답 코드를 리뷰해 보자.
let words = s.split(' ');
: 입력받은 문자열을 ' '
공백을 기준으로 분리, words
변수에 할당한다.입력값 〉 "try hello world"
기댓값 〉 "TrY HeLlO WoRlD"
실행 결과 〉 테스트를 통과하였습니다.
출력 〉 words : [ 'try', 'hello', 'world' ]
입력값 〉 "a a "
기댓값 〉 "A A "
실행 결과 〉 테스트를 통과하였습니다.
출력 〉 words : ['a', '', '', '', '', '', '', '', '', '', 'a', '','', '', '' ]
다수의 공백이 있을 경우, 공백까지 분리가 되어 저장되었다.
let result = words.map(word => {
: words
의 각 요소를 조건에 맞춰 배열로 저장할 것이라고 선언. 결과로 돌려받은 배열은 result
식별자에 저장한다.word
의 요소는 아래와 같이 출력된다. 각각 하나의 단어씩.
console.log
로 각 요소들을 확인해 봤을 때, map이 공백도 정상적으로 순회하고 있는 것을 확인할 수 있었다.
let transformedWord = '';
: 정답을 모아둘 공백 문자를 transformedWord
에 저장해두고
for (let i = 0; i < word.length; i++) {
: for
문을 이용해, 0부터 각 요소 단어의 길이만큼 순회할 것.
if (i % 2 === 0) { transformedWord += word[i].toUpperCase();}
: 만일 i
가 짝수라면, 저장한 공백문자 transformedWord
에 단어(word
)의 짝수번째 글자를 대문자로 추가한다.
else {transformedWord += word[i].toLowerCase();}
: 짝수가 아닌 경우, 홀수라면 transformedWord
에 홀수번째 글자를 소문자로 추가한다.
return transformedWord; });
: 위 과정이 종료되면 map이 완료되면서 새로이 만들어진 transformedWord
가 반환된다.
return result.join(' ');
: 배열로 들어온 수정된 문자열을 다시 1개의 단어로 합치는 과정. 공백을 사이에 넣어줌으로써 기존의 형태를 유지할 수 있다.
사실 기본 로직은 똑같은데, map()
을 사용하면서 빈 문자열을 처리하지 않아서 그대로 공백도 유지되었고, 다시 join(' ')
으로 합쳐지면서 문제없이 결과가 나왔다.