[백준] 1021번

Jeanine·2022년 3월 8일
0

baekjoon

목록 보기
11/120
post-thumbnail

💻 C++ 기반

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

  1. 나의 코드
#include <cstdio>
#include <deque>

using namespace std;

int main()
{
    int N, M;
    scanf("%d %d", &N, &M);

    deque<int> dq;
    for (int i = 1; i <= N; i++)
    {
        dq.push_back(i);
    }

    int idx[M];
    int cnt = 0;
    for (int i = 0; i < M; i++)
    {
        scanf("%d", &idx[i]);

        deque<int> dq_front(dq);
        int cnt_front = 0;
        while (idx[i] != dq_front.front())
        {
            dq_front.push_back(dq_front.front());
            dq_front.pop_front();
            cnt_front++;
        }

        deque<int> dq_back(dq);
        int cnt_back = 0;
        while (idx[i] != dq_back.front())
        {
            dq_back.push_front(dq_back.back());
            dq_back.pop_back();
            cnt_back++;
        }

        if (cnt_front < cnt_back)
        {
            dq = dq_front;
            cnt += cnt_front;
        }
        else
        {
            dq = dq_back;
            cnt += cnt_back;
        }

        dq.pop_front();
    }

    printf("%d", cnt);

    return 0;
}
  1. 정답 코드

❗️deque는 인덱스를 가지고 있음

// Authored by : haneulkimdev
// Co-authored by : BaaaaaaaaaaarkingDog
// http://boj.kr/9571e70535a34702812d2a03510ac182
#include <bits/stdc++.h>
using namespace std;

int main(void) {
  ios::sync_with_stdio(0);
  cin.tie(0);
  int n, m;
  cin >> n >> m;
  deque<int> DQ;
  for (int i = 1; i <= n; i++) DQ.push_back(i);
  int ans = 0;
  while (m--) {
    int t;
    cin >> t;
    int idx = find(DQ.begin(), DQ.end(), t) - DQ.begin(); // idx : t가 있는 위치
    while (DQ.front() != t) {
      if (idx < DQ.size() - idx) { 
        DQ.push_back(DQ.front());
        DQ.pop_front();
      }
      else {
        DQ.push_front(DQ.back());
        DQ.pop_back();
      }
      ans++;
    }
    DQ.pop_front();
  }
  cout << ans;
}

/*
20번째 줄에서, 지금은 idx가 항상 DQ.size()보다 작아서 문제가 없지만
DQ.size()는 unsigned int(or unsigned long long)이기
때문에 만약 idx가 DQ.size()보다 컸다면 overflow가 발생해
의도한대로 동작하지 않을 수 있음을 인지해야 함. 그래서 size()로
받아온 값에 대해서는 안전하게 (int)DQ.size() 로 항상 형변환을
하는 것도 괜찮음.
*/
profile
Grow up everyday

0개의 댓글