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

 

10799번: 쇠막대기

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

www.acmicpc.net

문제 분석

  • 레이저가 없을때, 쇠막대기의 개수: 쇠막대기의 시작점 or 끝점
  • 레이저 하나를 쏠때, 추가되는 쇠막대기의 개수 : 겹쳐져 있는 쇠막대기의 개수
  • 계획:
  • <stack>을 사용하여 '(', 쇠막대기의 시작점이 들어오면, count 해주고 동시에 stack에 push한다.
  • '('과')'이 함께 들어오면 먼저 들어와 있던 '('을 pop해주고 기존에 들어있던 '('을 count한다.
  • ')'이 들어오면 아무것도 하지 않는다.
stack<char>sticks;
string in;
int cnt;
int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);

    cin>>in;
    for(int i=0;i<in.length();i++){
        if(in[i]=='('){//쇠막대기 시작
            sticks.push(in[i]);
            cnt++;
        }else {
            if(in[i - 1] == '(' && in[i] == ')'){//레이저
                sticks.pop();//레이저 시작점 pop
                cnt--;//레이저 시작점까지 센거 -1
                cnt = cnt + (int) sticks.size();
                //기존에 들어있던 쇠막대기 개수만큼 +
            }
            else sticks.pop();
            // 쇠막대기 끝났으면 pop
        }
    }
    cout<<cnt<<'\n';
    return 0;
}

느낀 점

  • 보자마자 stack으로 풀면 되겠다는 생각이 들어 뿌듯하다.
  • 처음에 이 논리로 풀었다가 레이저 시작점 센거를 빼주지 않아서 틀린 답이 나왔다.
  • 그래서 쇠막대기가 끝날 때 세는 걸로 풀어도 봤다.
  • 쇠막대기 시작일때 세는 것도 안될게 없는 거 같아 고쳐서 맞았습니다를 띄웠다.
  • 쉬운 문젠데 문제를 읽기가 귀찮았다는 건 반성해야 겠다.

시간 복잡도

  • push,pop -> O(1)
  • 반복문 -> O(n)
    ☞ O(n)

'Algorithm > baekjoon' 카테고리의 다른 글

[BOJ 1158] 요세푸스 문제  (0) 2022.07.25
[BOJ 1406] 에디터  (0) 2022.07.25
[BOJ 2346] 풍선 터뜨리기  (0) 2022.07.20
[BOJ 7785] 회사에 있는 사람  (0) 2022.07.19
[BOJ 2075] N번째 큰수  (0) 2022.07.19

+ Recent posts