티스토리 뷰
생각
Github - https://github.com/hellojdh/Code/blob/master/src/baekjoon/q10000/Q10799.java 쇠막대기의 정보와 레이저의 정보를 준다. 레이저는 무조건 ()로 표시된다. '('는 쇠막대기의 시작을 ')'는 쇠막대기의 끝을 의미한다. 쇠막대기가 놓아져 있을때 '()' 즉 레이저를 만나면 쇠막대기가 쪼개진다. 쇠막대기와 레이저의 정보를 주었을 때 총 몇 조각의 쇠막대기가 나오는지 구하여라.
처음 생각
어디서 풀어본 문제라 생각해서 찾아보니 SW Expert에서 풀어본 문제였다.
다음 생각
문제 분류가 Stack이기도하고, 기존에 풀이는 변수로 관리해주었으므로 이번엔 Stack으로 관리해보았다.
▶ 변수를 다루던게 Stack으로 바뀌었으므로 Stack의 size로 현 막대기 개수를 처리해주면된다.
▶ 막대기의 끝나는 의미로 ')'를 만났을 경우 잘린 끝 조각이 하나가 있는 것이므로 전체 결과에 더해주는것을 조심해야한다.
방안
1) Java 풀이
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 | package baekjoon.q10000; import java.util.Scanner; import java.util.Stack; public class Q10799 { public static void main(String args[]) { Scanner sc = new Scanner(System.in); Stack stack = new Stack(); String t = sc.next(); int result = 0; for(int i=0;i<t.length();i++){ if(t.charAt(i)=='('){ if(t.charAt(i+1)==')'){ i++; result += stack.size(); continue; } // 막대기 개수 +1 stack.push(1); }else{ // 막대기 개수 -1 stack.pop(); // 총 막대 개수 +1 result++; } } System.out.println(result); } } |
2) C++ 풀이
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 | #include<iostream> #include<string> using namespace std; int main(){ int cnt=0,result=0; string t; cin>>t; for(int i=0;i<t.length();i++){ if(t[i]=='('){ if(t[i+1]==')'){ i++; result+=cnt; continue; } cnt++; }else{ cnt--; result++; } } cout<<result; return 0; } |
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 7576번 토마토 (0) | 2018.11.22 |
---|---|
[백준] 2589번 보물섬 (0) | 2018.11.22 |
[백준] 9012번 괄호 (0) | 2018.11.18 |
[백준] 10953번 A+B -6 (4) | 2018.11.16 |
[백준] 10951번 A+B - 4 (0) | 2018.11.16 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday