관리 메뉴

JIE0025

[고득점kit][해시][lv.2] 위장 - 자바(Java) 본문

알고리즘/프로그래머스

[고득점kit][해시][lv.2] 위장 - 자바(Java)

Kangjieun11 2022. 11. 29. 23:41
728x90

 

프로그래머스 > 코딩테스트 연습 > 코딩테스트 고득점 Kit > 해시 > 위장 

 

문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/42578?language=java 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

 

 


 

문제

 

 

 

✅ 풀이 과정

0.  자료구조 / 알고리즘 선택

해시맵을 이용해 Key에 해당하는 개수를 세어주면 된다. 

 

1. 복잡도 고려

스파이가 가진 의상의 수가 1~30개이고, 문자열의 길이도 20이하여서 고려할정도의 문제가 아니다.

 

2. 수도코드/ 알고리즘 생각

1) 들어온 데이터를 옷의 종류에 따라 해시맵으로 만들어준다.

2) clothesHash.EntrySet으로 가져와서, 각 value (해당 옷타입의 실제 개수)로 연산한다.\

 

result =1 로 초기화하고, (해당 type의 개수+1)을 곱해준다 (안입는경우도 함께 고려해야함)

마지막에 아무것도 안입은 경우의수를 빼주면 정답!

 

 

✅ 내가 쓴 정답코드

import java.util.*;
class Solution {
    public int solution(String[][] clothes) {
        HashMap<String, Integer> clothesHash = new HashMap<>();

        String type;
        //01) 들어온 데이터를 옷의 종류에 따라 해시맵으로 만들어준다.
        for (int i = 0; i<clothes.length; i++) {
            type = clothes[i][1]; //종류

            if (clothesHash.containsKey(type)){
                clothesHash.put(type,clothesHash.get(type)+1);
            }
            else {
                clothesHash.put(type,1);
            }
        }

        //02) clothesHash.size 는 옷타입 수
        //    clothesHash.EntrySet으로 가져와서, 각 value (해당 옷타입의 실제 개수)로 연산한다.
        int result = 1;

        for( Map.Entry<String, Integer> entry : clothesHash.entrySet()) {
            result *= entry.getValue()+1;
        }

        return result-1;
    }
}

 

 

 

 

✅ 문제를 풀기 위해 새롭게 학습한 것

 

나는 해시테이블에 값을 추가할 때 파이썬에서 썼던 것과 비슷하게 작성했는데,

if (clothesHash.containsKey(type)){
	clothesHash.put(type,clothesHash.get(type)+1);
}
else {
	clothesHash.put(type,1);
}

 

 

 

다른 사람의 정답코드에서 getOrDefault메서드를 보게되었다. 

getOrDefault(Object key, V DefaultValue)

 

HashMap.getOrDefault('B', 0)

  • 'B'라는 Key에 해당하는 Value가 있으면 가져오고, 아닐 경우 0을 Default로 지정하여 사용하겠다는 의미의 함수

 

 

 

위의 4줄짜리 코드가 한줄로 바뀌는걸 보게 되었는데 안사용할수는 없지

map.put(type, map.getOrDefault(type, 0) + 1);

 

 map.getOrDefault(type, 0) + 1

 

 map.getOrDefault(type, 0)  : 값이 있으면 해당 값을 가져와서 + 1 되고,

값이 없으면 default로  0이지정되기 때문에 value로 1이 들어갈 수 있다!!

 

 

 

 

 




references