BOJ::12867 N차원 여행

시사점

이해(30)

설계(x)

시간 복잡도

공간 복잡도

구현(60)

STL

#include <bits/stdc++.h>
using namespace std;

int n, m;
map<int,int> oneSet;
set<map<int, int> > ans;
int main() {
    int n, m;
    cin >> n >> m;
    vector<int> a(m);
    for (int i=0; i<m; i++) {
        cin >> a[i];
        oneSet[a[i]] = 0;
    }
    string s;
    cin >> s;
    ans.insert(oneSet);
    for (int i=0; i<m; i++) {
        if (s[i] == '+') {
            oneSet[a[i]] += 1;
        } else {
            oneSet[a[i]] -= 1;
        }
        ans.insert(oneSet);
    }
    if (ans.size() == m+1) {
        cout << 1 << '\n';
    } else {
        cout << 0 << '\n';
    }
    return 0;
}

hashing

#include<bits/stdc++.h>
using namespace std;
#define MAX_M 52

int n, m;
int arr[MAX_M][MAX_M];

// m[i]에 대한 number와 부호를 의미합니다.
vector<int>  numbers;
vector<char> ops;

// number를 고유 숫자로 정렬한 데이터입니다.
vector<int>  vec;
int getIdx(int x){
    return (int)(lower_bound(vec.begin(), vec.end(), x) - vec.begin());
}
int solve(){
    for(int i = 1; i <= m; i++){
        int x = getIdx(numbers[i-1]);
        if(ops[i-1] == '+') arr[i][x]++;
        else arr[i][x]--;
        for(int j = 0; j < vec.size(); j++)
            arr[i+1][j] = arr[i][j];
    }
    for(int i = 0; i < m; i++){
        for(int j = i+1; j <= m; j++){
            bool isSame = true;
            for(int k = 0; k < vec.size(); k++){
                if(arr[i][k] != arr[j][k]){
                    isSame = false;
                    break;
                }
            }
            if(isSame) return 0;
        }
    }
    return 1;
}

int main(){
    freopen("input.txt", "r", stdin);
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cin >> n >> m;
    ops = vector<char>(m);
    numbers = vector<int>(m);
    
    for(int i = 0; i < m; i++)
        cin >> numbers[i];
    
    vec.resize(numbers.size());
    vec = numbers;
    
    sort(vec.begin(), vec.end());
    vec.erase(unique(vec.begin(), vec.end()), vec.end());
    
    char tmp[55]={0};
    cin >> tmp;
    for(int i = 0; i < m; i++)
        ops[i] = tmp[i];
    
    cout << solve() << endl;
    return 0;
}

디버깅(x)