백준: Class 3 ⑨ - 16928, 17219, 17626, 18870

2 분 소요


</br> 클래스 3 계속 계속
</br>

16928: 뱀과 사다리 게임

https://www.acmicpc.net/problem/16928

    for(int i = 0; i < n + m; i++){
        int x, y;
        cin >> x >> y;
        graph[x] = y;
    }
                        // +, -
    priority_queue< pair<int, int>, vector<pair<int, int>>, greater<> > pq;
    pq.push(make_pair(0, -1));
    visited[1] = 1;
    int ans;
    while( pq.size() ){
        int d = pq.top().first;
        int x = -pq.top().second;
        pq.pop();
        if( x == 100 ){
            ans = d;
            break;
        }
        for(int i = 1; i <= 6; i++){
            if( x+i > 100 ) continue;
            if( graph[x+i] )
                if( visited[graph[x+i]] == 0 ){
                    pq.push(make_pair(d+1, -graph[x+i]));
                    visited[graph[x+i]] = 1;
                }
            else if( visited[x+i] == 0 ){
                pq.push(make_pair(d+1, -(x+i)));
                visited[x+i] = 1;
            }
        }
    }
    cout << ans << endl;

딱 보니까 뱀 타는 게 더 유리할 수도 있는 테스트 케이스를 만들어 놨을 것 같다
아무튼 이번에도 우선순위 큐를 사용했다. 현재 주사위를 던진 수가 가장 작고, 현재 위치는 큰 순이다.
나머지는 그냥 그대로 사다리나 뱀 타고 가게 구현하기
</br>

17219: 비밀번호 찾기

https://www.acmicpc.net/problem/17219

    map<string, string> mp;
    while( n-- ){
        string s, pw;
        cin >> s >> pw;
        mp[s] = pw;
    }
    while( m-- ){
        string s;
        cin >> s;
        cout << mp[s] << '\n';
    }

굉장히 쉽네
</br>

17626: Four Squares

https://www.acmicpc.net/problem/17626

    for(int i = 1; i <= 50000; i++){
        dp[i] = 4;
    }
    for(int i = 1; i*i < 50000; i++){
        dp[i*i] = 1;
        if( i*i == n ){
            cout << 1 << endl;
            return 0;
        }
    }
    for(int i = 2; i <= n; i++){
        for(int j = 1; j*j < i; j++){
            dp[i] = min(dp[i], dp[i-j*j] + 1);
        }
    }
    cout << dp[n] << endl;

나는… dp가 좋아
4개 합이 된다는 건 증명 되었으니 전부 일단 4로 초기화 하고, 제곱수들은 1로 초기화 한다. 혹시 제곱수 중 n을 발견하면 바로 종료한다.
dp[i] = min(dp[i], dp[i-제곱수들] + 1)이다.

ex) 26
dp[26] = min(dp[26-1] + 1, dp[26-4] + 1, ..., dp[26-25]+1);


</br>

18870: 좌표 압축

https://www.acmicpc.net/problem/18870

    for(int i = 0; i < n; i++){
        int a;
        cin >> a;
        v.push_back(make_pair(a, i));
    }
    sort(v.begin(), v.end());
    int ind = 1, prev = v[0].first;
    v[0].first = v[0].second;
    v[0].second = 0;
    for(int i = 1; i < n; i++){
        if( v[i].first != prev ){
            prev = v[i].first;
            v[i].first = v[i].second;
            v[i].second = ind++;
        }
        else{
            v[i].first = v[i].second;
            v[i].second = ind-1;
        }
    }
    sort(v.begin(), v.end());
    for(int i = 0; i < n; i++){
        cout << v[i].second << ' ';
    }
    cout << '\n';

좌표 압축이란 건 처음 보네 신기하다
처음 입력 받을 때 (값, 인덱스)로 저장하고, 정렬한다.
따라서 값이 작은 순으로 정렬되어 있다.
다시 저장할 땐 (인덱스, 압축된 좌표)로 저장한다.
그리고 정렬하면 원래 입력 받은 순서대로 압축된 좌표를 출력할 수 있다.
페어 순서 바꾼 거는 cmp함수 만들기 귀찮아서ㅋㅋ
</br>


클래스 3을 다 풀었다!! 3++이 되었다
270문제 풀었고 정답률은 57.203%
포스트는 아마 23일 쯤에 올라갈 예정이지만 지금은 16일 밤 방학 끝까지 2주 남았구나
방학 안에 랭킹 50등 안에도 들고 싶고 플레 5도 찍어보고 싶은데 가능할까
</br>

댓글남기기