Jun 개발노트

프로그래머스 - 위장

2020-01-13

위장

  1. 이해
    • 최대 경우의 수를 구하라
    • 해시(키-벨류) 구조
  2. 계획
    • 해시구조이므로 반복하면서 동일한 키 값을 가진은 벨류를 한 배열에 넣어준다.
    • 배열의 원소의 총 갯수를 구하여 경우의 수를 만들어 준다
    • 경우의 수
      • 단독으로 쓰일 경우의 수 : n
      • 조합할 경우 : n*m
  3. 실행
    describe('위장', () => {
        test('최종', () => {
            expect(solution([['yellow_hat', 'headgear'], ['blue_sunglasses', 'eyewear'], ['green_turban', 'headgear']])).toEqual(5);
        });
        test('카테고리 별 분류', () => {
            // expect(getClotheArr([['yellow_hat', 'headgear'], ['blue_sunglasses', 'eyewear'], ['green_turban', 'headgear']])).toEqual(5);
            expect(getClotheArr([['crow_mask', 'face'], ['blue_sunglasses', 'face'], ['smoky_makeup', 'face']])).toEqual(3);
        });
    });
    
    const getClotheArr = (clothe) => {
        const map = new Map;
        let max = 1;
        for(let o of clothe){
            map.set(o[1], (map.get(o[1]) || 1) + 1);
        }
        for(let o of map.values()){
            max *= o
        }
        return max-1
    
    }
    const solution = (clothes) => {
            var answer = 1;
            var obj={};
            for(var i=0;i<clothes.length;i++){
                obj[clothes[i][1]]=(obj[clothes[i][1]] || 1) + 1;
            }
            
            for(var key in obj){
                answer *= obj[key];
            }
            
            return answer-1;
        
    }
    
  4. 반성
    • Map을 이용하여 풀려고 노력하였지만, map.set(o[1], (map.get(o[1]) || 1) + 1)
      원래있는 키값의 벨류가 없다면 1을 넣어준다는 것에 구하는데 시간이 오래걸렸다
      • 값1 && 갑2 - 값1이 참이면 값 2가 나온다(값 1인 true이면 바로 계산안하고 값 도출 / false면 false) - 값1이 거짓이면 무조건 거짓
      • 값1 || 값2 - 값1이 참이면 값1이 참이다(더이상 계산안함 둘중하나 참인것 까지) - 값1이 거짓이면 값2 도출
    • 모든 경우의 수를 구하려는 것은 결국 힌트를 보고 알아냄... 역시 오늘도 배웟다