하루루카
루카의 개발 일지
하루루카
전체 방문자
오늘
어제
  • 분류 전체보기 (62)
    • React (10)
    • vue.js (5)
    • javascript (6)
    • 자격증 (5)
    • 기타 (8)
    • 코딩테스트 (11)
    • 프론트 CS (15)
    • NodeJs (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • react
  • AWS
  • CI/CD
  • vuex
  • GithubActions
  • socket
  • VUE
  • 코딩테스트
  • nextjs
  • 자바스크립트
  • node
  • vuetify
  • 프론트엔드
  • 쿠버네티스
  • 백준
  • nodejs
  • 기술면접
  • jest
  • codedeploy
  • 11655

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
하루루카

루카의 개발 일지

코딩테스트

백준 9375 패션왕 신해빈(C++)

2022. 11. 20. 12:43

* 해당 문제 풀이는 '큰돌'님의 문제풀이에서 제가 이해한 부분을 재작성한것입니다

백준 9375 패션왕 신해빈 입니다

 

문제 해석

패션왕 신해빈 문제해석 입니다

우선 이문제같은경우는 경우의수를 찾는 문제입니다 즉 각 의상 종류에따른 어떤 의상을 조합해서 입을수있는지에 대한 경우의수를 파악하는 문제입니다

 

첫번째 예제같은경우는 다음과 같이 입력이 들어와있습니다

[hat,headger],[sunglassess,eyewear],[turban,headgear]

이렇게 입력이 들어와있을때 같은 종류의 의상은 하나만 입을수있다는 조건과, 아예 안입는 조건은 없다고 했으니 아래와 같이 5가지의 경우의 수가 만들어지게됩니다

(hat),(turban),(sunglassess),(hat,sunglasses),(turban,sunglasses)

 

이 예제로 볼수있는부분은 일단 의상의 이름 없이도 경우의수를 파악할수있습니다 즉, 의상의 종류로만으로도 경우의수가 파악이 가능합니다

 

그러면 의상의 종류로만 경우의수를 파악해보겠습니다

headger(hat) headger(turban) eyewear(sunglassess)
O X X
O X O
X O X
X O O
X X O
X X X

표를 보게 되면 각 의상의 종류마다 안입는 경우가 존재합니다

headger 만 입는경우 eyewear를 안입고, eyewear만 입는경우 headger를 안입어야 됩니다, 즉 각 의상의 종류에 안입는 다는 수가 한가지 늘어나게됩니다

headger(2개) + 안입는경우(1개) = 3

eyewar(1개) + 안입는경우(1개) = 2

여기서 나온 값은 곱해주면 3x2 = 6 이 나오게 되는데 이때 아예 아무것도 안입는 경우는 없으니 나온 결과에 -1을 해주게 되면 5가 나오게됩니다

 

문제 풀이 순서

1. 테스트 케이스 의 수, 의상수를 선언 합니다

2. 의상이름, 의상 종류를 입력받을 변수를 선언 합니다

3. 테스트 케이스를 입력받고, 테스트 케이스만큼 순회를 돕니다

4. <string,int> 로 구성된 맵을 선언해주고 의상의 수를 입력받습니다

5. 의상이름,의상 종류를 입력받고, 의상 종류를 키로하여 위에서 선언한 맵을 통하여 의상의 종류를 카운팅 합니다

6. 그리고 맵을 순회하면서 안입은경우 까지 생각하여 카운팅한 값에 +1을 해주고 최공 결과에 곱해줍니다

7. 최종결과가 나오면 아무것도 안입는경우를 빼줍니다

 

작성 코드

#include<bits/stdc++.h>
using namespace std;

//테스트케이스 수, 의상수 선언
int t,n;

//의상이름,의상 종류 변서 순언
string a,b;
int main(){

    //테스트 케이스 입력
    cin >> t;

    //테스트 케이스만큼 순회
    while(t--){
        
        map<string,int> mp1;
        
        //의상의 수 입력
        cin >> n;
        for(int i = 0; i < n; i++){
            //의상이름,의상 종류 입력
            cin >> a >> b;
            //선언한 맵에 의상종류 키에 해당하는 정수값을 +1(종류 카운팅)
            mp1[b]++;
        }
        long long ret = 1;
        //입력받은 맵을 순회
        for(auto c : mp1){
            //안입은 경우 까지 생각해서 카운팅한 숫자에 +1을 한후 곱하기
            ret *= ((long long)c.second + 1);
        }

        //아예 안입은 경우는 없다했으니 최종 결과에 -1
        ret--;
        cout << ret << "\n";
    }
    return 0;
}

'코딩테스트' 카테고리의 다른 글

백준 1940 주몽 (C++)  (0) 2022.11.24
백준 1213 팰린드롬 만들기(C++)  (0) 2022.11.21
백준 1620 나는야 포멧몬 마스터 이다솜(C++)  (1) 2022.11.19
백준 2559 수열(C++)  (0) 2022.11.17
백준 1159 농구 경기(C++)  (0) 2022.11.14
    '코딩테스트' 카테고리의 다른 글
    • 백준 1940 주몽 (C++)
    • 백준 1213 팰린드롬 만들기(C++)
    • 백준 1620 나는야 포멧몬 마스터 이다솜(C++)
    • 백준 2559 수열(C++)
    하루루카
    하루루카

    티스토리툴바