[백준 / 9375 / C++] 패션왕 신해빈

Park·2023년 9월 23일
0

코딩테스트 - Week1

목록 보기
9/15

1. 문제 접근

  • 해당 문제는 경우의 수를 수학적 공식을 활용해서 풀어야 하는 문제
  • 자료구조 map을 활용하여 들어오는 의상의 종류(string)를 Key로 하고, 의상의 이름은 따로 저장하지 않고 갯수만 count해야 함(문자열 count니 map쓰기)

2. 시행착오

    1. 의상의 종류, 의상의 이름을 stringint로 받는 것까진 생각하였으나, 각 의상의 종류별 어떻게 조합을 만들어 내야 할지 생각하지 못함
    1. map의 Key에서 나오는 value들의 조합을 구현해야 한다고 생각하여 시간을 허비하고 못 품

3. 코드 및 풀이

항상 기억해야 할 것 : 코테에서 풀이 또는 코드가 지나치게 길어진다?? 너가 잘못한 거임 => 분명 더 효율적인 방법 존재

  • 문제 : 안경 n개, 코트 m개를 가지고, 아무것도 걸치지 않은 경우를 제외하고 구할 수 있는 모든 경우의 수??
  • 공식 : (m+1) x (n+1) - 1
    • 추후 그림 가져옴
    • 1을 빼는 이유는 아무것도 걸치지 않는 경우 제외

3.1 풀이

TIP : 경우의 수를 받는 변수 : long long type 쓰기 습관화

  • 먼저 테스트 케이스 t를 받는 다음, t번 반복한다. (단순 횟수 반복을 사용하기 때문에while문 사용해서 for문보다 깔끔하게 코드 짜기 가능)
  • map<string, int> 을 통해 의상의 종류와, 해당 의상의 수를 담을 수 있는 자료구조 생성(문제에서 같은 이름을 가진 의상은 존재하지 않는다고 했으므로, 입력으로 들어오는 모든 경우는 다 unique하다고 가정해도 좋음)
  • 그리고 경우의 수 공식을 사용해서 계산
    • map 이터레이터의 first는 key, second는 value 기억하기
#include<bits/stdc++.h>
using namespace std;

int t, n;

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL); cout.tie(NULL);
    
    // 1. Input t
    cin >> t;
    
    // 2. Input n for each t
    while(t--){
        cin >> n;
        // 2-1 경우의 수는 무조건 long long
        long long ret = 1;
        map<string, int> mp;
        string name, type;
        for(int i = 0; i < n; i++){
            cin >> name >> type;
            mp[type]++;
        }
        
        // 2.2 경우의 수 계산
        for(auto it: mp){
            ret *= (long long) it.second + 1;
        }
        ret--;
        cout << ret << '\n';
    }
    return 0;
}

Reference

profile
안녕하세요!

0개의 댓글