https://www.acmicpc.net/problem/9375
문제
풀이
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int testCase = Integer.parseInt(br.readLine());
for(int i = 0; i < testCase; i++){
int clothes = Integer.parseInt(br.readLine());
System.out.println(answer(clothes, br));
}
}
public static int answer(int x, BufferedReader br) throws IOException {
HashMap<String, Integer> cloth = new HashMap<>();
for(int i = 0; i < x; i++){
String temp = br.readLine();
String[] key = temp.split(" ");
if(cloth.containsKey(key[1])){
cloth.put(key[1], cloth.get(key[1])+1);
}else{
cloth.put(key[1],1);
}
}
int answer = 1;
for(int k : cloth.values()){
answer *= k+1;
}
return answer -1;
}
}
괜히 메서드 하나 따로 만들어볼라다가 고생 좀 했다. br을 한번만 열어서 매개로 전달해야한다는 것을 몰랐다.
풀이 자체는 간단하다.
경우의 수의 기본적인 개념을 생각해보면 된다.
여러가지 조합이 가능할 때 선택권의 개념이라고 보면 된다.
3명의 사람이 양팔로 만들 수 있는 조합을 생각해보자.
(왼손,왼손,왼손) 같은 경우가 있을 것이다. 이 때 우리는 선택권의 개념이라는 것을 인지하면 된다.
선택권이란? 첫번째 사람이 낼 수 있는 선택권은 3가지이다. 왜냐하면 왼손, 오른손, 안 냄 이 될 수 있기 때문이다. 또한 이 때는 순서를 고려하지 않고 생각하게 된다. (조합이기때문이다.)
여기서도 마찬가지로 종류별로 옷의 이름은 중복되지않기 때문에 그에 관심 없이 종류별 개수만 받은 다음에 +1을 해서 곱해주면 된다.(안 입을 가능성) 최종적으론 그것에 -1을 해준다.(모두 안 입을 수도 있기 때문이다.)
'문제 풀이 > 백준' 카테고리의 다른 글
[백준]1244번. 스위치 켜고 끄기 (JAVA) (0) | 2024.04.08 |
---|---|
[백준]1406번. 에디터(JAVA) (0) | 2024.04.05 |
[백준]4949번. 균형잡힌 세상(JAVA) (0) | 2024.04.04 |
[백준]2164번. 카드2 (JAVA) (0) | 2024.04.04 |
[백준]1620번. 나는야 포켓몬 마스터 이다솜(JAVA) (0) | 2024.04.04 |