이상한 문자 만들기 문제 풀이, split 메서드

잔잔바리디자이너·2022년 5월 2일
0
post-thumbnail

문제

문제 설명

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

제한 사항

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

입출력 예

sreturn
"try hello world""TrY HeLlO WoRlD"

입출력 예 설명
"try hello world"는 세 단어 "try", "hello", "world"로 구성되어 있습니다. 각 단어의 짝수번째 문자를 대문자로, 홀수번째 문자를 소문자로 바꾸면 "TrY", "HeLlO", "WoRlD"입니다. 따라서 "TrY HeLlO WoRlD" 를 리턴합니다.


내가 쓴 답

일단 " " 공백을 기준으로 먼저 단어들을 쪼개고 단어의 인덱스를 순회 하느냐, 아니면 인수로 받은 스트링 전부를 순회하면서 공백을 만날때 마다 잘라준다거나 하느냐를 고민하다가 1번의 경우 일단 split 메서드를 사용해 공백 기준으로 단어를 잘라주어야 할 것 같았다.

하지만 split 메서드를 사용하고싶지 않았다. 왜냐고? 그냥 오기가 생겼다. 그래서 먼저 짝수 홀수대로 스트링의 문자들 전부 돌면서 처리하다가 공백을 만났을 때 뭐 카운트를 다시 리셋시키고 어쩌고 하려다가 실패했다.ㅋ

function solution(s) {
    var answer = []
    for(let i = 0; i < s.length; i++){
      if(s[i] === ' '){
         answer.push(s[i])
      }else if(s[i] !== ' '){
        if(i%2){
         answer.push(s[i].toLowerCase())
        }
        else if(!(i%2)){
         answer.push(s[i].toUpperCase())
        } 
      }
    }
    return answer.join('').toString()
}

응 실패야~

테스트 1 〉	통과 (0.14ms, 30.1MB)
테스트 2 〉	통과 (0.06ms, 30MB)
테스트 3 〉	실패 (0.06ms, 30.1MB)
테스트 4 〉	실패 (0.10ms, 30.2MB)
테스트 5 〉	실패 (0.09ms, 30MB)
테스트 6 〉	통과 (0.14ms, 30MB)
테스트 7 〉	실패 (0.09ms, 30.2MB)
테스트 8 〉	실패 (0.11ms, 29.8MB)
테스트 9 〉	실패 (0.08ms, 30.1MB)
테스트 10 〉	실패 (0.13ms, 30.3MB)
테스트 11 〉	실패 (0.10ms, 30.2MB)
테스트 12 〉	실패 (0.10ms, 30.3MB)
테스트 13 〉	실패 (0.08ms, 30.2MB)
테스트 14 〉	실패 (0.12ms, 30MB)
테스트 15 〉	실패 (0.11ms, 30MB)
테스트 16 〉	실패 (0.13ms, 30.2MB)

split 메서드

다시 도전하기 이전에 split 메서드를 공부해보았다.

const str = 'Hello World, Hi, World'
const words = str.split(' ')
console.log(words)

// [ 'Hello', 'World,', 'Hi,', 'World' ]

위와 같은 동작을 하도록 함수를 작성해보자

  • 인수로 받을 문자열의 길이만큼 순회한다
  • 인수 문자열의 값이 특정 문자가 아닐 경우 빈 문자열을 가진 변수로 한 문자씩 보내 합친다
  • 인수에서 특정 문자를 마주칠 경우 변수에 들어있는 문자열을 배열로 보낸다
  • 변수의 문자열을 비운다
  • 인수 문자열을 전부 순환할때까지 반복한다
  • 마지막에 남은 문자열을 배열로 보내주는 작업을 더해준다
const str = 'Hello World, Hi, World'

const splitFunction = function(str){
  let emptyStr = ''
  const resultArray = []
  for(let i = 0; i < str.length; i++){
    if(str[i] !== ' '){
      emptyStr += str[i]

    }else if(str[i] === ' '){
      resultArray[resultArray.length] = emptyStr
      emptyStr = ''
    }
  }
      if(emptyStr){
      resultArray[resultArray.length] = emptyStr
    }
  return resultArray
}
console.log(splitFunction(str))

// [ 'Hello', 'World,', 'Hi,', 'World' ]

그럼 다시 풀어보자...
첫번째 풀이:

function solution(s) {
    var answer = '';
    var words = s.split(" ")
    for(let i = 0; i < words.length; i++){
        for(let j =0; j<words[i].length; j++){
            if(j%2 === 0){
                answer += words[i][j].toUpperCase()
            }else if(j%2 !== 0){
                answer += words[i][j].toLowerCase()
            }
        }
      answer += " "  
    }
    
    return answer;
}

solution("try hello world")

// 'TrY HeLlO WoRlD ' <- 마지막 단어에도 공백이 붙는다

마지막 단어일때는 공백을 붙이지 않도록 처리

function solution(s) {
    var answer = '';
    var words = s.split(" ")
    for(let i = 0; i < words.length; i++){
        for(let j =0; j<words[i].length; j++){
            if(j%2 === 0){
                answer += words[i][j].toUpperCase()
            }else if(j%2 !== 0){
                answer += words[i][j].toLowerCase()
            }
        }
        if(i != words.length -1){
               answer += " "   
        }
    }
    
    return answer;
}

통과~


테스트 1 〉	통과 (0.12ms, 29.9MB)
테스트 2 〉	통과 (0.11ms, 30.1MB)
테스트 3 〉	통과 (0.08ms, 29.9MB)
테스트 4 〉	통과 (0.10ms, 30MB)
테스트 5 〉	통과 (0.14ms, 29.9MB)
테스트 6 〉	통과 (0.07ms, 29.8MB)
테스트 7 〉	통과 (0.10ms, 30MB)
테스트 8 〉	통과 (0.13ms, 29.8MB)
테스트 9 〉	통과 (0.11ms, 30MB)
테스트 10 〉	통과 (0.17ms, 29.8MB)
테스트 11 〉	통과 (0.25ms, 29.9MB)
테스트 12 〉	통과 (0.15ms, 29.9MB)
테스트 13 〉	통과 (0.12ms, 29.8MB)
테스트 14 〉	통과 (0.09ms, 29.9MB)
테스트 15 〉	통과 (0.09ms, 29.9MB)
테스트 16 〉	통과 (0.17ms, 30MB)

0개의 댓글