반응형

문제 링크

 

5430번: AC

각 테스트 케이스에 대해서, 입력으로 주어진 정수 배열에 함수를 수행한 결과를 출력한다. 만약, 에러가 발생한 경우에는 error를 출력한다.

www.acmicpc.net

풀이 )

  배열에 있는 수를 앞 또는 뒤에서 뺄 수 있도록 하기 위해 deque에 넣었다.

  처음 방향 dir을 true로 설정하고, 함수 R가 올 때마다 dir을 바꿔준다.

  dir에 따라 함수 D가 올 때 true인 경우 앞에서 빼주고 (pop_front()), false인 경우 뒤에서 빼준다. (pop_back())

  이 때, 현재 deque가 비어있는데 D가 나오는 경우 error를 출력하면서 다음 케이스를 실행한다.

 

  함수를 수행한 결과 deque가 비어있는 경우 "[]"만 출력하고 다음 케이스를 실행하고,

  비어있지 않은 경우 dir에 따라 앞, 뒤에서부터 출력한다.

 

#include <iostream>
#include <string>
#include <deque>

using namespace std;

int main(void){
    int t;
    cin >> t;
    while(t--){
        string func, s;
        int n;
        cin >> func;
        cin >> n;
        cin >> s;

        deque<int> dq;
        int len = s.length();
        int tmp = 0;
        for(int i = 1; i < len; ++i){
            if(s[1] == ']')
                break;
            if(s[i] == ',' || s[i] == ']'){
                dq.push_back(tmp);
                tmp = 0;
            }
            else
                tmp = tmp*10+s[i]-'0';
        }

        bool dir = true;
        int func_len = func.length();
        bool flag = 0;
        for(int i = 0; i < func_len; ++i){
            if(func[i] == 'R')
                dir = !dir;
            else{
                n--;
                if(dq.empty()){
                    cout << "error" << endl;
                    flag = true;
                    break;
                }
                if(dir)
                    dq.pop_front();
                else
                    dq.pop_back();
            }
        }
        if(flag)
            continue;

        if(n == 0){
            cout << "[]" << endl;
            continue;
        }
        if(dir){
            for(int i = 0; i < n; ++i){
                if(i == 0)
                    cout << '[';
                cout << dq.front();
                dq.pop_front();
                if(i == n-1)
                    cout << ']' << endl;
                else
                    cout << ',';
            }
        }
        else{
            for(int i = 0; i < n; ++i){
                if(i == 0)
                    cout << '[';
                cout << dq.back();
                dq.pop_back();
                if(i == n-1)
                    cout << ']' << endl;
                else
                    cout << ',';
            }
        }
    }
}

 

주의 )

  각 경우에 대해서 조건을 간단하게 나타낼 수 있다.  ex ) 5를 지나가는 경우 cur+prev == 10

  이 때 4를 지나가는 경우 cur+prev == 8로 나타내는 경우 (2, 6)과 같은 예외가 있기 때문에 주의해야한다.

반응형

'문제풀이 > 백준' 카테고리의 다른 글

[C++] 백준 - 1874 : 스택 수열  (0) 2020.12.01
[C++] 백준 - 10773 : 제로  (0) 2020.12.01
[C++] 백준 - 17300 : 패턴  (0) 2020.11.29
[C++] 백준 - 1004 : 어린 왕자  (0) 2020.11.29
[C++] 백준 - 1002 : 터렛  (0) 2020.11.29
반응형

문제 링크

 

16282번: Black Chain

문제 n개의 블랙 고리가 일렬로 연결된 체인이 있다. 블랙 고리 하나는 무게가 정확히 1g 이다. 이 고리들을 이용하여 1g 부터 ng 까지 가능한 모든 무게를 생성하려고 한다. 이를 위해 고리를 일부 풀어야 하는데, 고리를 푸는데 힘이 들어 최소 개의 고리만 풀기를 원한다. 예를 들어 아래의 그림 A.1 처럼 7 개의 고리로 구성된 블랙 체인이 있다고 하자. 이 체인에서 3 번 고리 하나를 풀어 내면 그림 A.2 처럼 3 번 고리 1 개와 두 개의 체인

www.acmicpc.net

 

풀이 )

  규칙성을 찾아내는 문제다.

  풀어야 할 고리의 개수에 주목을 해보면

  1번 끊었을 때 가능한 무게는 7g까지이다. 2 1 4

  2번 끊었을 때는 1이 2개가 있으므로 3이 필요하고, 앞의 3개의 조합(1 1 3)으로 5까지 만들 수 있으므로 6이 필요하고

  3 1 6 1 의 조합으로 11까지 만들 수 있으므로 마지막으로 12까지 총 23(3 1 6 1 12)까지 표현이 가능하다.

  같은 방식으로 3번 끊었을 때는 총 4 1 8 1 16 1 32 의 조합으로 63까지 표현이 가능하다.

  최대로 나타낼 수 있는 무게를 좀더 보기 쉽게 나타내면

  •   1번 - 2 1 4 -> 7
  •   2번 - 3 1 6 1 12 -> 23
  •   3번 - 4 1 8 1 16 1 32 -> 63
  •   4번 - 5 1 10 1 20 1 40 1 80 -> 159
  •   n번 - (n+1) 1 (n+1)*2 1 (n+1)*22 1 ... 1 (n+1)*2n 의 꼴임을 알 수 있다.

  식을 정리하면 (n+1)(1+2+22+...+2n)+1*n = (n+1)(1+2+22+...+2n)+(n+1)-1 = (n+1)2n+1-1이다.

  bound를 (n+1)2n+1라고 할 때 n값을 늘려주다가 입력값을 초과하는 경우 멈춰주면 된다.

  다음 bound를 구할 때는 이전의 n으로 나눠준 후 다음번인 n+1을 곱하고 2를 한번 더 곱해서 구했다.

 

#include <cstdio>
using namespace std;

int main(void)
{
  long long n, bound = 8, ans = 1;
  scanf("%lld", &n);
  while(n >= bound){
    ans++;
    bound = bound / ans * (ans+1) * 2;
  }
  printf("%lld\n", ans);
}
반응형

+ Recent posts