1. 문제 및 예제
DP 열심히 풀던 와중에 이런 문제가 나오다니.. 행복했다. 회사에서는 JS를 쓰기 때문에 다시 C++을 사용해보니 메소드도 기억 안나서 그냥 내가 몇개 만들었다. 그래도 첫 제출에 맞춰서 나름 뿌듯했다. 1분 뒤에 레벨1 원트에 맞았다고 뿌듯해하는 내 자신을 보면서 자괴감도 조금 들었다...
https://school.programmers.co.kr/learn/courses/30/lessons/258712
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
2. 본론
선물을 주고받은 기록을 따로 배열에 저장하면 해결되는 간단한 DP문제이다. 선물을 주고 받는 부분만 계산하면 답은 쉽게 구해지기 때문에 시간복잡도는 O(N)이 된다.
브루트포스로도 풀 수 있을까? 싶었다. 사실 입력 최대값이 크지는 않았기 때문에 가능할 수 있겠지만 많이 복잡할 것 같았다. 결국에는 결과를 저장해야했기 때문에 DP를 선택하였다.
문제를 나누는 과정은 다음과 같다.
1. 선물을 주고받은 횟수를 저장한다.
2. 전 단계를 바탕으로 답을 구한다.
배열은 이차원 배열로 다음과 같이 활용하였다.
준 사람: i
받은 사람: j
gift_board[i][j]++
위의 방식대로 처리하면 i가 j에게 선물을 몇번 줬는지 알 수 있다. 다음은 전체 코드이다.
#include <string>
#include <vector>
#include <utility>
#include <algorithm>
using namespace std;
int get_index(vector<string> arr, string name){
for(int i = 0; i < arr.size(); i++){
if(arr[i] == name)
return i;
}
}
pair<string, string> get_from_to(string str){
string to = "";
string from = "";
bool flag = false;
for(auto it : str){
if(it == ' '){
flag = true;
}else {
if(flag){
to += it;
}else{
from += it;
}
}
}
return make_pair(from, to);
}
int solution(vector<string> friends, vector<string> gifts) {
int answer = 0;
//선물 지수
int gift_rate[55] = {0};
int gift_board[55][55] = {0};
for(auto it : gifts){
pair<string, string> tmp = get_from_to(it);
int from_index = get_index(friends, tmp.first);
int to_index = get_index(friends, tmp.second);
gift_board[from_index][to_index]++;
gift_rate[from_index]++;
gift_rate[to_index]--;
}
for(int i = 0; i < friends.size(); i++){
int tmp = 0;
for(int j = 0; j < friends.size(); j++){
if(i == j)
continue;
if(gift_board[i][j] > gift_board[j][i]){
tmp++;
}else if(gift_board[i][j] == gift_board[j][i]){
if(gift_rate[i] > gift_rate[j]){
tmp++;
}
}
}
answer = max(answer, tmp);
}
return answer;
}
3. 결어
다음에는 레벨3 문제도 풀어 올려볼 계획이다.
'programming > 알고리즘 풀이' 카테고리의 다른 글
[백준 알고리즘] 2933번 - 미네랄 (구현, BFS) (4) | 2024.10.27 |
---|---|
[programmers] 340211번 - 충돌위험 찾기 (구현, [PCCP 기출문제] 3번) (5) | 2024.09.28 |
[백준 알고리즘] 2579번 - 계단오르기 (Dynamic programming) (1) | 2024.06.30 |
[programmers] 258711번 - 도넛과 막대 그래프(BFS, 2024 KAKAO WINTER INTERNSHIP) (0) | 2024.05.18 |
[programmers] 1835번 - 단체사진 찍기(Brute force, 2017 카카오코드 본선) (1) | 2023.11.16 |