본문 바로가기

코드포스

[코드포스 Practice20] A. Inventory

이런 문제 많이 풀어봤는데 항상 일케 푸는게 맞나??? 생각하면서 하게 됨

 

푸는 건..

 

먼저 배열 쭉 돌면서 count++로 기록한다.

 

그 다음 count 배열 돌면서 0인걸 따로 저장해놓는다 (이건 없는 값이라 나중에 추가해야 하므로)

 

다시 배열 돌면서 이번에는 1이 아닌 수를 위의 저장해놓은 배열의 수로 대체한다. 

 

근데 틀렸다ㅋㅋㅋ

 

난 a가  <= n 이라 가정하고 풀었는데 그런 조건이 없었다!

 

그래서 count 배열의 크기를 10^5로 바꾸고 확인하는 부분 조건을 추가했다.

 

#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <functional>
#include <string>
#include <queue>
#include <stack>
#include <set>
 
using namespace std;
using i64 = long long;
using ii = pair<int, int>;
using ii64 = pair<i64, i64>;
 
int main() {
    int n;
    scanf("%d", &n);
    
    vector<int> v(n + 1, 0);
    vector<int> count(100005, 0);
    for (int i = 1; i <= n; i++)
    {
        scanf("%d", &v[i]);
        count[v[i]]++;
    }
    
    queue<int> q;
    for (int i = 1; i <= n; i++)
    {
        if(count[i] == 0)
            q.push(i);
    }
    
    for (int i = 1; i <= n; i++)
    {
        if (count[v[i]] != 1 || n < v[i])
        {
            cout << q.front() << " ";
            count[v[i]]--;
            q.pop();
        }
        else
            cout << v[i] << " ";
    }
    
    return 0;
}

 

이건 북님 코드

 

수를 남겨두고 바꿔야 하는 것만 바꿨구나