//////
Search
📃

22년 12월 1주차 회고록(회고자랑)

회의 날짜: 2022/12/06
회의 장소: discord 라운지
참석자: 김솔배, 구연지, 안지영

[회고 사진]

[문제]

[이번 스터디 공부한 내용]

 김솔배
Hash Table을 이용하여 푸는 방식으로 접근하였습니다.
1. 종류별로 몇개의 의상이 있는지를 구하고 (HashTable 사용) 2. 각 종류마다 아무것도 입지 않을 경우를 더해서(HashTable에 put할때 적용) 3. 전부 곱해서 (Iterator 사용) 4. 아무것도 입지 않는 조건을 빼는 로직으로 정답을 구했습니다.
해결코드
public class Solution { public static int solution(String[][] clothes) { Hashtable<String, Integer> hashtable = new Hashtable<>(); for (int i = 0; i < clothes.length; i++) { //각 카테고리의 경우의 수를 구한다. //아무것도 선택하지 않은 경우를 포함하기 때문에 defaultValue를 1로 함. hashtable.put(clothes[i][1], hashtable.getOrDefault(clothes[i][1],1) + 1); } // System.out.println(hashtable); Iterator<Integer> it = hashtable.values().iterator(); int answer = 1; while (it.hasNext()) { answer *= it.next().intValue(); //경우의 수가 정해져있는 각 카테고리를 곱하면 모든 경우의 수를 찾을 수있다. } return answer -1; //아무것도 입지 않은 경우 -1 뺴기 } public static void main(String[] args) { String[][] clothes = new String[][]{{"yellow_hat", "headgear"}, {"blue_sunglasses", "eyewear"}, {"green_turban", "headgear"}}; System.out.println(solution(clothes)); } }
Java
복사
 구연지
문제의 조건
(1) 각각 카테고리 별 하나의 아이템을 이용할 수 있다
(2) 의상을 착용하지 않는 경우는 없다.
만약 아래와 같은 의상들이 주어진다면
얼굴
동그란 안경, 검정 선글라스
상의
파란색 티셔츠
하의
청바지
겉옷
긴 코트
얼굴 장식은 3가지 경우: X, 동그란 안경, 검정 선글라스
상의는 2가지 경우: X, 파란 티셔츠
하의는 2가지 경우: X, 청바지
겉옷은 2가지 경우: X, 긴코트
→ 3*2*2*2가지 경우가 나오는데 의상을 착용하지 않는 경우는 없으므로 3*2*2*2-1가지
→ 따라서 각 카테고리 별로 아이템이 몇 개인지 확인한 후 (a+1)(b+1)(c+1)…(z+1) -1 을 해주면 된다.
작성한 코드
def solution(clothes): # 반드시 1개는 입어야 함 # 한 카테고리에서 하나씩만 # 2,1이면 3*2-1(다 안입는 경우) answer = 1 category_dictionary = {} # key가 카테고리, value가 아이템 개수 for i in range(len(clothes)): # key가 없으면 딕셔너리에 키워드를 추가하고 # 있으면 아이템 개수 올려주기 if (clothes[i][1] in category_dictionary.keys()): category_dictionary[clothes[i][1]] += 1 else: category_dictionary[clothes[i][1]] = 1 values = list(category_dictionary.values()) for i in range(len(values)): answer = answer * (values[i]+1) answer -= 1 return answer
Python
복사
 안지영
옷의 종류별로 최대 한벌 씩 선택할 수 있고, 어떤 옷이던 최소 한개는 입어야 한다.
옷의 종류별로 몇 벌씩 존재하는지를 파이썬의 딕셔너리를 사용하여 매핑한다. key:value. 이때 옷의 구체적 이름은 필요 없다.
 최종 경우의 수를 계산한다. (A개수 + 1) * (B개수 + 1) * … * ( ) - 1
def solution(clothes): combi = dict() for cloth in clothes: combi.setdefault(cloth[1],0) combi[cloth[1]] += 1 values = list(combi.values()) multiply = 1 for value in values: multiply *= (value+1) return multiply -1 clothes = [["yellow_hat", "headgear"], ["blue_sunglasses", "eyewear"], ["green_turban", "headgear"]] print(solution(clothes))
Python
복사
dict.setdefault(key, defaultvalue) : 해당 key가 딕셔너리에 존재하면 value 값을 반환하고, 존재하지 않는다면 key를 등록하고 defaultvalue로 초기화 시킨다.

 [어려웠던 부분]

 김솔배
모든 조합의 수를 구하는 로직을 떠올리는데 오래 걸렸습니다.
HTML
복사
 구연지
이번 문제는 비교적 수월하게 풀 수 있었던 것 같습니다.
Plain Text
복사
 안지영
딕셔너리라는 자료구조를 사용하는게 익숙하지 않아 막상 직접 구현할 때 구글링을 좀 해야했습니다.
Plain Text
복사

 [금주의 꿀팁 & 인사이트!]

 김솔배
종류별로 Cnt를 하는 것은 HashTable 또는 HashMap을 이용하는것이 간편하다.
HTML
복사
 구연지
문제를 풀기 전 어떤 조건이 필요한 지를 파악하는 단계가 중요하다!
Plain Text
복사
 안지영
딕셔너리 디폴트 값을 설정하는 함수가 있다. 그리고 좀 더 찾아보니 collections에 defaultdict이라는 것도 있는 것 같다!
Plain Text
복사

 [금주의 느낀 점]

 김솔배
하루에 2시간씩은 계속 알고리즘 공부를 하자
HTML
복사
 구연지
이런 문제들이 코딩테스트에서는 나오지는 않겠지...? 다음 주도 더 열심히 공부해야겠다 :)
Plain Text
복사
 안지영
파이썬 자료구조도 다시 공부해야겠다..
Plain Text
복사