오늘은 이력서 진단 PASS를 받았다. 여전히 트러블슈팅 부분에서 부족함이 있다고는 나오지만, 당장 새로운 트러블슈팅을 제작할 수도 없는 노릇이기 때문에 일단 통과했으니 다음 챕터를 진행하면서 이력서도 틈틈이 수정해야겠다.
포트폴리오를 제작하기 시작했다. 진행했던 웬만한 모든 프로젝트들을 다 작성할 생각이라 썸네일의 정보들을 정리하는데에도 시간을 많이 쏟았다. 포트폴리오 사이트까지 얼른 다 제작하고, 면접 준비반도 신속하게 진행해서 빠르게 기업 지원을 하고싶다!
11번의 시도 끝에 겨우 풀어낸 문제였다... 분명 쉽게 봤는데 생각보다 어려웠다.
JadenCase란 모든 단어의 첫 문자가 대문자이고, 그 외의 알파벳은 소문자인 문자열입니다. 단, 첫 문자가 알파벳이 아닐 때에는 이어지는 알파벳은 소문자로 쓰면 됩니다. (첫 번째 입출력 예 참고)
문자열 s가 주어졌을 때, s를 JadenCase로 바꾼 문자열을 리턴하는 함수, solution을 완성해주세요.
function solution(s) {
const arr = s.split(" ");
return arr
.map((el) => {
if (!isNaN(el[0])) {
return el.toLowerCase();
}
const elArr = el.split("");
const firstStr = elArr.shift();
return firstStr.toUpperCase() + elArr.join("").toLowerCase();
})
.join(" ");
}
처음에는 그냥 공백을 기준으로 split하여, 각 단어의 첫 글자를 대문자로, 나머지 글자를 소문자로 만들어 return하고 해당 단어들을 join하는 방식을 사용했다.
그러나 수많은 케이스에서 런타임 에러가 났다. 그래서 숫자일 경우 때문인가 싶어 숫자일 때는 바로 전부 소문자로 만들어 return을 해주었으나 결과는 마찬가지였다.
혹시 el을 배열로 만드는 것 때문에 시간이 오래 걸려서 그런 건 아닐까하는 가설을 세웠다. 그래서 아래와 같이 el을 배열로 변경하지 않고 만드는 방식을 적용했지만 여전히 결과는 똑같았다.
function solution(s) {
const arr = s.split(" ");
return arr
.map((el) => {
if (!isNaN(el[0])) {
return el.toLowerCase();
}
return el[0].toUpperCase() + el.slice(1, el.length).toLowerCase();
})
.join(" ");
}
그렇게 감을 못 잡고 질문하기를 보던 중, 공백에 집중을 하라는 걸 봤다. 그래서 나는 좀 이상하게 이해를 했는데, 단어 앞에 공백이 있으면 그 공백을 단어 앞에 붙여주는 방식으로 해결해보려고 했다. 당연히, 실패했다. 코드는 아래와 같다.
function solution(s) {
const arr = s.split(" ");
for (let i = 0; i < arr.length; i++) {
if (arr[i] === "") {
arr[i + 1] = " " + arr[i + 1];
arr.splice(i, 1);
}
}
const result = [];
for (let i = 0; i < arr.length; i++) {
if (!isNaN(arr[i][0]) || arr[i][0] === " ") {
result.push(arr[i].toLowerCase());
} else {
result.push(
arr[i][0].toUpperCase() + arr[i].slice(1, arr[i].length).toLowerCase()
);
}
}
return result.join(" ");
}
뭔가 내가 잘못 생각하고 있다는 걸 깨달았다. 공백이 몇개든, 그게 그대로 들어오는 게 맞겠다는 생각. 그래서 단순하게 가보기로 했다. 반복문을 돌려, 문자가 공백이거나 숫자일 경우에는 그대로 result에 추가하고, 알파벳일 경우에는 result의 맨 끝 글자가 공백이거나 result가 비어있을 경우 대문자로, 그 외의 경우에는 소문자로 추가해주는 방식을 사용했다. result를 return하여 문제를 해결할 수 있었다.
function solution(s) {
let result = "";
for (let i = 0; i < s.length; i++) {
if (s[i] === " " || !isNaN(s[i])) {
result += s[i];
} else if (result[result.length - 1] === " " || !result) {
result += s[i].toUpperCase();
} else {
result += s[i].toLowerCase();
}
}
return result;
}
처음부터 쉽게 풀 수 있었지만 공백이라는 변수를 눈치채지 못한 탓이 컸다. 역시 제한 조건 등을 정확히 알고 문제를 풀어야한다는 점을 다시금 깨닫게 되었고, lv.2의 문제들은 이렇게 쉬워보여도 뭔가 다르긴 다르다는 것 역시도 알게되었다.