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 |