떵호
seongho'Dev
떵호
전체 방문자
오늘
어제
  • 분류 전체보기 (116)
    • 회고 (2)
    • Algorithm (74)
      • 프로그래머스 (65)
      • 백준(BOJ) (2)
      • Note (7)
    • 기술독서 (25)
      • Clean Code (11)
      • 자바의 정석 (8)
      • 대규모 시스템 설계 기초 (6)
    • Computer Science (1)
      • Operating System (1)
    • Typescript (1)
    • JAVA (0)
    • Spring (6)
      • JPA (6)
    • AWS (2)
    • Git (2)
    • Etc (2)

블로그 메뉴

  • github

티스토리

태그

  • 완전탐색
  • 코딩테스트 준비
  • 프로그래머스
  • 카카오 코테
  • 클린코드
  • 구현
  • Clean Code
  • 알고리즘
  • 자바의 정석
  • JPA
hELLO · Designed By 정상우.
떵호
Algorithm/프로그래머스

[자바] 프로그래머스 - 위장 (Level 2)

[자바] 프로그래머스 - 위장 (Level 2)
Algorithm/프로그래머스

[자바] 프로그래머스 - 위장 (Level 2)

2022. 2. 8. 20:10
728x90

🔗 문제 링크

 

코딩테스트 연습 - 위장

 

programmers.co.kr

📂 분류

해시, 조합

💡 풀이

처음 풀이는 부분 집합과 경우의 수를 구하는 공식을 이용하여 접근해서 풀었다. 하지만 이렇게 풀었더니 1번 테스트케이스만 시간 초과가 떠서 만점을 받지 못했다.

시간을 어떻게 줄여야할지 생각이 나지않아서 질문하기를 참고했는데 모든 조합을 구할 필요 없이 안입는 경우를 더해 경우의 수를 구하면 됐다.

 

풀이 과정

  • 주어진 clothes메서드를 의상 종류를 key로 두고 value는 해당하는 key의 개수로 둬서 Map에 저장한다.
  • 각 해당하는 의상 종류의 개수를 +1 해주고 경우의 수를 구한다.
  • 모든 옷을 안입는 경우는 없으니 return할땐 -1을 해준다.

💻 코드

  • 만점 코드
import java.util.*;

class Solution {
    static Map<String, Integer> map = new HashMap<>();
    public int solution(String[][] clothes) {
        initialize(clothes);
        int answer = 1;

        for (Map.Entry<String, Integer> it : map.entrySet()) {
            answer *= it.getValue();
        }

        return answer - 1;
    }

    void initialize(String[][] clothes) {
        for (String[] str : clothes) {
            String key = str[1];
            if (map.containsKey(key)) {
                map.replace(key, map.get(key) + 1);
            } else {
                map.put(key, 2);
            }
        }
    }
}
  • 테스트케이스 1번 시간초과 코드 (부분 집합 이용)
import java.util.*;

class Solution {
    static Map<String, Integer> map = new HashMap<>();
    static ArrayList<String> typeOfClothes = new ArrayList<>();
    public int solution(String[][] clothes) {
        initialize(clothes);
        int answer = 0, len = typeOfClothes.size();

        for (int i = 0; i < (1 << len); i++) {
            ArrayList<Integer> powerSet = new ArrayList<>();
            for (int j = 0; j < len; j++) {
                if ((i & (1 << j)) != 0) {
                    powerSet.add(j);
                }
            }
            int count = 1;
            for (int e : powerSet) {
                String key = typeOfClothes.get(e);
                count *= map.get(key);
            }
            answer += count;
        }

        return answer - 1;
    }

    void initialize(String[][] clothes) {
        for (String[] str : clothes) {
            String key = str[1];
            if (map.containsKey(key)) {
                map.replace(key, map.get(key) + 1);
            } else {
                map.put(key, 1);
            }
        }
        map.forEach((key, value) -> {
            typeOfClothes.add(key);
        });
    }
}
728x90
저작자표시 (새창열림)

'Algorithm > 프로그래머스' 카테고리의 다른 글

[c++] 프로그래머스 - 빛의 경로 사이클 (Level 2)  (0) 2022.02.10
[c++] 프로그래머스 - 신고 결과 받기 (2022 KAKAO BLIND RECRUITMENT)  (0) 2022.02.09
[C++] 프로그래머스 - 더 맵게 (Level 2)  (0) 2022.02.09
[자바] 프로그래머스 - H-Index (Level 2)  (0) 2022.02.09
[자바] 프로그래머스 - 다리를 지나는 트럭  (0) 2022.02.07
  • 🔗 문제 링크
  • 📂 분류
  • 💡 풀이
  • 💻 코드
'Algorithm/프로그래머스' 카테고리의 다른 글
  • [c++] 프로그래머스 - 신고 결과 받기 (2022 KAKAO BLIND RECRUITMENT)
  • [C++] 프로그래머스 - 더 맵게 (Level 2)
  • [자바] 프로그래머스 - H-Index (Level 2)
  • [자바] 프로그래머스 - 다리를 지나는 트럭
떵호
떵호

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.