스터디 기록 22

유아현·2023년 1월 7일
0

Study

목록 보기
23/27
post-thumbnail

문제 목록

📢 행렬의 곱셈

function solution(arr1, arr2) {
  /*
  각 배열들끼리 행과 열을 곱한 값을 새로운 배열에 담아 리턴시키기

  결과 배열은 arr1의 row 수 * arr2[0] 요소의 수
  결과 배열에 미리 0을 채워 넣고 해당하는 인덱스에 결과 값을 할당하는 방식으로 풀어보기
  */

  console.log(arr1.length);
  console.log(arr2[0].length);

  let arr = Array.from(Array(arr1.length), () => Array(arr2[0].length).fill(0));
  console.log(arr);

  for (let row1 = 0; row1 < arr1.length; row1++) {
    for (let col = 0; col < arr2[0].length; col++) {
      for (let row2 = 0; row2 < arr2.length; row2++) {
        arr[row1][col] += arr1[row1][row2] * arr2[row2][col];
      }
    }
  }

  console.log(arr);
}
solution(
  [
    [1, 4],
    [3, 2],
    [4, 1],
  ],
  [
    [3, 3],
    [3, 3],
  ]
);

/*
?  arr1        arr2
  [[1, 4],     [[3, 3],
  [3, 2],      [3, 3]]
  [4, 1]] 

  [[2, 3, 2],   [[5, 4, 3],
  [4, 2, 4],    [2, 4, 1],
  [3, 1, 4]]    [3, 1, 1]]
*/

오랜만에 미적분 강의를 듣게 만든 문제.... 3중포문 사용이 헷갈려서 변수명을 나름 관련 있는 거로 하니 이해는 됐지만 다시 쓰라고 하면 헷갈려서 또 시간잡아먹을 것 같은 느낌이다.

📢 괄호 회전하기

function poppop(bracket) {
  bracket.pop();
  bracket.pop();

  return bracket;
}

function solution(s) {
  /*
  (), [], {} 모두 올바른 괄호 문자임
  ! 스택으로 접근
  로테이션을 돌면서 로테이션 돌 때 s를 하나씩 bracket에 담아 마지막 두 요소가 []나 {}나 ()로
  끝나는지 확인 후, 맞다면 두 요소를 빼주는 형식으로 풀이
  로테이션을 돌 때마다 제일 앞에 있는 요소가 뒤로 가야 되니까 shift한 것을 pop으로 다시 넣어준다.
  */
  s = [...s];
  let result = 0;

  for (let rotation = 0; rotation < s.length; rotation++) {
    let bracket = [];
    for (let i = 0; i < s.length; i++) {
      bracket.push(s[i]);
      if (bracket.length >= 2) {
        if (bracket.at(-2) === '[' && bracket.at(-1) === ']') {
          bracket = poppop(bracket);
        } else if (bracket.at(-2) === '(' && bracket.at(-1) === ')') {
          bracket = poppop(bracket);
        } else if (bracket.at(-2) === '{' && bracket.at(-1) === '}') {
          bracket = poppop(bracket);
        }
      }
    }
    if (!bracket.length) result++;
    s.push(s.shift());
  }
  console.log(result);
  return result;
}

/* 아 짝.>~~~ 하아

  [ ]
  { }
  */

solution('[)(]');

우선 스택으로 풀었다. 처음에는 괄호의 종류가 3가지나 되는 것을 간과하고 있다가 헛다리 집고 있었다. 지금 코드를 보니 at으로 마지막에서 두번째 것과 마지막 요소를 뽑아서 비교하고 있는데 그럴 필요 없이 slice를 통해서 한번에 마지막 두개를 뽑아와서 비교하면 됐는데 또또 하드코딩했다는 점~~ 아무튼 마지막 두 개의 요소가 괄호로 열리고 닫히는 패턴이라면 pop을 두번 시켜 제거하는 형식으로 하고 로테이션을 돌릴 때마다 마지막엔 첫번째 요소가 뒤로 가게끔 앞에 요소를 뽑아 뒤로 push 시켜주었다.

