js 프로그래머스) 이상한 문자 만들기

이명진·2023년 1월 10일
0

코드카타

목록 보기
55/69

문제 요약

문자열 s 는 한개 이상의 단어로 구성되어 있다. 각 단어의 짝수번째는 대문자로 , 홀수번째는 소문자로 리턴하라 단, 공백이 있을 경우 공백 그대로 노출해야 하며 (이부분이 언급되지 않아서 처음에 많이 틀렸다), 공백이 있을 경우 공백 다음이 0으로 숫자를 센다.

이번 문제는 진짜 오래 걸려서 풀었다. 첫번째 로직을 작성해서 테스트 코드를 통과하고
잘 되었다 라고 생각했는데 제출하면 엄청 틀렸다. 왜 틀린지 진짜 고민 많이 하였고
질문하기에서 앞에 띄어쓰기를 넣어봐라 띄어쓰기 두개 있을때 어떻게 풀건지 물어봐서
이를 힌트로 문제를 풀수 있었다. 진짜 프로그래머스 질문들 다 불친절한것 같다
왜 틀렸는지도 안알려주면서 😢

내가 푼 풀이

첫번째 로직이다.

function solution(s) {
let answer = s.split(' ')
let request = '';
answer.map((x,index)=>{
  for(let i =0; i<x.length;i++){
  
    if(i%2 ===0){
      if(i === 0){
        request += ' '
      }
     let changeX = x.charAt(i).toUpperCase()
      request += changeX
    }else{
      request += x.charAt(i).toLowerCase()
    }
   
     }
})
    request = request.slice(1)
return request
}

띄어쓰기 별로 split 하여서 배열로 나눴고 배열 마다 for문을 돌려서
자리수에 맞게 대문자, 소문자로 변경해주었다.
여기서 잘푼것 같아서 뿌듯했는데 제출하면 엄청 틀려서 멘붕..

그래서 케이스에 (' Dd ddfes Esdf')
이렇게 문자 아닌 것을 넣어서 테스트 해봤다 결과는 역시나 띄어쓰기를 반영하지 못하였다.
띄어쓰기 를 일부러 네개, 세개 를 넣고 돌렸는데 띄어쓰기는 다 적용되지 않았다.

해결하기 위해서 일단 문자들을 추출하여서 대문자 소문자로 변경해주고
띄어 쓰기가 있을 경우 띄어쓰기를 넣어주고 아니면 변경한 문자들을 배분해주었다.

두번째 풀이

아래는 통과한 로직이다.

function solution(s) {

let answer = s.split(' ')
let request = '';

answer.map((x,index)=>{
  for(let i =0; i<x.length;i++){
    
    if(i%2 ===0){
     let changeX = x.charAt(i).toUpperCase()
      request += changeX
    }else{
      request += x.charAt(i).toLowerCase()
    }
   
     }
})
  let real = '';
  let count = 0;
   for(let i =0; i<s.length;i++){
     if(s.charAt(i)=== ' '){
       real += s.charAt(i)
     }else{
       real += request.charAt(count)
       count += 1;
     }
     
     
   }
return real
}

로직이 이렇게 더러워질 줄이야.. 짧게 푸려고했는데 이렇게 길게 알고리즘 로직을 짜게 된것은 처음인것 같다. 별로 좋은 케이스는 아닌것 같았지만 예상외로 속도 측면에서 그리 느리지 않았다.
0.2초 이내로 걸렸다.
풀다가 진짜 답답해서 해답을 보고 싶었는데 잘참고 풀었다.

다른사람의 풀이

확실히 간결하게 풀었다. 보다보니 map을 사용하고 두번째 인자가 index로 사용할수 있었다는 점을 생각못하고 있었다. 그러면 변수 몇개를 줄일수 있었던 것 같았는데 아쉽다.


function toWeirdCase(s){
  return s.split(' ').map(i => i.split('').map((j, key) => key % 2 === 0 ? j.toUpperCase() : j).join('')).join(' ')
}
profile
프론트엔드 개발자 초보에서 고수까지!

0개의 댓글