1차 공부/알고리즘

이상한 문자 만들기

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

 

제한 조건
문자열 전체의 짝/홀수 인덱스가 아니라, 단어(공백을 기준)별로 짝/홀수 인덱스를 판단해야합니다.
첫 번째 글자는 0번째 인덱스로 보아 짝수번째 알파벳으로 처리해야 합니다.

 

 

function solution(s) {
    var answer = '';
    let a = s.split(' ');                           //입출력 예에서의 a = 3
    for (let j=0; j<a.length; j++) {                //j는 단어별 구분
        for (let k=0; k<a[j].length; k++) {         //k는 단어의 문자별 구분
            if (k%2 === 0) {                        //단어 별 문자의 번호가 짝수일때
                answer += a[j][k].toUpperCase()     //짝수는 대문자로 저장
            } else {                                //단어 별 문자의 번호가 홀수일때
                answer += a[j][k].toLowerCase()     //홀수는 소문자로 저장
            }
        }
        if (j<a.length-1){
            answer += ' '                           //단어별 끝날 때마다 띄어쓰기 입력
        }
    }
    return answer;
}

이번 문제는 중첩반복문을 사용해 단어별로 홀, 짝수를 나누어 대,소문자를 구별하고,

적절한 곳에 띄어쓰기를 배치하는게 핵심이었다.

 


다른사람의 풀이중 map을 사용한 것이 있어 가져와 봤다.

function solution(s) {
    let arr = s.split(" ");
    return arr.map(v => {
        let newStr="", num=0;
        for(let str of v){
            newStr += !(num%2)? str.toUpperCase(): str.toLowerCase();
            num++;
        }
        return newStr;	//맵함수의 for문마다의 반환값
        }).join(" ");	//맵함수 끝나는 지점, solution함수 반환값의 최종점
}

주어진 예시로 위 코드를 해석해 보자.

s = 'try hello world'

arr = s.split(' ');  ======     arr = ['try', 'hello', wolrd']

 

newStr = '' 빈문자열을 선언해주고, num =0으로 초기 값을 설정해 준다.

 

for (let str of v) ====== 여기서 말하는 v는 arr의 요소들try, hello, world이고,

str은 요소하나씩 즉 try에서 t, r, y / hello에서 h, e, l, l, o / world에서 w, o, r, l, d이다.

 

먼저 try에 대한 반복문을 실행한다.

빈 문자열인 newStr에 num을 2로 나눈 나머지가 0(falsy)인지 1(truthy)인지 판별한다.

try에서 t에 대해 num이 0인데 앞에 !가 붙었으므로 true의 값을 진행한다. 여기선 str(t).toUpperCase()를 진행한다.

그걸 빈 문자열인 newStr에 저장한다. 그 후에 num값에 1을 더한다.

 

다음으론 r에대해 num이 1이므로 !1 = !true = false여서 str(r).toLowerCase()를 진행하고 또 num에 1을 더해준다.

 

마지막으로 y에대해 num이 2이므로 !0 =  !false = ture여서 str(y).toUpperCase()를 진행하고 또 num에 1을 더한다.

 

여기서 v의 첫 값인 try가 끝났으므로 arr의 try가 TrY로 반환되어 바뀐다.

 

똑같이 다시 map메소드가 진행되고 newStr이 빈문자열이되고, num이 0이되며 단어별로 진행이되어

최종적으로 map함수가 끝났을때 arr = ['TrY','HeLlO','WoRlD']가 되는데,

여기에 .join('  ')함수를 사용하여 배열 요소사이에 띄어쓰기를 넣은 문자열이 최종적으로 함수의 반환값으로 반환된다.

'1차 공부 > 알고리즘' 카테고리의 다른 글

자연수 뒤집어 배열로 만들기  (0) 2022.11.23
자릿수 더하기  (0) 2022.11.23
완주하지 못한 선수  (0) 2022.11.23
수박수박수박수박수박수?  (0) 2022.11.23
서울에서 김서방 찾기  (0) 2022.11.23