해시_위장

mingyu Lim·2023년 2월 21일

코딩테스트

목록 보기
3/32

문제 링크

프로그래머스 LV_2 위장

문제 설명

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

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

위의 표처럼 옷이 있다고 하면 [(동그란 안경, 파란색 티셔츠) , (파란색 티셔츠, 청바지)(청바지)...] 이런 씩으로 종류별로 하나씩 혹은 입지 않고 입었을 때의 총 조합의 갯수를 구하는 것이다. 단, 아무 것도 입지 않는 경우는 없다.

code

function solution(clothes) {
  let clothesType = {}
  let sum = 1

  // 1. clothes에 배열의 요소를 key = 종류, values = 옷이름으로 지정해주는 배열을 만든다.
  for (let i of clothes){  
      if(clothesType[i[1]] === undefined) clothesType[i[1]] = [i[0]]
      else clothesType[i[1]].push(i[0])
  }
  
  // 2. 모든 경우의 수 모든 가지수의 갯수를 곱한다. +1은 입지 않았을 때를 말한다.
  for(let key in clothesType){
  sum *= clothesType[key].length+1
  }
  
  // 모든 옷을 입지 않는 경우의 수는 없으니, 모든 경우의 수에서 1을 뺀다.
  return sum-1

}

입출력

clothesreturn
[["yellow_hat", "headgear"], ["blue_sunglasses", "eyewear"], ["green_turban", "headgear"]]5

설명

// 해시 테이블
 const clothesType = {'headgear' : 'yellow_hat',
					  'eyewear' : 'blue_sunglasses', ...
					}
  • 위의 반복문을 통해서 하나의 객체에 {종류: 옷이름}으로 해시 테이블을 만들어준다.
  • 2번의 반복문 같은 경우 각 키값 즉, 종류별로 옷의 갯수 별로 모두 곱하면 모든 경우의 수가 나오게 된다.
  • 위의 제한 사항에서 모든 옷을 안 입는 경우는 없으니 -1을 빼야한다.
    (제한 사항을 읽지 않아서 시간이 좀 걸렸다... 제한 사항에 중요성을 다시 한번 깨달았다...)

( 순열: 만일 집에서 학교까지 가는 길이 3가지이고, 도서관에 가는 길이 2가지이면, 집에서 학교를 거쳐 도서관에 가는 길은 3*2=6 이 된다.)

Map.object를 이용한 풀이

function solution(clothes) {
    const map = new Map()
    let sum = 1
	// 1
    for (let i of clothes){
        if(map.get(i[1]) === undefined) map.set(i[1] , [i[0]])
        else map.get(i[1]).push(i[0])
    }
    
    // 2
    for(let key of map.keys()){
    	sum *= map.get(key).length+1
    }
    
    return sum-1

}

객체로 풀었던 것과 거의 같은 느낌이지 해시에서 Set,Map으로 많이 풀기 때문에 Map으로도 풀어 보았고, 만일 입력값이 더욱 많아지는 경우에는 map을 통해서 시간 단축 및 데이터를 자유롭게 찾고, 넣을 수 있는 장점이 있어서 map을 이용해 풀어보았다.

설명

  • 1번째 반복문은 map.get을 통해서 옷의 종류가 없을 경우 map.set을 통해 Map(해시테이블)에 넣어준다.
  • 만일 있을 경우 map.get을 통해 해당되는 옷 종류의 배열을 가져와 담아준다.
    (map.set()을 통해 담는 시도를 하게 되면 배열이 계속해서 초기화가 된다.)
  • 2번 반복문은 map의 key의 값 들을 가져와 모든 경우의 수의 값을 출력한다.

이번 해시를 통해 Map,Set의 사용의 편리함을 많이 느꼈고, Map,Set을 조금 더 공부해서 다양하게 써먹으면 편리할 것 같다!

0개의 댓글