// 올바른 괄호 문자열?
function isValid(s) {
  const brackets = {
    ")": "(",
    "}": "{",
    "]": "[",
  };
  const stack = [];
  for (const b of s) {
    // if b is a close bracket
    if (Object.keys(brackets).includes(b)) {
      if (stack.length === 0) return false;
      if (stack.at(-1) !== brackets[b]) return false;
      stack.pop();
    } else stack.push(b);
  }
  return stack.length === 0 ? true : false;
}

// 회전 문자열: arr.push(arr.shift)
function solution(s) {
  const newS = s.split("");
  let result = 0;
  for (const b of newS) {
    if (isValid(newS)) result++;
    newS.push(newS.shift());
  }
  return result;
}

그리고 미친듯한 천재같은 코드.... 민혁님의 설명을 듣는데 이해가 너무 잘돼서 문제였다. 객체로 접근해서 키로 할 줄이야 너무 좋은 코드이다.

📢 위장

function solution(c) {
  let result = c.length;
  console.log(result);

  let closet = {};
  for (let i = 0; i < c.length; i++) {
    // 종류는 돌면 안 돼~!
    for (let j = 0; j < c[i].length - 1; j++) {
      const kind = c[i].at(-1); //종류
      /* 옷장 안에 의상 종류가 있는지 확인하고, 없으면 종류를 만들어 주고 
      해당 종류의 옷들을 옷장에 넣어줌 */
      console.log(kind);
      if (!closet.hasOwnProperty(kind)) {
        closet[kind] = [];
      }
      closet[kind].push(c[i][j]);
    }
  }

  closet = Object.values(closet);
  console.log(closet[0].length);
  //! 경우의 수 구하는 부분
  let dressUp = 1;
  for (let i = 0; i < closet.length; i++) {
    dressUp *= closet[i].length + 1;
  }
  console.log(dressUp);
  console.log(dressUp - 1);

  return dressUp - 1;
}

solution([
  ['crow_mask', 'face'],
  ['blue_sunglasses', 'face'],
  ['smoky_makeup', 'face'],
]);

객체로 푼 문제 종류는 겹치면 안 되기 때문에 종류에 해당하는 옷들에 맞게 객체의 키로 종류를 키의 값으로 아이템들을 넣어 옷장을 완성 시켜 주었다. 그리고 조합 가능한 경우의 수를 구해주어 리턴해 주었다.

function solution(clothes) {

    let answer = 1;
    let obj = {};

    for(let i=0; i<clothes.length; i++){
        obj[clothes[i][1]] = (obj[clothes[i][1]] || 1) + 1;
    }
    for(let key in obj){
        answer *= obj[key];
    }

    return answer-1;
}

/*
[
    ["yellow_hat", "headgear"], 
    ["blue_sunglasses", "eyewear"], 
    ["green_turban", "headgear"]
]	
의상들배열을 돌면서, obj에 넣어줌.
의상의 종류를 키로하고, 키의 값을 하나씩 누적하자
만약 키가 없다면 만들어주고 1을 넣어준다.
있다면 그 키의 값으로 +1씩 더해준다.
만약
상의가 A,B,C 3개가 있을 때 
상의를 입는 경우의 수는 [A, B, C, 입지 않는다.]로 총 3+1가지
그리고 의상의 종류별로 각 값들을 곱해준다.
그 곱에서 최종적으로 모든 의상종류를 다 입지 않은 경우인 1가지 경우의 수를 -1을 빼준다.*/

설명부터 코드까지 너무 깔끔했던 승연님의 코드~~ 내가 처음에 하려고 했던 접근법으로 풀어오셔서 흥미롭게 들었다. 카운트 개념으로 종류가 가진 아이템의 갯수로 바로 배열을 만들어 주고 조합 가능한 경우의 수를 구해 주었다. 코드도 깔끔하고 이해가 잘돼 너무 좋은 코드...이다 굿

0개의 댓글