문제 설명
코니는 영어 단어가 적힌 카드 뭉치 두 개를 선물로 받았습니다. 코니는 다음과 같은 규칙으로 카드에 적힌 단어들을 사용해 원하는 순서의 단어 배열을 만들 수 있는지 알고 싶습니다.
원하는 카드 뭉치에서 카드를 순서대로 한 장씩 사용합니다.
한 번 사용한 카드는 다시 사용할 수 없습니다.
카드를 사용하지 않고 다음 카드로 넘어갈 수 없습니다.
기존에 주어진 카드 뭉치의 단어 순서는 바꿀 수 없습니다.
예를 들어 첫 번째 카드 뭉치에 순서대로 ["i", "drink", "water"], 두 번째 카드 뭉치에 순서대로 ["want", "to"]가 적혀있을 때 ["i", "want", "to", "drink", "water"] 순서의 단어 배열을 만들려고 한다면 첫 번째 카드 뭉치에서 "i"를 사용한 후 두 번째 카드 뭉치에서 "want"와 "to"를 사용하고 첫 번째 카드뭉치에 "drink"와 "water"를 차례대로 사용하면 원하는 순서의 단어 배열을 만들 수 있습니다.
문자열로 이루어진 배열 cards1, cards2와 원하는 단어 배열 goal이 매개변수로 주어질 때, cards1과 cards2에 적힌 단어들로 goal를 만들 있다면 "Yes"를, 만들 수 없다면 "No"를 return하는 solution 함수를 완성해주세요.
입출력 예
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" |
문제 풀이
function solution(cards1, cards2, goal) {
let i = 0;
while (i < goal.length) {
if (goal[i] === cards1[0]) {
goal.shift();
cards1.shift();
} else if (goal[i] === cards2[0]) {
goal.shift();
cards2.shift();
} else {
i++;
}
}
if (goal.length === 0) {
return "Yes";
}
return "No";
}
문제의 의도는 cards1과 cards2가 섞이더라도 goal과 같은 순서면 yes, 아니면 no를 반환한다.
예시와 같이 water가 drink보다 먼저 나오게 되면, drink는 나올 수가 없어서 no를 반환한다.
goal에서는 drink가 water보다 앞에 있기 때문이다.
그래서 반복문을 돌려서 goal의 글자를 cards1과 cards2의 맨 앞에 있는지 확인하고,
있을 경우 검사한 글자를 goal과 해당 cards에서 지운다. i는 0부터 늘려간다.
cards1, cards2의 맨 앞글자를 확인한 것이기 때문에 있으면 맨 앞을 지우는 것이다.
goal을 확인하며 cards에 속할 경우 지우기 때문에 점점 줄어들텐데,
만약 다 지워진다는 것은 cards1,2가 섞이더라도 글자가 나오는 순서가 goal과 같다는 것이고,
goal의 글자가 남는다는 것은 cards1,2에서 글자가 나오는 순서가 goal과 다르다는 것이다.
그렇기 때문에 goal에 아무것도 없으면(길이가 0) Yes를 반환, 그렇지 않을 경우 No를 반환한다.
'개발 > 코딩테스트' 카테고리의 다른 글
[프로그래머스 | JavaScript] 등차수열의 특정한 항만 더하기 (0) | 2023.06.29 |
---|---|
[프로그래머스 | MySQL] 최솟값 구하기 (0) | 2023.06.05 |
[프로그래머스 | JavaScript] 명예의 전당(1) (0) | 2023.05.26 |
[프로그래머스 | JavaScript] 폰켓몬 (0) | 2023.05.25 |
[백준 | JavaScript] 2566 최댓값 (1) | 2023.05.24 |