[Level2] 위장, 괄호 회전하기
위장
나의 풀이
function solution(clothes) {
const hash = clothes.reduce((acc, cur) => {
acc[cur[1]] = acc[cur[1]] ? acc[cur[1]] + 1 : 1;
return acc;
}, {});
return Object.values(hash).reduce((acc, cur) => (acc *= cur + 1), 1) - 1;
}
아악..
정말 간단한 문제인데 2시간이나 붙잡혀있었다.ㅠㅠㅠ
{ headgear: 2, eyewear: 1 } 객체로 만드는거는 했는데,
조합을 구하는걸 나는 멍청하게 총 종류 (2개)에서 3C2 인데, 헤드기어에서 중복인 2C2 빼고
이런식으로 조합의 조합을 구하고 있었다.ㅠㅠ
알고보니 경우의 수(집합의 부분집합) 구하는 개념이었다.
headgear에서 안입는다, A 입는다, B입는다 > 3가지 경우
eyewear에서 안입는다, C 입는다 > 2가지 경우
3 * 2 에서 모두를 안입는 경우인 -1 해서 푸는 문제였다.
수학적 개념이 부족했던 탓이다.
수학 문제 좀 열심히 풀어야겠다.ㅠ
괄호 회전하기
function solution(s) {
let queue = [...s];
function rotation(arr) {
arr.push(arr.shift());
return arr;
}
function isRight(arr) {
let stack = [];
for (let i = 0; i < arr.length; i++) {
stack.push(arr[i]);
if (
(arr[i] == ')' && stack[stack.length - 2] === '(') ||
(arr[i] == '}' && stack[stack.length - 2] === '{') ||
(arr[i] == ']' && stack[stack.length - 2] === '[')
) {
stack.pop();
stack.pop();
}
}
return stack.length ? false : true;
}
let cnt = 0;
for (let i = 0; i < s.length; i++) {
if (isRight(queue)) cnt++;
queue = rotation(queue);
}
return cnt;
}
isRight 함수가 썩 맘에들지 않는다…
더 좋은 방법이 있을것 같은데,,,
이 글을 적던 중 다른 사람의 풀이를 보고 조금 더 좋은 방향을 찾았다.
function solution(s) {
let queue = [...s];
function rotation(arr) {
arr.push(arr.shift());
return arr;
}
function isRight(arr) {
let stack = [];
for (let i = 0; i < arr.length; i++) {
if (arr[i] == ')' && stack[stack.length - 1] === '(') stack.pop();
else if (arr[i] == '}' && stack[stack.length - 1] === '{') stack.pop();
else if (arr[i] == ']' && stack[stack.length - 1] === '[') stack.pop();
else {
stack.push(arr[i]);
}
}
return stack.length ? false : true;
}
let cnt = 0;
for (let i = 0; i < s.length; i++) {
if (isRight(queue)) cnt++;
queue = rotation(queue);
}
return cnt;
}
stack에 무조건 먼저 Push를 하고 pop을 두번 하는 과정이 마음에 안들었는데
else 가 있었다는걸… 깨달았다
바본가..? 왜 else를 까먹었지?
최대한 함수형 프로그래밍으로 짜려했는데, rotation을 계속 해줘야했고, 원본 배열이 유지되는 경우가 없었어서
절차형으로 짜게 된 거 같다.