위장(for JAVA)

Sunyoung·2021년 4월 12일
0

1차 풀이

class Solution {
    public int solution(String[][] clothes) {
        int answer = clothes.length;
        for(int i=0;i<clothes.length;i++){
            String[] clothe = clothes[i];
            String type = clothe[1];
            for(int b=i;b<clothes.length;b++) {
                String[] diff = clothes[b];
                if(!type.equals(diff[1])) {
                     answer++;
                }
            }
        }
        return answer;
    }
}

테스트 케이스좀 다 써주면 참 도움이 될거같은데
일단 해시 문제니까 해시로 풀어야 되는건 알겠지만 왜 나는 같은 실수를 반복하는가
테스트 케이스를 찾아 헤메다 보니 찾을 수 있었다

{{"a", "aa"}, {"b", "aa"}, {"c", "aa"}, {"aa", "bb"}, {"bb", "bb"}, {"c_c", "bb"}, {"aaa", "cc"}, {"bbb", "cc"}, {"ccc", "cc"}}

(해당 내용은 프로그래머스에서 검색하였고 중괄호를 대괄호로 바꿔서 테스트 케이스에 적용하면 된다.)

일단 테스트케이스 2개는 1차 가답으로 로직으로 커버가 된다지만, 찾아본 케이스에서는 확실하게 안된다. 왜냐 이것은 2번째 for문 자체에 결함이 있다. 해당 케이스에서는 시작점 b의 시점이 잘못되었다. 하지만 이것을 0으로 해준다고 해도 큰 결함이 존재한다. 왜냐하면, 테스트 1케이스인

[["yellowhat", "headgear"], ["bluesunglasses", "eyewear"], ["green_turban", "headgear"]]

이 내용으로 봤을때 헤드 기어가 yellowhat이고 안경이 bluesunglass인 경우가 2번 들어가기 때문에 중복이 발생한다 (순서만 바꿔서 들어가기 때문에 동일한 것으로 봐야한다) 그렇기 때문에 이것은 해시데이터로 구분해야 더 정확하게 이 데이터를 판별 할 수 있다. map에서 key에 해당하는 옷의 종류를contain하고 있는지를 물어봐서 이 종류의 의상의 갯수가 몇개인지를 골라내어야 한다. 이 문제는 경우의 수의 문제에 해당한다.

안경의 종류가 4개 모자의 종류가 3개라면 입을 수 있는 가짓수는 4x3에 해당하는 것이라고 생각 할수 있다. 그러나 실제 착용을 안하는 경우가 생길 수 있으며 (그래서 각각의 종류에 한가지를 필수로 더한다) 모두 다 착용을 하지 않는 경우는 없다. 그렇기 때문에 마지막에 리턴 값에 -1을 해주게 된다.

처음에는 무작정 이런경우는 경우의 수가 12가 되는 줄 알았다. 하지만 각각 한개씩 사용하는 경우, 그리고 배열에 따라서는 두개씩 사용 더 나아가서 n개씩 사용하는 경우의 수가 생길수가 있는 것이다. 이걸가지고 좀 더 많이 생각을 해봐야 할것 같다.

import java.util.HashMap;
import java.util.Iterator;

class Solution {
	public int solution(String[][] clothes) {
    		int answer = 1;
    		HashMap<String, Integer> hm = new HashMap<>();
            
        	for (int i=0;i<clothes.length;i++) {
        		String type=clothes[i][1];
            		if (!hm.containsKey(type)) {
            			hm.put(type,1);	
            		} else {
            			hm.put(type,hm.get(type)+1);
            		}
        	}
        	Iterator<Integer> iter = hm.values().iterator();
        	while(iter.hasNext()){
        		answer *= iter.next().intValue()+1;
        	}
            return answer-1;
	}
}
profile
배워서 남주자

0개의 댓글