항해99/TIL
20230612 TIL
공대루루
2023. 6. 13. 02:07
코딩테스트 1단계 카드뭉치
코니는 영어 단어가 적힌 카드 뭉치 두 개를 선물로 받았습니다. 코니는 다음과 같은 규칙으로 카드에 적힌 단어들을 사용해 원하는 순서의 단어 배열을 만들 수 있는지 알고 싶습니다.
원하는 카드 뭉치에서 카드를 순서대로 한 장씩 사용합니다.한 번 사용한 카드는 다시 사용할 수 없습니다.카드를 사용하지 않고 다음 카드로 넘어갈 수 없습니다.기존에 주어진 카드 뭉치의 단어 순서는 바꿀 수 없습니다.
입출력 예
cards1 cards2 goal result ["i", "drink", "water"] ["want", "to"] ["i", "want", "to", "drink", "water"] "Yes" ["i", "water", "drink"] ["want", "to"] ["i", "want", "to", "drink", "water"] "No"
나의 풀이
일단 card1의 값들의 위치와 goal에서의 위치를 비교했을 때 순서가 같다면 yes이고 순서가 다르다면 no를 출력하면 될 것이라고 생각했다. card1를 다 검사하면 card2도 검사하는 방식으로 코드를 작성했지만 3개의 테스트를 통과하지 못했다.
function solution(cards1, cards2, goal) {
const num = cards1.length -1
const num2 = cards2.length -1
for (let i = 0;i<num;i++){
if(goal.indexOf(cards1[i]) < goal.indexOf(cards1[i+1])){
continue;
}else{
return "No"
break;
}
}
for (let i = 0;i<num2;i++){
if(goal.indexOf(cards2[i]) < goal.indexOf(cards2[i+1])){
continue;
}else{
return "No"
break;
}
}
return "Yes"
}
테스트케이스를 찾아봤더니 card1 과 card2의 모든 문자를 사용하지 않고 goal을 만드는 경우라고 한다. 이 경우, card1에는 있지만 goal에는 없는 단어가 생기기 때문에 if 구문으로 해결할 수 없게된다.
다른 사람의 풀이
function solution(cards1, cards2, goal) {
for(const s of goal) {
if(cards1[0] == s) {
cards1.shift();
} else if(cards2[0] == s) {
cards2.shift();
} else {
return "No"
}
}
return "Yes";
}
goal에 있는 문자열을 하나씩 판별하는 방법으로,cards1에 해당하는 문자라면 cards1에서 제거하고, cards2에 해당하는 문자라면 cards2에서 제거하며 yes와 no를 판별한다. 진짜 간단하고 확실한 방법이다..... 난 왜 저런 생각이 떠오르지 않는가 흑