www.acmicpc.net/problem/10799

 

10799번: 쇠막대기

여러 개의 쇠막대기를 레이저로 절단하려고 한다. 효율적인 작업을 위해서 쇠막대기를 아래에서 위로 겹쳐 놓고, 레이저를 위에서 수직으로 발사하여 쇠막대기들을 자른다. 쇠막대기와 레이저�

www.acmicpc.net


  • 레이저로 절단 입력이 들어올 경우엔 현재 주어진 쇠파이프들이 모두 잘리게 된다.
  • 입력이 쇠파이프 추가 '(' 라면 스택에 쇠파이프를 하나씩 넣어주고, 쇠파이프 제거 ')' 라면 스택에서 뺌으로써 쇠파이프의 갯수를 관리해준다.
  • 쇠파이프와 레이저에 대한 입력값이 똑같으므로, 다음 인덱스의 값을 검사해서 레이저는 따로 처리를 해준다.
  • 입력이 레이저일 경우에는 현재까지 입력되어있는 쇠파이프들을 전부 하나씩 잘라준다.

#include <iostream>
#include <stack>

using namespace std;

int main(void)
{
    string line;
    cin >> line;

    int answer = 0;
    stack<bool> s;
    for(int i = 0 ; i < line.size() - 1 ; i++)  // 뒤에서 하나 전까지 탐색한다
    {
        if(line[i] == '(')
        {
            if(line[i+1] == ')')    // 만약 레이저로 입력된 ( 라면
            {
                answer += s.size(); // 레이저로 현재 스택에 있는 파이프들을 다 잘라주고
                i++;                // 레이저로 닫히는 ) 스킵처리
            }
            else s.push(true);      // 만약 쇠파이프 추가라면 스택에 파이프 추가
        }
        else                // 쇠파이프가 닫힐 경우엔
        {
            answer++;       // 해당 쇠파이프 조각 하나 추가
            s.pop();        // 쇠파이프 제거
        }
    }
    answer += s.size();     // 맨 마지막에 레이저가 왔을 수도 있기 때문에 따로 처리

    cout << answer << endl;
}

  • 1등 소스코드 참고 : www.acmicpc.net/source/21594173
  • 스택 대신 정수값 k 를 두고 입력된 파이프 갯수만 조절한 것 외엔 크게 다르지 않다.
  • 생각해보니 맨 마지막 인덱스도 레이저였으면 위에서 처리되기 때문에 굳이 나눌 필요가 없었던 것 같다.

#include <stdio.h>
#include <string.h>

int main()
{
    int l = 0, k = 0;
    char r[100000] = {};
    scanf("%s", r);
    int sz = strlen(r);
    
    for(int i = 0 ; i < sz ; i++)
    {
        if(r[i] == '(')
        {
            if(r[i+1] == ')')
            {
                i++;
                l += k;
            }
            else k++;
        }
        else
        {
            l++;
            k--;
        }
    }
    printf("%d")
}

'PS > BOJ' 카테고리의 다른 글

[백준] 1762 : 평면그래프와 삼각형  (0) 2020.10.29
[백준] 2512 : 예산  (0) 2020.09.24
[백준] 1946 : 신입 사원  (0) 2020.09.17
[백준] 9934 : 완전 이진 트리  (0) 2020.09.16
[백준] 2468 : 안전 영역  (0) 2020.09.15

+ Recent posts