알고리즘 문제풀이/프로그래머스

[프로그래머스/Level 3] 숫자 게임 (C++)

노력의천재 2021. 5. 7. 12:00

programmers.co.kr/learn/courses/30/lessons/12987

 

코딩테스트 연습 - 숫자 게임

xx 회사의 2xN명의 사원들은 N명씩 두 팀으로 나눠 숫자 게임을 하려고 합니다. 두 개의 팀을 각각 A팀과 B팀이라고 하겠습니다. 숫자 게임의 규칙은 다음과 같습니다. 먼저 모든 사원이 무작위로

programmers.co.kr

제가 제일 어려워하는 유형 중 하나인 그리디 문제였습니다. 사실 다 약함

 

일단 입력값의 크기가 최대 100,000 이라서 완전탐색으로는 TLE가 발생합니다. 그래서 DP, 이분탐색, 힙, 그리디 다양하게 생각해봤는데 도저히 문제를 해결하지 못해서 풀이를 참고했습니다. A팀의 출전 순서가 이미 공개되어 A 배열은 고정 시켜야 한다는 고정관념에 사로잡혀 문제를 해결하는데 어려움을 겪었던 것 같습니다.

 

풀이

1. A배열과 B배열을 오름차순으로 정렬

2. A인덱스와 B인덱스를 따로 선언과 초기화

3. A[aIdx]와 B[bIdx]를 비교 (B의 인덱스가 B의 크기가 되면 종료)

   3-1. A[aIdx] < B[bIdx] 면 두 인덱스 모두 증가

   3-2. A[aIdx] >= B[bIdx] 면 B의 인덱스만 증가, answer 값 증가 (해당 카드는 버리는 카드로 쓰겠다는 의미)

 

#include <string>
#include <vector>
#include <algorithm>
using namespace std;

int solution(vector<int> A, vector<int> B) {
    int answer = 0, aIdx = 0, bIdx = 0;
    sort(A.begin(), A.end());
    sort(B.begin(), B.end());
    
    while(1) {
        if(bIdx == B.size()) break;
        if(A[aIdx] < B[bIdx]) {
            aIdx++;
            bIdx++;
            answer++;
        } else {
            bIdx++;
        }
    }
    
    return answer;
}