[프로그래머스 / C++] 위장

Inryu·2021년 8월 25일
0

Problem Solving

목록 보기
40/51
post-thumbnail

https://programmers.co.kr/learn/courses/30/lessons/42578


문제 풀이

의상 종류마다 개수를 이용해 조합을 구해야한다.

a,b,c의 종류의 의상이 차례로 3,2,1개 있을 때

각 의상을 입는 방법의 수는 (3+1), (2+1), (1+1) 이다. 1을 더해주는 이유는 안입을 수도 있기 때문!

따라서 각 방법을 곱해주면 조합의 개수가 나온다.
여기서 최소 하나의 의상은 입어야 하므로 아무것도 입지 않는 경우 1개를 빼주면 된다.

현재 배열은 [[이름, 종류], [이름,종류], [이름,종류]] 이렇게 되어있으므로 배열을 돌며 각 종류를 key로 하는 맵value값을 하나씩 늘려 카운트해준다.

이후 맵을 순회하면서 각 (value+1)을 차례로 곱해주고 나중에 하나 빼주면 끝!


코드

#include <string>
#include <vector>
#include <map>
#include <iostream>
using namespace std;

int solution(vector<vector<string>> clothes) {
    int answer = 1;
    
    map<string,int> m; //의상 종류, 개수
    

    //의상 종류마다 개수 저장.
    for(int i=0;i<clothes.size();i++){
        if(m.count(clothes[i][1])==0) m[clothes[i][1]]=1; //key값이 없을 경우
        else m[clothes[i][1]]+=1; 
    }
    
    // (의상a 개수 +1)*(의상b 개수 +1)*... -1 (모두 입지 않은 경우)
    for(auto it=m.begin();it!=m.end();it++){
        answer*=it->second+1;
    }
    
    return answer-1;
}

✨새롭게 알게 된 것

1)

 //의상 종류마다 개수 저장
 for(int i=0;i<clothes.size();i++){
        if(m.count(clothes[i][1])==0) m[clothes[i][1]]=1; //key값이 없을 경우
        else m[clothes[i][1]]+=1; 
 }

이렇게key 값이 없는 경우는 따로 생각해줬는데, 그냥 바로 m[clothes[i][1]]+=1해도 되는 것 같다.

그리고 auto를 이용해 더 간단하게 표현하면

for(auto item : clothes) //clothes의 각 행!
   m[item[1]]++; //item[1] 은 해당 행의 1열을 의미함, 즉 옷 종류

이런 코드도 가능함!

2) 2차원 벡터

2차원 벡터는 안 써봐서 헷갈렸음

3) map

참고

  1. 삽입, 삭제
map[key]=value;

map.insert(make_pair(key,value));

map.erase(key); : 주어진 key와 그 key의 value쌍을 삭제한다.
  1. 조회
map[key]; → value값 출력
  1. 존재 여부 확인
map.count(key);

주어진 key의 요소 개수를 반환한다. 그런데 key는 고유값이므로 count함수는 0,1만 반환 가능하다.

  1. 값 변경
map[key]+=a;

map[key]=value;

map[key]는 value이므로, 일반적으로 변수를 변경할 때처럼 다루면 된다.

  1. 순회하면서 접근하기
for(iter = m.begin(); iter != m.end() ; iter++){
        cout << "[" << **iter->first** << ", " << **iter->second** << "]" << " ";
    }    

key: iter->fisrt
value: iter->second

profile
👩🏻‍💻

0개의 댓글