[프로그래머스 / C++] 의상

YH·2024년 1월 6일
0

문제

의상 : 문제 링크


문제 분석

  • 코니는 매일 다른 옷을 조합하여 입는것을 좋아한다. 예를 들어 코니가 가진 옷이 아래와 같고, 오늘 코니가 동그란 안경, 긴 코트, 파란색 티셔츠를 입었다면 다음날은 청바지를 추가로 입거나 동그란 안경 대신 검정 선글라스를 착용하거나 해야한다.
종류이름
얼굴동그란 안경, 검정 선글라스
상의파란색 티셔츠
하의청바지
겉옷긴 코트
  • 코니는 각 종류별로 최대 1가지 의상만 착용할 수 있다. 예를 들어 위 예시의 경우 동그란 안경과 검정 선글라스를 동시에 착용할 수는 없다.

  • 착용한 의상의 일부가 겹치더라도, 다른 의상이 겹치지 않거나, 혹은 의상을 추가로 더 착용한 경우에는 서로 다른 방법으로 옷을 착용한 것으로 계산한다.

  • 코니는 하루에 최소 한 개의 의상은 입는다.

  • 코니가 가진 의상들이 담긴 2차원 배열 clothes가 주어질 때 서로 다른 옷의 조합의 수를 return 하도록 solution 함수를 작성

  • 제한 사항

  • clothes의 각 행은 [의상의 이름, 의상의 종류]로 이루어져 있다.
  • 코니가 가진 의상의 수는 1개 이상 30개 이하이다.
  • 같은 이름을 가진 의상은 존재하지 않는다.
  • clothes의 모든 원소는 문자열로 이루어져 있다.
  • 모든 문자열의 길이는 1 이상 20 이하인 자연수이고 알파벳 소문자 또는 '_' 로만 이루어져 있다.
  • 배열 clothe에 clothes의 문자열과 동일한것이 있는지 확인하기 위해find_if() 문을 사용하므로 algorithm 헤더를 include. (find_if()를 사용한 이유는 pair는 operator == 가 정의되어 있지 않으므로 find() 함수 사용이 불가)
  • 서로 다른 옷의 조합의 수를 저장할 정수형 변수 answer을 1로, 의상의 종류의 개수를 저장할 pair형 벡터 clothe를 초기화.
  • for loop를 사용하여 배열 clothes의 첫번째부터 마지막 원소까지 순회하고, auto형 변수 it에 find_if() 함수를 사용하여 배열 clothe내에 clothes의 현재 인덱스 원소의 의상의 종류와 동일한 것이 있는지 확인한 결과를 저장. if문을 사용하여 동일한 것이 없다면 [의상의 종류, 1] 형태의 pair를 clothe에 저장하고, 동일한 것이 있다면 해당 위치의 정수값(second)을 1씩 증가. loop 탈출 후, 또 다른 for loop를 사용하여 배열 clothe의 첫번째부터 마지막 원소까지 순회하고, 각 원소의 정수값에 1을더한것(의상을 착용하지 않는 경우를 고려)을 answer과 곱하여 저장. loop 탈출 후, 의상을 하나도 입지 않는 경우를 제외하기 위해 answer에서 1을 빼고 return

algorithm 헤더의 find_if() 함수 사용법
template <class InputIterator, class UnaryPredicate>
InputIterator find_if (InputIterator first, InputIterator last, UnaryPredicate pred);
=> 첫번째로 pred를 만족하는(true를 return 하는) 원소가 있다면 그것이 가리키는 iterator를 return. 만족하는 원소가 없다면 last를 return.


풀이

#include <string>
#include <vector>
#include <algorithm>

using namespace std;

int solution(vector<vector<string>> clothes) {
    int answer = 1;
    vector<pair<string, int>> clothe;
    
    for(int i = 0; i < clothes.size(); ++i) {
        auto it = find_if(clothe.begin(), clothe.end(), [&](const pair<string, int>& p) {
            return p.first == clothes[i][1];
        });
        if(it == clothe.end()) {
            clothe.push_back(make_pair(clothes[i][1], 1));
        }
        else it->second++;
    }
    for(int i = 0; i < clothe.size(); ++i) {
        answer *= (clothe[i].second + 1);
    }
    return answer - 1;
}
profile
Keep Recycling Your Dreams

0개의 댓글