반응형
250x250
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 카이스트맛집
- 알고리즘
- 분리집합
- 우선순위큐
- 궁동
- glfw
- 프로그래머스
- 프래그먼트
- 자바
- computergraphics
- 후기
- 몰입캠프
- 카이스트
- 위상정렬
- MySQL
- BFS
- nodeJS
- 타입스크립트
- 몰입캠프후기
- 백준
- 컴퓨터그래픽스
- DP
- 안드로이드스튜디오
- 어은동맛집
- html
- 리사이클러뷰
- node.js
- 자바스크립트
- 앱개발
- 대전맛집
Archives
- Today
- Total
소근소근
[백준 BOJ 10799 silver3 - 쇠막대기] 자료구조 , 스택 C++ 본문
728x90
반응형
SMALL
백준 쇠막대기
https://www.acmicpc.net/problem/10799
() 는 레이저, ( 와 ) 는 막대기의 끝을 의미하므로, )가 (을 만나면 스택에서 pop하는 느낌으로 풀어야겠다고 생각은 했다
스택을 이용하면 쉽게 풀 수 있을 것 같은데 처음에 너무 어렵게 생각해서 코드를 이렇게 엄청 복잡하게 짰다..
[시간초과 나는 코드]
string s;
cin >> s;
st.push(s[0]);
int total = 0;
for (int i = 1; i < s.length(); i++) {
int top = st.top();
if (top=='(' && s[i] == ')') {
st.pop();
st.push('*');
}
if (s[i] == '(') st.push(s[i]);
if (top == '*' && s[i] == ')') {
int num_lazer = 0;
while (true) {
top = st.top();
if (top == '*') {
num_lazer++;
st.pop();
}
else if (top == '(') {
total += (num_lazer + 1);
st.pop();
for (int j = 0; j < num_lazer; j++) {
st.push('*');
}
break;
}
}
}
}
cout << total;
처음에 생각했던 아이디어는
() : 레이저이면 스택에서 pop하고, *를 push하여 레이저를 저장하고, 막대기 끝 ) 을 만날때마다 ( 까지 찾으면서 레이저 개수를 세는 것이었다. 그래서 매번 *를 push하고 개수를 세면서 pop하고, 다시 push해야 해서 시간초과가 났다.
주어진 조건을 보면 문자열 최대 길이가 100,000 이다. 최악의 경우 N^2이면 너무 오래 걸리게 된다.
[정답 코드]
- 레이저는 pop해주고, 이때 스택 사이즈만큼 더해준다.
- 막대의 끝 일때는 더하기 1을 해준다.
string s;
cin >> s;
st.push(s[0]);
int total = 0;
for (int i = 1; i < s.length(); i++) {
if (s[i] == ')' && s[i - 1] == '(') {
st.pop();
total += st.size();
}
if (s[i] == '(') st.push(s[i]);
if (s[i] == ')' && s[i - 1] == ')') {
st.pop();
total += 1;
}
}
cout << total;
처음부터 이렇게 생각했어야 하는건데 ㅠㅠ 간단한 풀이가 있는데 생각 못해서 계속 어렵게 풀다 보면 그 늪에 빠져서 다른 풀이를 떠올리는게 어렵다.. 연습을 더 많이 해야겠다
728x90
반응형
LIST
'Algorithm' 카테고리의 다른 글
[프로그래머스 - 입양 시각 구하기(2)] MYSQL , GROUP BY , DATETIME 추출 (0) | 2022.02.06 |
---|---|
[백준 BOJ 1074 silver1 - Z] 분할정복 C++ (0) | 2022.01.18 |
[백준 BOJ 1966 silver3 - 프린터 큐] 자료구조 , 큐 C++ (0) | 2022.01.14 |
[백준 BOJ 2573 glod4 - 빙산] DFS C++ (0) | 2022.01.13 |
[백준 BOJ 1937 glod3 - 욕심쟁이 판다] DFS(?) , DP C++ (0) | 2022.01.12 |