Programmers / 이상한 문자 만들기 - 12930

y1nlog·2025년 1월 9일
0

[level 1] 이상한 문자 만들기 - 12930

문제 링크

성능 요약

메모리: 33.4 MB, 시간: 0.19 ms

구분

코딩테스트 연습 > 연습문제

채점결과

정확성: 100.0
합계: 100.0 / 100.0

제출 일자

2025년 01월 09일 10:05:11

문제 설명

문자열 s는 한 개 이상의 단어로 구성되어 있습니다. 각 단어는 하나 이상의 공백문자로 구분되어 있습니다. 각 단어의 짝수번째 알파벳은 대문자로, 홀수번째 알파벳은 소문자로 바꾼 문자열을 리턴하는 함수, solution을 완성하세요.

제한 사항
  • 문자열 전체의 짝/홀수 인덱스가 아니라, 단어(공백을 기준)별로 짝/홀수 인덱스를 판단해야합니다.
  • 첫 번째 글자는 0번째 인덱스로 보아 짝수번째 알파벳으로 처리해야 합니다.
입출력 예
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(' ')으로 합쳐지면서 문제없이 결과가 나왔다.

profile
FrontEnd Developer

0개의 댓글