다음 규칙을 지키는 문자열을 올바른 괄호 문자열이라고 정의합니다.
(), [], {} 는 모두 올바른 괄호 문자열입니다.A가 올바른 괄호 문자열이라면, (A), [A], {A} 도 올바른 괄호 문자열입니다. [] 가 올바른 괄호 문자열이므로, ([]) 도 올바른 괄호 문자열입니다.A, B가 올바른 괄호 문자열이라면, AB 도 올바른 괄호 문자열입니다. {} 와 ([]) 가 올바른 괄호 문자열이므로, {}([]) 도 올바른 괄호 문자열입니다.대괄호, 중괄호, 그리고 소괄호로 이루어진 문자열 s가 매개변수로 주어집니다. 이 s를 왼쪽으로 x (0 ≤ x < (s의 길이)) 칸만큼 회전시켰을 때 s가 올바른 괄호 문자열이 되게 하는 x의 개수를 return 하도록 solution 함수를 완성해주세요.
제한사항
s의 길이는 1 이상 1,000 이하입니다.입출력 예
"[](){}"| x | s를 왼쪽으로 x칸만큼 회전 | 올바른 괄호 문자열 |
|---|---|---|
| 0 | "[](){}" | O |
| 1 | "](){}[" | X |
| 2 | "(){}[]" | O |
| 3 | "){}[](" | X |
| 4 | "{}[]()" | O |
| 5 | "}[](){" | X |
function solution(s) {
let answer = 0;
const brackets = s.split('');
const closeBracketPair = {']':'[', ')':'(', '}':'{'};
const isBracketsVaild = (brackets) => {
const stack = [];
for (let i = 0; i < brackets.length; i++) {
const bracket = brackets[i];
if (!closeBracketPair[bracket]) {
stack.push(bracket);
continue;
}
if (stack[stack.length - 1] !== closeBracketPair[bracket]) {
return false;
}
stack.pop();
}
return !stack.length;
};
for (let i = 0; i < s.length; i++) {
if (isBracketsVaild(brackets)) {
answer++;
}
brackets.push(brackets.shift());
}
return answer;
}
12 = 5 + 5 + (5 / 5) + (5 / 5)
12 = 55 / 5 + 5 / 5
12 = (55 + 5) / 5
5를 사용한 횟수는 각각 6,5,4 입니다. 그리고 이중 가장 작은 경우는 4입니다.
이처럼 숫자 N과 number가 주어질 때, N과 사칙연산만 사용해서 표현 할 수 있는 방법 중 N 사용횟수의 최솟값을 return 하도록 solution 함수를 작성하세요.
제한사항
N은 1 이상 9 이하입니다.number는 1 이상 32,000 이하입니다.8보다 크면 -1을 return 합니다.| 숫자 N 개수 | 연산 종류 |
|---|---|
| 1 | N |
| 2 | NN, N + N, N - N, N/N |
| 3 | NNN, NN + N, NN - N, NNN, NN/N, N + N + N, N + N - N, N + NN, N + N/N, N - N + N, N - NN, N - N/N, ... [1결과(연산)2결과, 2결과(연산)1결과] |
| 4 | [1결과(연산)3결과, 2결과(연산)3결과, 3결과(연산)1결과] |
function solution(N, number) {
let answer = 0;
const memo = Array.from({length : 9}, () => new Set());
if (N === number) {
return 1;
}
memo.forEach((element, index) => {
if (index) {
return element.add((Number(String(N).repeat(index))));
}
});
for (let count = 1; count <= 8; count++) {
for (let prevCount = 1; prevCount < count; prevCount++) {
for (let element1 of memo[prevCount]) {
for (let element2 of memo[count - prevCount]) {
memo[count].add(element1 + element2);
memo[count].add(element1 - element2);
memo[count].add(element1 * element2);
memo[count].add(Math.floor(element1 / element2));
}
}
}
if (memo[count].has(number)) {
return count;
}
}
return -1;
}
카카오 초등학교의 "니니즈 친구들"이 "라이언" 선생님과 함께 가을 소풍을 가는 중에 징검다리가 있는 개울을 만나서 건너편으로 건너려고 합니다. "라이언" 선생님은 "니니즈 친구들"이 무사히 징검다리를 건널 수 있도록 다음과 같이 규칙을 만들었습니다.
"니니즈 친구들"은 개울의 왼쪽에 있으며, 개울의 오른쪽 건너편에 도착해야 징검다리를 건넌 것으로 인정합니다.
"니니즈 친구들"은 한 번에 한 명씩 징검다리를 건너야 하며, 한 친구가 징검다리를 모두 건넌 후에 그 다음 친구가 건너기 시작합니다.
디딤돌에 적힌 숫자가 순서대로 담긴 배열 stones와 한 번에 건너뛸 수 있는 디딤돌의 최대 칸수 k가 매개변수로 주어질 때, 최대 몇 명까지 징검다리를 건널 수 있는지 return 하도록 solution 함수를 완성해주세요.
제한사항
stones 배열의 크기는 1 이상 200,000 이하입니다.stones 배열 각 원소들의 값은 1 이상 200,000,000 이하인 자연수입니다.k는 1 이상 stones의 길이 이하인 자연수입니다.function solution(stones, k) {
let left = 1;
let right = 200000000;
while(left <= right) {
const mid = Math.floor((left + right) / 2);
let skipCount = 0;
for(let i = 0; i < stones.length; i++) {
if(stones[i] - mid <= 0) {
skipCount += 1;
} else {
// 건너뛰는 돌이 연속되지 않아서 skipCount 초기화
skipCount = 0;
}
if(skipCount === k) {
// 건너뛰는 돌이 k개 이상일 경우, 건너 뛸 수 없으므로 loop 종료
break;
}
}
if(skipCount === k) {
// mid 값이 크기 때문에 최대값의 범위를 줄여줌
right = mid - 1;
} else {
// mid 값이 작기 때문에 최소값의 범위를 늘려줌
left = mid + 1;
}
}
return left;
}
무인도에 갇힌 사람들을 구명보트를 이용하여 구출하려고 합니다. 구명보트는 작아서 한 번에 최대 2명씩 밖에 탈 수 없고, 무게 제한도 있습니다.
구명보트를 최대한 적게 사용하여 모든 사람을 구출하려고 합니다.
사람들의 몸무게를 담은 배열 people과 구명보트의 무게 제한 limit가 매개변수로 주어질 때, 모든 사람을 구출하기 위해 필요한 구명보트 개수의 최솟값을 return 하도록 solution 함수를 작성해주세요.
제한사항
function solution(people, limit) {
let answer = 0;
let left = 0;
let right = people.length - 1;
people.sort((a,b) => a - b);
while (left <= right) {
if (left === right) {
answer++;
break;
}
if (people[left] + people[right] <= limit) {
left += 1;
right -= 1;
} else {
right -= 1;
}
answer++;
}
return answer;
}
| 종류 | 이름 |
|---|---|
| 얼굴 | 동그란 안경, 검정 선글라스 |
| 상의 | 파란색 티셔츠 |
| 하의 | 청바지 |
| 겉옷 | 긴 코트 |
스파이가 가진 의상들이 담긴 2차원 배열 clothes가 주어질 때 서로 다른 옷의 조합의 수를 return 하도록 solution 함수를 작성해주세요.
제한사항
clothes의 각 행은 [의상의 이름, 의상의 종류]로 이루어져 있습니다.clothes의 모든 원소는 문자열로 이루어져 있습니다.function solution(clothes) {
let cases = 1;
const clothMap = new Map();
clothes.forEach(([clothName, clothType]) => {
const sameTypeClothes = clothMap.get(clothType);
sameTypeClothes ? clothMap.set(clothType, [...sameTypeClothes, clothName]) : clothMap.set(clothType, [clothName]);
});
for (let [clothType, clothes] of clothMap.entries()) {
cases *= clothes.length + 1;
}
return cases - 1;
}