일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- 프레임워크와 라이브러리의 차이
- double ended queue
- Django의 편의성
- 시간복잡도
- 표준 입출력
- UI한글변경
- 입/출력
- string 메소드
- vscode
- 알고리즘 공부방법
- 2557
- Django Nodejs 차이점
- correlation coefficient
- Django란
- 엑셀
- 자료구조
- 구조체와 클래스의 공통점 및 차이점
- 장고란
- EOF
- k-eta
- 입출력 패턴
- string 함수
- 백준
- 이분그래프
- 매크로
- 연결요소
- c++
- iOS14
- getline
- scanf
Archives
- Today
- Total
Storage Gonie
(3) [C++, Java, Python] 백준 No.10799 : 쇠막대기 본문
반응형
문제
풀이
# C++(내가 푼 방법)
- 가장 간단한 입력을 통해 생각을 해보자. ex) ( ( ) ) = 2개, ( ( ) ( ) ) = 3개
- 이것들은 어떻게 계산될 수 있을까?
- '(' 이면 스택에 넣고
- '( )' 레이저가 나오면 스택에서 '('를 하나 빼고 스택에 있는 원소의 개수를 정답에 더한다.
- ')'가 나오면 스택에서 '('를 하나 빼고 정답에 1을 더한다.
#include <iostream>
#include <stack>
using namespace std;
int calculateAnswer(string str)
{
int answer = 0;
stack<char> st;
for (int i = 0; i < str.size(); i++)
{
if (str[i] == '(') //막대의 시작인 경우
st.push('(');
else if (str[i] == ')')
{
if (str[i - 1] == '('){ // 레이저인 경우
st.pop();
answer += st.size();
}
else if (str[i - 1] == ')') // 막대의 끝인 경우
{
st.pop();
answer += 1;
}
}
}
return answer;
}
int main(void)
{
ios::sync_with_stdio(false);
string str;
cin >> str;
cout << calculateAnswer(str) << endl;
}
# C++(백준)
- 스택에는 어차피 '(' 만 들어가기 떄문에 문자의 인덱스를 집어넣고, 레이저를 인덱스 차로 인식하였다.
#include <iostream>
#include <string>
#include <stack>
using namespace std;
int main() {
string a;
cin >> a;
int n = a.size();
stack<int> s;
int ans = 0;
for (int i=0; i<n; i++) {
if (a[i] == '(') {
s.push(i);
} else {
if (s.top()+1 == i) {
s.pop();
ans += s.size();
} else {
s.pop();
ans += 1;
}
}
}
cout << ans << '\n';
return 0;
}
# Java
import java.util.*;
public class Main {
public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
String a = sc.nextLine().trim();
int n = a.length();
Stack<Integer> s = new Stack<Integer>();
int ans = 0;
for (int i=0; i<n; i++) {
char c = a.charAt(i);
if (c == '(') {
s.push(i);
} else {
if (s.peek()+1 == i) {
s.pop();
ans += s.size();
} else {
s.pop();
ans += 1;
}
}
}
System.out.println(ans);
}
}
# Python
import sys
r = lambda: sys.stdin.readline().strip()
s = r()
stack = []
ans = 0
for (i,c) in enumerate(s):
if c == '(':
stack.append(i)
else:
if stack[-1]+1 == i:
stack.pop()
ans += len(stack)
else:
stack.pop()
ans += 1
print ans
반응형
'알고리즘 > 백준풀이2. 스택' 카테고리의 다른 글
(4) [C++, Java] 백준 No.1406 : 에디터 (0) | 2019.04.24 |
---|---|
(2) [C++, Java, Python] 백준 No.9012 : 괄호 (0) | 2019.04.23 |
(1) [C++,Java, Python] 백준 No.10828 : 스택(기본구현) (2) | 2019.04.22 |
Comments