코딩테스트 27일차
크기가 작은 부분문자열
숫자로 이루어진 문자열 t와 p가 주어질 때, t에서 p와 길이가 같은 부분문자열 중에서, 이 부분문자열이 나타내는 수가 p가 나타내는 수보다 작거나 같은 것이 나오는 횟수를 return하는 함수 solution을 완성하세요.
예를 들어, t="3141592"이고 p="271" 인 경우, t의 길이가 3인 부분 문자열은 314, 141, 415, 159, 592입니다. 이 문자열이 나타내는 수 중 271보다 작거나 같은 수는 141, 159 2개 입니다.
function solution(t, p) {
var answer = 0;
var n = t.length;
var m = p.length;
for (var i = 0; i <= n - m; i++) {
var subStr = t.substr(i, m);
var subNum = parseInt(subStr);
if (subNum <= parseInt(p)) {
answer++;
}
}
return answer;
}
✏️풀이
solution 함수는 문자열 t와 p를 입력으로 받아서, 부분 문자열 중에서 p보다 작거나 같은 수가 나오는 횟수를 반환합니다.
answer 변수는 초기값으로 0을 가지고 있습니다. 이 변수는 p보다 작거나 같은 수가 나오는 횟수를 저장합니다.
n은 문자열 t의 길이를, m은 문자열 p의 길이를 저장합니다.
for 루프를 통해 t에서 길이가 m인 모든 부분 문자열을 추출합니다. 루프의 시작점은 0이며, 끝점은 n - m입니다. 이렇게 함으로써 부분 문자열의 범위가 t를 벗어나지 않도록 합니다.
substr(i, m)을 사용하여 t에서 부분 문자열을 추출합니다. i는 시작 위치이고, m은 추출할 부분 문자열의 길이입니다. 추출한 부분 문자열은 subStr에 저장됩니다.
parseInt(subStr)을 사용하여 subStr을 숫자로 변환합니다. 이때, parseInt 함수는 문자열을 정수로 변환하는 데 사용됩니다. 변환한 숫자는 subNum에 저장됩니다.
subNum이 p보다 작거나 같으면, answer를 1 증가시킵니다. 즉, subNum이 p와 비교하여 작거나 같으면 answer에 1을 더해줍니다.
모든 부분 문자열을 확인한 후, 최종적인 answer를 반환합니다.
카드 뭉치
코니는 영어 단어가 적힌 카드 뭉치 두 개를 선물로 받았습니다. 코니는 다음과 같은 규칙으로 카드에 적힌 단어들을 사용해 원하는 순서의 단어 배열을 만들 수 있는지 알고 싶습니다.
원하는 카드 뭉치에서 카드를 순서대로 한 장씩 사용합니다.
한 번 사용한 카드는 다시 사용할 수 없습니다.
카드를 사용하지 않고 다음 카드로 넘어갈 수 없습니다.
기존에 주어진 카드 뭉치의 단어 순서는 바꿀 수 없습니다.
예를 들어 첫 번째 카드 뭉치에 순서대로 ["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 함수를 완성해주세요.
function solution(cards1, cards2, goal) {
let i = 0; // cards1에서의 인덱스
let j = 0; // cards2에서의 인덱스
for (let k = 0; k < goal.length; k++) {
if (cards1[i] === goal[k]) {
i++;
} else if (cards2[j] === goal[k]) {
j++;
} else {
return "No";
}
}
if (i !== cards1.length || j !== cards2.length) {
return "No";
}
return "Yes";
}
✏️풀이
초기화 및 루프 설정: i와 j 변수를 각각 0으로 초기화합니다. 이 변수는 cards1과 cards2 배열에서의 인덱스를 나타냅니다.
k 변수를 0부터 goal 배열의 길이보다 작을 때까지 반복하는 루프를 설정합니다.
단어 선택: 현재 goal 배열의 요소와 cards1 배열에서 i 인덱스에 위치한 요소를 비교합니다.
일치하는 경우: i를 1 증가시켜 cards1에서 다음 단어를 선택합니다.
일치하지 않는 경우: 현재 goal 배열의 요소와 cards2 배열에서 j 인덱스에 위치한 요소를 비교합니다.
일치하는 경우: j를 1 증가시켜 cards2에서 다음 단어를 선택합니다.
일치하지 않는 경우: "No"를 반환하고 함수를 종료합니다.
선택한 단어 확인: goal 배열을 모두 확인한 후에도 cards1 배열이나 cards2 배열에 선택하지 않은 단어가 남아있는지 확인합니다.
선택하지 않은 단어가 남아있는 경우: "No"를 반환하고 함수를 종료합니다.
결과 반환: 모든 단어를 선택한 후, goal 배열을 만들 수 있었다면 "Yes"를 반환합니다.