조카는 "aya", "ye", "woo", "ma" 네 가지 발음과 네 가지 발음을 조합해서 만들 수 있는 발음밖에 하지 못하고 연속된 말은 못한다.
babbling이 매개변수로 주어질때 조카가 발음할수 있는 단어 갯수의 총 합을 리턴
var answer = 0;
const talk = ["aya", "ye", "woo", "ma" ];
answer = babbling.map(char=>{
for(let t of talk){
char = char.replace(t,' ')
}
return char
})
answer = answer.filter(x=>!x.trim()).length
return answer;
접근 방법은 말할수 있는 단어들을 지운다음에 빈 칸의 개수를 새면 되겠다 라고 생각하여 위처럼 풀었다.
테스트 케이스들은 다 통과 하였다.
근데 제출하니 1, 11 ,14, 16, 17 가 틀렸다.
몇달이 지난 후에 다시 도전했다. 기존에 코드를 안보고 새로 문제 푸는 기분으로 다시 문제를 맞이했다.
var answer = 0;
const canTalks = ["aya", "ye", "woo", "ma" ];
let newArr = babbling
for(let canTalk of canTalks){
newArr = newArr.map(talk => {
if(talk === ''){
return talk
}
let sliced = talk.split(canTalk);
if(sliced.filter(x=>x==='').length>2){
return talk
}
return sliced.join('')
})
}
console.log(newArr)
return newArr.filter(x=>x==='').length;
첫시도를 안보고 문제를 풀었는데 문제 접근 방식은 같게 생각했다.
말할수 있는 단어를 다 지운다음에 빈칸의 개수를 세면 된다.
이렇게 문제를 풀었는데 1번은 맞았는데 뒤에 14번 부터 작살이 났다
뭐가 문제인지 질문하기를 쭉 둘러보면서 반례 테스트 케이스를 모았다.
반례 : yayae 통과 못함 답 0 인데 1이 나온다
split를 사용해서 지우니 aya 지우고 합치니 ye가 되어서 이것도 지워버린다.
그래서 틀렸다.
var answer = 0;
const canTalks = ["aya", "ye", "woo", "ma" ];
const firstLetter = ["a","y","w","m"];
let newArr = babbling.map((babb)=>{
let babbFirst = babb[0];
let limitCanTalks = [true,true,true,true];
while(true){
let findFirst = firstLetter.findIndex(first => first === babbFirst);
if(findFirst ===-1 || !limitCanTalks[findFirst]) {
return babb
}
let canTalk = canTalks[findFirst]
limitCanTalks = limitCanTalks.map((x,i)=>i!==findFirst) ; // 이부분 수정함
for(let i=1; i < canTalk.length ; i++){
if(canTalk[i] !== babb[i]){
return babb
break;
}
}
babb = babb.slice(canTalk.length)
babbFirst= babb[0]
if(babb===''){
answer++
}
}
return babb
})
return answer;
2번의 반례들을 확인해보니 호락호락하게 쉽게 문제를 내지 않는구나 라고 생가하며 그러면 어쩔수 없이
하나씩 하나씩 찾아봐야 겠다 라고 생각하고 문제를 구현했다.
처음 시도때는 limitCanTalks 를 사용하여 사용한 단어의 위치를 false로 지우고 고정해두었다.
연속해서 사용할수 없기 때문에 이를 사용했는데
이렇게 제출했는데 마찬가지로 1, 11 ,14, 16, 17 가 틀렸다.
문제가 뭘까 라고 다른 반례들을 뒤져보다가 아래 반례를 찾게 되었다.
- 1, 11, 14, 20 ["ayayeaya"] , 1 ~> 발음 가능 (연속으로 같은 발음만 아니면 다시 사용 가능) ["ayayeye"] , 0 ~> 발음 불가능
- 17 ["ayayeayayeayaaya"],0 ~> 발음 불가능 (마지막에 연속으로 같은 발음)
첫 예시를 보니 (연속으로 같은 발음만 아니면 다시 사용 가능) 이라는 말이 있었다,
나는 한번 말을 하면 연속이 안되기 때문에 arr를 만들어서 false 로해서 바로 넘겼는데 이럴 경우 다시 판별해줘야 했다.
그래서 while문에서 마지막까지 돌고 다시 방문한 arr 를 초기화 해주었다.
이렇게 문제를 수정하니 통과할수 있었다.
연속으로 같은 발음만 아니면 다시 사용 가능 이런 예시가 없다보니 생각하지 못했는데 이것은
문제 출제자에서 예시를 잘못둔 문제일까 ? 아니면 문제 푸는 사람이 이런 것까지 생각해서 문제를 풀어야했던걸까 ?
고민이 많이 된다..
연속 발음이 안된다라는 생각에 잘못 생각해서 헤맸던게 문제를 잘읽어보고 생각을 많이 해봐야 겠다 라는 생각을 갖게 하였다.
레벨 1문제라서 쉽게 봤는데 나름 시간이 많이 들었다.