본문 바로가기

BOJ

쇠막대기

Day 20: 10799 (https://www.acmicpc.net/problem/10799)



엊그제부터 최백준씨가 운영하는 알고리즘 강좌 사이트 code+ (https://code.plus/course/4) 의 커리큘럼에 나오는 연습문제들을 풀고 있었는데, 그 중에 흥미를 느꼈던 스택 문제중 하나다. 여타 스택 문제들과 마찬가지로 스택을 쓰지 않고도 쉽게 구현할 수 있다.

문자열을 받고 character 단위로 traverse 하면서, 우리는 세가지의 케이스를 맞닥뜨리는데,

1. 무언가가 열림 ('(' 출현)

- 파이프의 시작일 수도, 레이저의 시작일 수도 있다.

- 그냥 스택 (아래 코드의 경우엔 remaining 변수) 에 하나를 추가한다.

2. 레이저가 닫힘

- 레이저는 항상 인접한 '('와 ')'로 표현되므로, 직전에 검사한 character가 '(' 라면 레이저가 맞다.

- 일단 우리의 스택에는 열려있는 파이프의 갯수만 추가할 것이기 때문에, 스택에서 하나를 빼준다.

- 레이저가 하나 확실하게 생겼기에, 여태까지 쌓여왔던 모든 열린 파이프가 (스택에 있는 '('의 갯수) 레이저로 한번 잘리게 된다.

- 잘린 파이프의 갯수를 저장하는 변수에 스택의 크기만큼 더해준다.

3. 파이프가 닫힘

- 레이저가 등장했든 안했든 그에 관련된 변동은 이전에 다 handle했다.

- 파이프의 확실한 등장을 ensure하기 위해 파이프의 갯수를 1 추가해준다.


Scanner 대신 BufferedReader 함수와 InputStreamReader 함수를 이용해 입력시간을 줄이고, charAt() 함수로 매번 문자열에 접근하는 대신 toCharArray() 함수로 한번에 char[] 로 만들어 소모시간을 줄였다. (toCharArray() 활용은 당 문제 랭커의 코드를 참조했다. 헤헤)

'BOJ' 카테고리의 다른 글

집합  (0) 2018.01.18
에디터  (0) 2018.01.12
2007년  (0) 2018.01.03
네 수  (0) 2018.01.02
그룹 단어 체커  (0) 2017.12.29