[알고리즘] 위장

2022. 8. 2. 16:57·알고리즘
반응형

문제 설명

스파이들은 매일 다른 옷을 조합하여 입어 자신을 위장합니다.

예를 들어 스파이가 가진 옷이 아래와 같고 오늘 스파이가 동그란 안경, 긴 코트, 파란색 티셔츠를 입었다면 다음날은 청바지를 추가로 입거나 동그란 안경 대신 검정 선글라스를 착용하거나 해야 합니다.


종류 이름
얼굴 동그란 안경, 검정 선글라스
상의 파란색 티셔츠
하의 청바지
겉옷 긴 코트

스파이가 가진 의상들이 담긴 2차원 배열 clothes가 주어질 때 서로 다른 옷의 조합의 수를 return 하도록 solution 함수를 작성해주세요.

제한사항

clothes의 각 행은 [의상의 이름, 의상의 종류]로 이루어져 있습니다.

  • 스파이가 가진 의상의 수는 1개 이상 30개 이하입니다.
  • 같은 이름을 가진 의상은 존재하지 않습니다.
  • clothes의 모든 원소는 문자열로 이루어져 있습니다.
  • 모든 문자열의 길이는 1 이상 20 이하인 자연수이고 알파벳 소문자 또는 '_' 로만 이루어져 있습니다.
  • 스파이는 하루에 최소 한 개의 의상은 입습니다.

입출력 예

clothes return
[["yellowhat", "headgear"], ["bluesunglasses", "eyewear"], ["green_turban", "headgear"]] 5
[["crowmask", "face"], ["bluesunglasses", "face"], ["smoky_makeup", "face"]] 3

입출력 예 설명

예제 #1
headgear에 해당하는 의상이 yellow_hat, green_turban이고 eyewear에 해당하는 의상이 blue_sunglasses이므로 아래와 같이 5개의 조합이 가능합니다.

1. yellow_hat
2. blue_sunglasses
3. green_turban
4. yellow_hat + blue_sunglasses
5. green_turban + blue_sunglasses

예제 #2
face에 해당하는 의상이 crow_mask, blue_sunglasses, smoky_makeup이므로 아래와 같이 3개의 조합이 가능합니다.

1. crow_mask
2. blue_sunglasses
3. smoky_makeup

나의 풀이

const clothes = [
  ["a", "aa"],
  ["b", "aa"],
  ["c", "aa"],
  ["aa", "bb"],
  ["bb", "bb"],
  ["c_c", "bb"],
  ["aaa", "cc"],
  ["bbb", "cc"],
  ["bdb", "cc"],
];

function loop(clothes, index, result) {
  let value = 0;

  for (let i = index; i < clothes.length; i++) {
    value +=
      result * clothes[i].length +
      loop(clothes, i + 1, result * clothes[i].length);
  }

  return value;
}

function solution(clothes) {
  const obj = {};

  for (const item of clothes) {
    const value = obj[item[1]];

    if (value) {
      obj[item[1]].push(item[0]);
    } else {
      obj[item[1]] = [item[0]];
    }
  }

  return loop(Object.values(obj), 0, 1);
}

console.log(solution(clothes));

모든 경우의 수를 곱하는 방식으로 문제를 풀었다. 

["a", "aa"],

["b", "aa"],

["c", "aa"],

["aa", "bb"],

["bb", "bb"],

["c_c", "bb"],

["aaa", "cc"],

["bbb", "cc"],

["bdb", "cc"],

배열이 있을 경우

3 * 3 * 3       +

3 * 3            +

3 * 3            +

3 * 3            +

3                 +

3  

3

로 계산이 된다. 

 

function solution(clothes) {
  const obj = {};
  let answer = 1;

  for (const item of clothes) {
    const value = obj[item[1]];

    if (value) {
      obj[item[1]].push(item[0]);
    } else {
      obj[item[1]] = [item[0]];
    }
  }

  for (const item of Object.values(obj)) {
    answer *= item.length + 1;
  }

  return answer - 1;
}

수학 공식으로도 풀 수 있었는데, 

하의 : a, b가 있고

상의 : c, v, d가 있다면 

 

하의는 

a를 입는다. 

b를 입는다.

아무것도 입지 않는다.

 

상의는 

c를 입는다.

v를 입는다.

d를 입는다. 

아무것도 입지 않는다. 

 

이렇게 옷 개수 + 1개가 가능하므로 (N + 1)(M + 1)이다. 

하지만 모두 입지 않는 경우는 불가능 하므로 (N + 1)(M + 1) -1이고 옷의 종류가 늘어나면

(N + 1)(M + 1)(O + 1) ... -1 이 된다.

 

그 공식으로 푸니 더 간단하게 풀렸다. 

 

반응형
저작자표시 비영리 변경금지 (새창열림)

'알고리즘' 카테고리의 다른 글

[알고리즘] 괄호 회전하기  (1) 2022.08.04
[알고리즘] 배달  (1) 2022.08.03
[알고리즘] 후보키  (1) 2022.07.30
[알고리즘] 순위 검색  (2) 2022.07.27
[알고리즘] 예상 대진표  (2) 2022.07.26
'알고리즘' 카테고리의 다른 글
  • [알고리즘] 괄호 회전하기
  • [알고리즘] 배달
  • [알고리즘] 후보키
  • [알고리즘] 순위 검색
잉여개발자
잉여개발자
풀스택 개발자를 목표로 잉여롭게 개발 공부도 하면서 다양한 취미 생활도 즐기고 있는 잉여 개발자입니다.
  • 잉여개발자
    잉여로운 개발일지
    잉여개발자
    • 분류 전체보기 (789)
      • 개발정보 (36)
      • 개발환경 (7)
      • 개발생활 (19)
      • React (141)
        • 이론 (23)
        • 기능 (12)
        • 실험실 (88)
        • 버그 (6)
        • 패스트캠퍼스 (9)
        • Npm (3)
      • React Native (28)
        • 공통 (6)
        • TypeScript (3)
        • JavaScript (18)
        • 버그 (1)
      • Next.js (30)
        • 이론 (13)
        • 실험실 (13)
        • 버그 (3)
      • Web (35)
      • 알고리즘 (202)
        • 풀이 힌트 (39)
      • JavaScript (47)
      • TypeScript (29)
        • 기초 (27)
        • 실험실 (2)
      • Node.js (13)
        • 이론 (0)
        • 기능 (3)
        • 실험실 (9)
        • 버그 (1)
      • 도커 (4)
      • CCNA (22)
        • 이론 (4)
        • 문제 (18)
      • 취미생활 (167)
        • 잉여로운 칵테일 (2)
        • 잉여의 식물키우기 (130)
        • 잉여로운 여행기 (11)
        • 잉여의 제2외국어 (21)
        • 잉여로운 책장 (2)
      • Java (1)
        • Java의 정석 (1)
      • 꿀팁 공유 (3)
  • 태그

    프로그래머스
    webpack
    다이소
    next.js
    ReactNative
    Docker
    영어독학
    타일러영어
    리액트
    알고리즘
    식물
    리얼클래스
    네이버 부스트캠프
    ChatGPT
    자바스크립트
    react
    javascript
    네트워크
    영어회화
    Node.js
    타입스크립트
    리얼학습일기
    Babel
    바질 키우기
    redux
    바질
    CSS
    CCNA
    덤프
    typescript
  • hELLO· Designed By정상우.v4.10.1
잉여개발자
[알고리즘] 위장
상단으로

티스토리툴바