hash - 의상

콜 파머가 될 남자·2024년 1월 9일
0
post-thumbnail

첫 번째 풀이

public int solution(String[][] clothes) {
	HashMap<String, Integer> hs = new HashMap<>();

	for (String[] clothe : clothes) {
		String type = clothe[1];
		hs.put(type, hs.getOrDefault(type, 0) + 1);
	}
	int sum = 0;
	int mul = 1;
	
    for (Integer value : hs.values()) {
		sum += value;
		mul *= value;
	}

	return sum + mul;
}

문제 읽자마자 바로 떠올려서 구현했다.
의상의 상세한 이름은 중요하지 않고 종류에 따른 개수가 몇개인지만 중요한것 같아서
hashmap을 써서 종류와 그의 개수를 count 하는 식으로 짰다.

이전 해시 문제에서 배웠던 getOrDefault를 잘 활용한 것 같아 매우 만족했다.

하지만 최종 결과를 산출할 때, 이렇게 하면 하나의 type만 있는 경우에도 multiply 계산이 적용되어
원하는 결과가 나오지 않았다

예를 들면, 

[["crow_mask", "face"], ["blue_sunglasses", "face"], ["smoky_makeup", "face"]]

위의 경우, face만 3개 이므로 더하기 계산만 이루어지고 곱에서는 0 으로 
3 + 0 = 3 이 나와야 하는데 기본 mul = 1로하여 3 + 3 = 6 이 나오게 된다.

두 번째 풀이

그럼 저 로직은 그대로 두고 + mul를 해주는 조건을 추가해보자.
type 이 한 개 일때가 특수 케이스 이므로, type이 1개인 것을 낚아채는 로직을 생각하면 된다.

public int solution(String[][] clothes) {
	HashMap<String, Integer> hs = new HashMap<>();

	for (String[] clothe : clothes) {
		String type = clothe[1];
		hs.put(type, hs.getOrDefault(type, 0) + 1);
	}
	int sum = 0;
	int mul;
    
    if (hs.size == 1) mul = 0;
    else mul = 1;
	
    for (Integer value : hs.values()) {
		sum += value;
		mul *= value;
	}

	return sum + mul;
}

hs의 size를 통해 type의 개수를 파악했다.
TC는 성공하지만 제출시 실패하는 문제가 꽤 많았따.. 뭐가 문제일까

이 같은 로직의 오류를 고등학교 확통공부할 때도 만난적이 있는거같다..

1) 내 생각

모자 3 상의 2 하의 1 일 경우
한 개씩 입는 경우 : 3 + 2 + 1 = 6 (위 로직의 sum에 해당)
두 개 이상씩 조합해서 입는 경우: 3 x 2 x 1 = 6 (위 로직의 mul에 해당)
이렇게 하면 6 + 6 = 12가 나오게 되는데,

두 개 이상씩 조합할 경우를 나눠서 생각해보면
두 개 입을 경우 = 3 x 2 + 3 x 1 + 2 x 1 = 11
세 개 입을 경우 = 3 x 2 x 1 = 6

총 17개의 경우이므로 위에 한 개만 입을때를 더하면 6 + 17 = 23이 나오게 된다.
즉, 전체의 경우에서 모두다 입지 않는 경우인 1 을 빼주는 것이 더 이상적인 풀이방법이자
내가 고등학교때 확률 문제를 풀었던 일반적인 경우이다.

2) 정석 풀이

모자 3 상의 2 하의 1 일 경우
각 개수에 하나씩 더해서 모두 곱하자 = 4 x 3 x 2 = 24
모두 다 입지 않는 경우인 1을 뺴자 24-1 = 23

public int solution(String[][] clothes) {
	HashMap<String, Integer> hs = new HashMap<>();

	for (String[] clothe : clothes) {
		String type = clothe[1];
		hs.put(type, hs.getOrDefault(type, 0) + 1);
	}
	
    int mul = 1;

	for (Integer value : hs.values()) {
		mul *= (value + 1);
	}

	return mul - 1;
}

고등학교때는 잘 풀던 문제를

왜 코딩에 대입하려니까 수학공식이 생각나지 않았을까...

profile
콜 파머가 개발자라면 사회적 인지도는 어느 정도일까

0개의 댓글