관리 메뉴

사과하는 제라스

[백준 BOJ 9375번] 패션왕 신해빈 본문

JAVA 백준 알고리즘 문제풀이/정수론 및 조합론

[백준 BOJ 9375번] 패션왕 신해빈

Xerath(제라스) 2021. 12. 23. 21:19

목차

    728x90
    반응형

    출처 : https://www.acmicpc.net/problem/9375

     

    9375번: 패션왕 신해빈

    첫 번째 테스트 케이스는 headgear에 해당하는 의상이 hat, turban이며 eyewear에 해당하는 의상이 sunglasses이므로   (hat), (turban), (sunglasses), (hat,sunglasses), (turban,sunglasses)로 총 5가지 이다.

    www.acmicpc.net

     

    1. 문제

    해빈이는 패션에 매우 민감해서 한번 입었던 옷들의 조합을 절대 다시 입지 않는다. 예를 들어 오늘 해빈이가 안경, 코트, 상의, 신발을 입었다면, 다음날은 바지를 추가로 입거나 안경대신 렌즈를 착용하거나 해야한다. 해빈이가 가진 의상들이 주어졌을때 과연 해빈이는 알몸이 아닌 상태로 며칠동안 밖에 돌아다닐 수 있을까?


    2. 입력

    첫째 줄에 테스트 케이스가 주어진다. 테스트 케이스는 최대 100이다.

    • 각 테스트 케이스의 첫째 줄에는 해빈이가 가진 의상의 수 n(0 ≤ n ≤ 30)이 주어진다.
    • 다음 n개에는 해빈이가 가진 의상의 이름과 의상의 종류가 공백으로 구분되어 주어진다. 같은 종류의 의상은 하나만 입을 수 있다.

    모든 문자열은 1이상 20이하의 알파벳 소문자로 이루어져있으며 같은 이름을 가진 의상은 존재하지 않는다.

     

    2
    3
    hat headgear
    sunglasses eyewear
    turban headgear
    3
    mask face
    sunglasses face
    makeup face

    3. 출력

    각 테스트 케이스에 대해 해빈이가 알몸이 아닌 상태로 의상을 입을 수 있는 경우를 출력하시오.

     

    5
    3

    4. 풀이

    입력에서 각 줄의 첫 단어는 중요하지 않다. 그냥 단순히 제품명이구나~~이 정도로만 생각하면 되고(사실 생각하는 것도 아깝다.) 두번째 단어는 종류의 이름이니 필요한 단어이다. 일단 어떤 종류의 제품이 2가지가 있다면 총 3가지 방법이 있다. 1.아예 안입는 경우, 2. 제품1을 입는 경우, 3. 제품2를 입는 경우. 이런 방식으로 순열을 계산하면 된다. 이때 중요한 것은 마지막에는 -1을 해주어 아무것도 안 걸치는 경우는 빼준다.


    5. 소스코드

    import java.io.*;
    
    public class Main {
        
    	public static void main(String[] args) throws IOException {
    		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            int N = Integer.parseInt(br.readLine());
    
    
            for(int i=0; i<N; i++){
                int num = Integer.parseInt(br.readLine());
                int cnt = 0;
                String [] category = new String [30]; 
                int [] count = new int [30];
    
                for(int j=0; j<num; j++){
                    String str = (br.readLine()).split(" ")[1];
                    if(cnt == 0){
                        category[0] = str;
                        count[0]++;
                        cnt++;
                        continue;
                    }
                    for(int k=0; k<cnt; k++){
                        if(category[k].equals(str)){
                            count[k]++;
                            break;
                        }
                        if(k == cnt-1){
                            category[cnt] = str;
                            count[cnt] += 1;
                            cnt++;
                            break;
                        }
                    }
                }
                
    
                int result = 1; 
                for(int j=0; j<cnt; j++){
                    if(count[j] != 0) result *= (count[j]+1);
                }
    
                System.out.println(result-1);
    
    
    
    
    
    
            }
        }
    }

    6. 배운 것

    split으로 나누고서 그 중 두번째 원소를 사용하고 싶을 땐 아래처럼 사용하면 된다. 즉, split으로 끊고 원하는 위치의 원소를 가져오는 것이 가능하다.

     

    String str = (br.readLine()).split(" ")[1];

     

    또한, 이전에도 유의해야 했지만 String의 경우엔 ==이 아닌 .equals() 함수로 비교를 해야한다. 

     

     

    728x90
    반응형