[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을 계속 해줘야했고, 원본 배열이 유지되는 경우가 없었어서
절차형으로 짜게 된 거 같다.