다음 규칙을 지키는 문자열을 올바른 괄호 문자열이라고 정의합니다.
()
, []
, {}
는 모두 올바른 괄호 문자열입니다.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;
}