백준(Backjoon) 10799, 쇠막대기

2021. 7. 6. 15:50CodingTest

문제풀이

제가 생각한 위 문제의 핵심은 레이저가 발사 시 발사된 가운데를 기점으로 쇠막대기의 왼쪽의 개수를 세는 것입니다. 그리고 오른쪽의 개수는 파이프가 끝날때마다 1개씩 추가해주는 것이라고 생각합니다.

위의 설명을 스택에 적용한다면 다음과 같습니다.

  • "(" 문자열이 입력될때마다 스택에 "(" 문자열 push
  • ")" 문자열이 입력될 때 pop 수행, 그리고  ")" 문자열이 레이저인지 파이프의 종료인지 검사
    • 입력된 ")" 문자열의 이전 문자열이 "(" 인 경우 : 레이저
      • 레이저 인경우 스택의 사이즈 만큼 결과 변수에 누적
    • 입력된 ")" 문자열의 이전 문자열이 ")" 인 경우 : 파이프의 종료
      • 파이프의 종료인 경우 결과 변수에 1만큼 누적

소스코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;


public class Main {
	public static int solution(String[] input)
	{
		Stack<String> stack = new Stack<String>();
		int answer = 0;
		for(int i=0;i<input.length;i++)
		{
			if(input[i].equals("("))
			{
				stack.add(input[i]);
			}
			else
			{
				stack.pop();
				if(input[i-1].equals("("))	// 레이저
				{
					answer += stack.size();
				}
				else						// 파이프
				{
					answer++;
				}
				
			}
		}
		return answer;
	}
	
	public static void main(String args[]) throws IOException
	{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String[] input = br.readLine().split("");
		
		System.out.println(solution(input));
		
		
	}
}

References

백준-10799 쇠막대기, 화투의 개발 블로그, https://hsp1116.tistory.com/29

'CodingTest' 카테고리의 다른 글

백준(Backjoon) 1259, 팰린드롬수  (0) 2021.07.08
백준(Backjoon) 10820, 문자열 분석  (0) 2021.07.07
백준(Backjoon) 1026, 보물  (0) 2021.07.06
백준(Backjoon) 11655, ROT13  (0) 2021.07.05
백준(Backjoon) 1076, 저항  (0) 2021.07.02