https://school.programmers.co.kr/learn/courses/30/lessons/258712
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
2024 KAKAO WINTER INTERNSHIP 가장 많이 받은 선물 문제입니다
주고받은 선물기록을 바탕으로 다음 달에 가장 많은 선물을 받을 선물의 수를 구하는 문제입니다.
다음달에 선물을 받을 사람을 구하는 기준은 다음과 같습니다
1. 두사람 사이에 선물을 더 많이 받은 사람이 선물을 적게 받은 사람에게 줍니다
2. 1.번 조건으로 해결할 수 없다면 둘 중 선물지수가 더 큰 사람이 더 낮은 사람에게 선물을 받습니다
3. 모든 조건이 동일하다면 선물을 주고 받지 않습니다
문제의 이해
A와 B가 서로 선물을 주고받습니다
A가 B에게 5개의 선물을 선물하고 B가 A에게 3개의 선물을 선물했다면
A는 B에게 다음달 선물 1개를 받습니다
추가적으로
A와 B가 서로 같은 수의 선물을 주고받았다면 여기서 선물 지수가 등장합니다
선물 지수는 모든 친구들에게(자신이 받은 선물개수 - 준 선물개수)입니다
선물 지수가 낮은 사람이 높은사람에게 선물을 지급합니다
이 두가지 경우가 동일하다면 선물을 주고받지 않습니다
간단하게 생각해서 선물을 덜 받은 사람에게 더 많이 받은 사람이 주는 방식이라고 생각하시면 됩니다
그에 따른 방식이 위의 조건입니다
문제의 접근
이문제는 데이터를 가공하고 처리하는 문제입니다
제공된 문자열 벡터를 잘라 내가 문제를 풀기 편한 방식으로 가공하고
가공된 데이터를 처리하여 정답을 도출하면 됩니다
해당 문제를 풀기 위해
1. 받은 선물 데이터를 정리합니다
2. 정리한 데이터를 기반으로 다음 달에 받을 선물의 개수를 계산합니다
3. 계산된 선물의 개수가 가장 많은 데이터를 정답으로 출력합니다
1. 받은 선물 데이터를 정리합니다
가공한 데이터를 저장하기 위한 giftdata벡터를 생성합니다
giftdata은 2차원 벡터로 열과 행에 받은 선물과 준선물로 나뉘고
그 뒤에 선물지수, 다음 달에 받을 선물 순서로 데이터를 저장하도록 하겠습니다
그 후 제공된 gifts string벡터의 데이터를 가공하기 위해
스페이스바를 중심으로 문자열을 잘라줍니다
잘라진 문자열의 첫 번째 값을 주는 사람 두 번째 값을 받는 사람으로 정하고 giftdata에 값을 넣어줍니다
값을 넣어주면서 선물지수도 정리해 주도록 하겠습니다
2. 정리한 데이터를 기반으로 다음 달에 받을 선물의 개수를 계산합니다
데이터가 정리되었다면 정리된 데이터를 토대로
1. 두 사람 사이에 선물을 더 많이 받은 사람이 선물을 적게 받은 사람에게 줍니다
2. 1. 번 조건으로 해결할 수 없다면 둘 중 선물지수가 더 큰 사람이 더 낮은 사람에게 선물을 받습니다
3. 모든 조건이 동일하다면 선물을 주고받지 않습니다
위 조건에 맞게 다른 달에 받을 선물의 개수를 계산합니다
3. 계산된 선물의 개수가 가장 많은 데이터를 정답으로 출력합니다
모든 계산이 끝났다면 각각의 벡터의 다음 달에 받을 선물의 개수에 해당하는 값을 비교해서 가장 많이 받는 사람을 출력합니다
#include <string>
#include <vector>
#include <sstream>
using namespace std;
int solution(vector<string> friends, vector<string> gifts) {
int answer = 0;
int friendssize = friends.size();
vector<vector<int>> giftdata(friendssize, vector<int>(friendssize + 2, 0));
for (string gift : gifts)
{
int prev = 0;
int cur;
cur = gift.find(' ');
vector<string> sv;
string s;
stringstream stream(gift);
while (stream >> s)
{
sv.push_back(s);
}
int from, to;
for (int i = 0; i < friendssize; i++)
{
if (sv[0] == friends[i])
{
from = i;
}
if (sv[1] == friends[i])
{
to = i;
}
}
giftdata[from][to]++;
giftdata[from][friendssize]++;
giftdata[to][friendssize]--;
}
int giftnumindex = friendssize + 1;
for (int i = 0; i < friendssize; i++)
{
for (int j = i + 1; j < friendssize; j++)
{
if (giftdata[i][j] != giftdata[j][i])
{
giftdata[i][j] > giftdata[j][i] ? giftdata[i][giftnumindex]++ : giftdata[j][giftnumindex]++;
}
else
{
if (giftdata[i][friendssize] != giftdata[j][friendssize])
{
giftdata[i][friendssize] > giftdata[j][friendssize] ? giftdata[i][giftnumindex]++ : giftdata[j][giftnumindex]++;
}
}
}
}
for (int i = 0; i < friendssize; i++)
{
if (giftdata[i][giftnumindex] > answer)
{
answer = giftdata[i][giftnumindex];
}
}
return answer;
}
후기
문제는 굉장히 직관적인 문제였습니다 문자열을 자르는 방법이 가장 어려운 문제 같습니다
저는 코드의 틀을 대충 짜두고 수정하는 식으로 풀다가 인덱스 정리에 실수가 생겨서 애를 먹었던 문제였던 거 같습니다
'Algorithm' 카테고리의 다른 글
[2022KAKAO BLIND RECRUITMENT]주차 요금 계산 (0) | 2024.11.11 |
---|---|
[2024KAKAO WINTER INTERNSHIP] 도넛과 막대 그래프 (2) | 2024.11.09 |
[2023 KAKAO BLIND RECRUITMENT] 미로 탈출 명령어 (2) | 2024.01.23 |
[2023 KAKAO BLIND RECRUITMENT] 표현 가능한 이진트리 (0) | 2024.01.20 |