본문 바로가기
알고리즘/Programmers

[TIL] 2023.04.21 Programmers_이상한 문자 만들기

by heereal 2023. 4. 23.

Today I Learned

  • Programmers 문제 풀기

 


Programmers 문제 풀기

이상한 문자 만들기

문제 설명

문자열 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) {
    let array = s.split(" ");
    let answer = array.map((word) => word.split("").map((str, i) => i % 2 === 0 ? str.toUpperCase() : str));
    return answer.reduce((acc, cur) => acc.concat(cur), []);
}

각 단어의 홀수번째 알파벳을 대문자로 바꾸는 데는 성공했지만 concat으로 배열을 모두 합치면서 띄어쓰기가 사라져 버렸다. map 말고 for문을 사용해서 2차원 배열을 생성하지 않고 문자열에 바로 접근하는 방식을 이용해 봐야겠다.

 

나의 2차 풀이

function solution(s) {
    let array = s.split(" ");
    let answer = [];
    for (const word of array) {
        let temp = "";
        for (const i in word) {
            temp += i % 2 !== 0 ? word[i].toLowerCase() : word[i].toUpperCase();
            if (parseInt(i) === word.length-1) answer.push(temp);
        }
    }
    return answer.join(" ");
}

map에서 이중 for문으로 수정한 풀이인데 정확성 테스트 16개 중에 5개 통과했다.

 

 

나의 최종 풀이

function solution(s) {
    let array = s.split(" ");
    let answer = [];
    for (const word of array) {
        let temp = "";
        if (word === "") answer.push("");
        for (const i in word) {
            temp += i % 2 !== 0 ? word[i].toLowerCase() : word[i].toUpperCase();
            if (parseInt(i) === word.length-1) answer.push(temp);
        }
    }
    return answer.join(" ");
}

어디가 문제인지 모르겠어서 질문하기 페이지를 참고했는데 문자열 사이에 공백에 두 번 들어가는 경우가 존재하는 것이 문제였다. 그래서 for문에 word === ""일 경우에 예외처리를 추가했더니 테스트를 모두 통과할 수 있었다.

  1. s 배열을 " "로 split 해서 단어 하나하나를 요소로 담은 배열을 생성한다.
  2. 이 배열에 for문을 돌리고 각 단어마다 또 한 번 for문을 돌린다.
  3. 각 단어의 알파벳 하나하나 for문을 돌면서 인덱스가 짝수이면 대문자로 만들고, 홀수이면 소문자로 만든다.
  4. for문이 마지막 인덱스에 도달하면 소문자, 대문자를 변환한 해당 단어를 answer 배열에 push 한다.
  5. 최종적으로 answer 배열을 " "로 join 해서 배열에서 기존 문자열 상태로 변환해 return 한다.

 

다른 사람의 풀이

function toWeirdCase(s){
  return s.split(' ').map(i => i.split('').map((j, key) => key % 2 === 0 ? j.toUpperCase() : j.toLowerCase()).join('')).join(' ')
}

내가 처음에 시도했던 map을 이용해서 통과한 풀이다. 2차원 배열을 만들지 않기 위해서 중첩된 map 안에서 각 문자를 대소문자로 변환한 후에 다시 join() 메서드로 배열이 아닌 문자열을 반환했다.

 

 

댓글