저장을 습관화

프로그래머스 LV.2 JadenCase 문자열 만들기 본문

코딩 테스트/프로그래머스 - 자바스크립트

프로그래머스 LV.2 JadenCase 문자열 만들기

ctrs 2023. 10. 2. 19:31

프로그래머스 LV.2 JadenCase 문자열 만들기

https://school.programmers.co.kr/learn/courses/30/lessons/12951

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

1. 문제 명

JadenCase 문자열 만들기


2. 문제 설명

JadenCase란 모든 단어의 첫 문자가 대문자이고, 그 외의 알파벳은 소문자인 문자열입니다. 단, 첫 문자가 알파벳이 아닐 때에는 이어지는 알파벳은 소문자로 쓰면 됩니다. (첫 번째 입출력 예 참고)
문자열 s가 주어졌을 때, s를 JadenCase로 바꾼 문자열을 리턴하는 함수, solution을 완성해주세요.


3. 제한 사항

- s는 길이 1 이상 200 이하인 문자열입니다.
- s는 알파벳과 숫자, 공백문자(" ")로 이루어져 있습니다.
- 숫자는 단어의 첫 문자로만 나옵니다.
- 숫자로만 이루어진 단어는 없습니다.
- 공백문자가 연속해서 나올 수 있습니다.


4. 예시

s return
"3people unFollowed me" "3people Unfollowed Me"
"for the last week" "For The Last Week"


5. 기본 제공 코드

function solution(s) {
  var answer = '';
  return answer;
}


6. 제출한 내 답

const solution = (s) => {
  return s
    .toLowerCase()
    .split(" ")
    .map((v) => {
      return v ? v[0].toUpperCase() + v.slice(1) : "";
    })
    .join(" ");
};

 

6-2. VSC에 작성한 내용

const solution = (s) => {
  return s
    .toLowerCase()
    .split(" ")
    .map((v) => {
      return v ? v[0].toUpperCase() + v.slice(1) : "";
    })
    .join(" ");
};

// 테스트
console.log(solution("3people unFollowed me"));
console.log(solution("for the last week"));
console.log(solution("2space  3space   1space "));
console.log(solution("1HELLO 1WORLD"));
console.log(solution("a b  c   d    e"));


7. 특이사항

틀렸던 방법

const solution = (s) => {
  return s
    .toLowerCase()
    .split(" ")
    .map((v) => {
      return v[0].toUpperCase() + v.slice(1);
    })
    .join(" ");
};
테스트 1 〉	통과 (0.05ms, 33.4MB)
테스트 2 〉	실패 (런타임 에러)
테스트 3 〉	통과 (0.06ms, 33.4MB)
테스트 4 〉	실패 (런타임 에러)
테스트 5 〉	실패 (런타임 에러)
테스트 6 〉	통과 (0.05ms, 33.4MB)
테스트 7 〉	통과 (0.09ms, 33.5MB)
테스트 8 〉	실패 (런타임 에러)
테스트 9 〉	실패 (런타임 에러)
테스트 10 〉	통과 (0.04ms, 33.4MB)
테스트 11 〉	실패 (런타임 에러)
테스트 12 〉	실패 (런타임 에러)
테스트 13 〉	실패 (런타임 에러)
테스트 14 〉	실패 (런타임 에러)
테스트 15 〉	통과 (0.07ms, 33.4MB)
테스트 16 〉	통과 (0.09ms, 33.5MB)
테스트 17 〉	실패 (런타임 에러)
테스트 18 〉	통과 (0.06ms, 33.4MB)

왜 틀린걸까 질문하기에서 나와 같은 사람들 글을 읽어보니

'공백문자가 연속해서 나올 수 있다'는 제한 사항을 놓쳐서 그런거였다.

 

실제로 연속되는 공백이 있는 테스트 케이스를 만들어봤더니

const solution = (s) => {
  return s.split(" ");
};

// 테스트
console.log(solution("2space  3space   1space ")); 
// [ '2space', '', '3space', '', '', '1space', '' ]

""(undefined)에 뒷따라오는 메소드를 사용할 수 없으니 에러가 발생하였고,

채점에서는 이를 런타임 에러로 처리하였다

 

 

틀렸던 방법 2

const solution = (s) => {
  return s
    .replaceAll(/\s+/g, " ")
    .toLowerCase()
    .split(" ")
    .filter((v) => v)
    .map((v) => {
      return v[0].toUpperCase() + v.slice(1);
    })
    .join(" ");
};

// 테스트
console.log(solution("3people unFollowed me"));
console.log(solution("for the last week"));
console.log(solution("2space  3space   1space "));
console.log(solution("1HELLO 1WORLD"));

.replaceAll(/\s+/g, " ")를 사용해 2개 이상 연속되는 공백문자를 하나의 공백문자로 교체하였는데

이게 잘못되었었다

제한사항 '공백문자가 연속해서 나올 수 있습니다.'는 존재할 수 있다. -> 제거해야할 대상이 아니다. -> 함수 처리 후에도 공백의 개수는 유지되어야한다. 라는 의미였다.

 


8. 다른 사람이 작성한 답

8-1. 가장 많이 쓰인 풀이법, 좋아요를 가장 많이 받은 풀이법

function solution(s) {
    return s.split(" ").map(v => v.charAt(0).toUpperCase() + v.substring(1).toLowerCase()).join(" ");
}

charAt() 인수에 지정한 인덱스의 글자를 문자열로 바꿈

""같은 undefined도 문자열로써 에러없이 메소드를 사용가능하게 됨...

 

8-2.

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