99클럽 코테 스터디 6일차 TIL + 오늘의 학습 키워드

찜와와·2024년 7월 27일
0

algorithm

목록 보기
10/25
post-thumbnail

오늘의 학습내용

공부한 내용

  • hashmap()
  • 구현

오늘의 회고

문제를 읽어보면 0번 인덱스 에는 아이템이름을 1번 인덱스에는 아이템 종류를 넣어 입력한다. 따라서 이 문제를 읽고 '아 1번 인덱스를 키로 가지고 0번 인덱스를 값으로 가지는 list 로 만들자' 라고 생각했다. 즉 입력받은 파라미터로 키가 이미 존재하면 value를 꺼내서 0번 인덱스를 추가하고 존재하지 않으면 map()자체를 새로 만들면 되겠다고 생각했다. 그리고 랜덤의 key에서 하나씩 value를 뽑는데 이때 key의 개수만큼을 최대로 뽑을 수 있겠구나 라고 생각해서 for문을 구현했다.

for(String key: map.keySet()){
     int size = map.get(key).size();
     answer *= (size+1);
}

문제

코니는 매일 다른 옷을 조합하여 입는것을 좋아합니다.

예를 들어 코니가 가진 옷이 아래와 같고, 오늘 코니가 동그란 안경, 긴 코트, 파란색 티셔츠를 입었다면 다음날은 청바지를 추가로 입거나 동그란 안경 대신 검정 선글라스를 착용하거나 해야합니다.

  • 코니는 각 종류별로 최대 1가지 의상만 착용할 수 있습니다. 예를 들어 위 예시의 경우 동그란 안경과 검정 선글라스를 동시에 착용할 수는 없습니다.
  • 착용한 의상의 일부가 겹치더라도, 다른 의상이 겹치지 않거나, 혹은 의상을 추가로 더 착용한 경우에는 서로 다른 방법으로 옷을 착용한 것으로 계산합니다.
  • 코니는 하루에 최소 한 개의 의상은 입습니다.
    코니가 가진 의상들이 담긴 2차원 배열 clothes가 주어질 때 서로 다른 옷의 조합의 수를 return 하도록 solution 함수를 작성해주세요.

내 풀이

package 프로그래머스;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.StringTokenizer;

public class 의상 {
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[][] clothes = new String[3][2]; //0번인덱스: 상품명  1번인덱스: 종류
        StringTokenizer str;
        for(int i=0; i<3; i++){
            String lines = br.readLine();
            for(int j=0; j<2; j++){
                str = new StringTokenizer(lines);
                clothes[i][j] = str.nextToken();
            }
        }

    }
    public static int solution(String[][] clothes){
        int answer = 1;
        HashMap<String, List<String>> map = new HashMap<>();

        for(int i=0; i<clothes.length; i++){
            String key = clothes[i][1];
            String value = clothes[i][0];
            if(!map.containsKey(clothes[i][1])){
               map.put(key, new ArrayList<>(List.of(value)));
            }else{
               List<String> values = map.get(key);
               values.add(value);
               map.replace(key, values);
            }
        }

        for(String key: map.keySet()){
            int size = map.get(key).size();
            answer *= (size+1);
        }
        answer -= 1;
        return answer;
    }
}

다른 사람 풀이

import java.util.*;
import static java.util.stream.Collectors.*;

class Solution {
    public int solution(String[][] clothes) {
        return Arrays.stream(clothes)
                .collect(groupingBy(p -> p[1], mapping(p -> p[0], counting())))
                .values()
                .stream()
                .collect(reducing(1L, (x, y) -> x * (y + 1))).intValue() - 1;
    }
}

다른 사람의 풀이를 보니 이런식으로 return 값에서 모두 해결해버리는 극한의 효율,,, 이 존재할 수 있구나 생각이 든다.

import java.util.HashMap;
import java.util.Iterator;
class Solution {
    public int solution(String[][] clothes) {
        int answer = 1;
        HashMap<String, Integer> map = new HashMap<>();
        for(int i=0; i<clothes.length; i++){
            String key = clothes[i][1];
            if(!map.containsKey(key)) {
                map.put(key, 1);
            } else {
                map.put(key, map.get(key) + 1);
            }
        }
        Iterator<Integer> it = map.values().iterator();
        while(it.hasNext()) {
            answer *= it.next().intValue()+1;
        }
        return answer-1;
    }
}

위 풀이는 그나마 내가 구현한 풀이랑 비슷해보인다. 다만 Iterator()를 사용하는 법도 익혀놔야겠다.

0개의 댓글