최대 1 분 소요

숫자게임 (프로그래머스 Level 3)

https://school.programmers.co.kr/learn/courses/30/lessons/12987

처음에는 어떻게 풀지 곰곰히 고민을 하다
(ex : B의 각 요소를 어떻게 움직여서 풀까?)

문제 해결의 요점이 그것이 아닌 것 같아서
한번 문제를 천천히 다시 읽어보았다

  1. A의 배열은 움직이지 않으며, B는 ‘임의로’ 배치 방식을 바꾸어
    최대한 많은 수를 통과시키려 한다
    -> 따라서 굳이 A의 ‘순서’를 보장할 필요가 없다고 생각하였다
    두 배열을 오림차순 ‘정렬’을 하고,
    각 요소의 ‘작은’ 요소부터 비교를 시작
  2. b의 요소는 ‘재사용’이 불가하기에 제거하거나,
    index를 조정하는 방식을 사용해야 함
    (queue로 구현하였지만, 지금 보니 그냥 int index를 사용했어도 될 것 같았다)
  3. A의 인덱스 부분과 B의 요소가 작거나 같다면
    다시 queue의 요소를 체크하도록 continue
    그렇지 않다면 정답을 증가시키고, A의 인덱스를 증가

이러한 방식으로 풀었다

Code

#include <vector>
#include<algorithm>
#include<queue>

using namespace std;

int solution(vector<int> A, vector<int> B) {
	sort(A.begin(), A.end());
	sort(B.begin(), B.end());

	queue<int> bq;
	for (auto b : B)
	{
		bq.push(b);
	}

	int answer = 0;
	int aIndex = 0;

	while (bq.empty() == false)
	{
		int bt = bq.front();
		bq.pop();

		if (bt <= A[aIndex])
		{
			continue;
		}

		answer++;
		aIndex++;
	}

	return answer;
}

댓글남기기