본문 바로가기

알고리즘/프로그래머스

프로그래머스(2024 카카오 겨울인턴) - 가장 많이 받은 선물 (C++)

반응형

카카오 문제마다 등장하는 카카오프렌즈들.

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr


이 문제는 문제가 길긴 한데 어렵진 않다. 왜냐면 아래처럼 문제에 자료를 어떻게 구성하라고 표로 알려주기 때문이다. 실제로 문제 다 읽고 이해하는게 제일 오래걸리고, 그다음은 i를 j로 잘못써놓고 못찾아서 시간 다잡아먹었다.

쏘 카인드

문제에서 그려준 이 표를 배열로 구성하면 된다. 추가로 우리는 선물지수라는 값도 필요한데 그 값도 이 표를 배열로 구성해서 얻을 수 있다. 따라서 이 표를 배열로 구현하기만 하면 된다. 아래는 전체 코드이다.

#include <string>
#include <vector>
#include <map>
#include <sstream>
#include <iostream>
#include <algorithm>

using namespace std;

int farray[50][50] = {0,};
int giftPoint[50] = {0,};

int solution(vector<string> friends, vector<string> gifts) {
    //친구이름 - index 매칭 위한 맵
    map<string,int> fmap;
    for(int i = 0; i < friends.size(); i++) {
        fmap[friends[i]] = i;
    }
    
    //선물 목록 순회하면서 배열 채우기
    for(string gift : gifts) {
        stringstream ss(gift);
        string from = "";
        string to = "";
        ss >> from >> to;
        farray[fmap[from]][fmap[to]]++;
    }
    
    //선물지수 계산하기
    for(int i = 0; i < friends.size(); i++) {
        for(int j = 0; j < friends.size(); j++) {
            giftPoint[i] += farray[i][j];
        }
    }
    for(int i = 0; i < friends.size(); i++) {
        for(int j = 0; j < friends.size(); j++) {
            giftPoint[i] -= farray[j][i];
        }
    }
    
    //각각 교환할 선물 계산
    int result[50] = {0,};
    for(int i = 0; i < friends.size(); i++) {
        for(int j = 0; j < friends.size(); j++) {
            if(i==j) continue;
            
            if(farray[i][j] > farray[j][i]) {
                result[i]++;
                continue;
            }
            if(farray[i][j] == farray[j][i]) {
                if(giftPoint[i] > giftPoint[j]) {
                    result[i]++;
                    
                }
            }
        }
    }
    
    //최대로 받은 프렌즈의 선물개수 리턴
    return *max_element(result, result + friends.size());
}
반응형