728x90

www.acmicpc.net/problem/10799

 

10799번: 쇠막대기

여러 개의 쇠막대기를 레이저로 절단하려고 한다. 효율적인 작업을 위해서 쇠막대기를 아래에서 위로 겹쳐 놓고, 레이저를 위에서 수직으로 발사하여 쇠막대기들을 자른다. 쇠막대기와 레이저

www.acmicpc.net

#include <iostream>
#include <string>
using namespace std;

int main() {
	string s;
	int cnt = 0; // 현 시점에 있는 쇠막대기
	int stickNum = 0; // 현재까지 잘린 막대기 조각 개수
	cin >> s;
	for (int i = 0; i < s.size(); i++) {
		if (s[i] == '(') {
			if (i < s.size() - 1 && s[i + 1] == ')') { // 레이저일때 -> 상황 A
				stickNum += cnt;
				i++; // 레이저이므로 다음 s[i]는 ')'이므로 다음 문자는 뛰어넘음
			}
			else { // 여는 괄호일 때 -> 상황 B
				cnt++;
			}
		}
		else { // 닫는 괄호일 때 -> 상황 C
			cnt--;
			stickNum++;
		}
	}
	cout << stickNum;
	return 0;
}

일단 문자열로 받은 다음 문자열의 길이만큼 for문을 돌면서 순차적으로 그 시점에 있는 쇠막대기의 개수와 그 시점에서 현재까지 잘린 막대기 조각의 개수를 세었다.

현 시점에 있는 쇠막대기의 개수: cnt

현재까지 잘린 막대기 조각의 개수: stickNum

()(((()())(())()))(())

입력이 위와 같이 들어왔을 때

위와 같이 동작한다. 따라서 답은 17이 된다.

상황 A는 if문 안에서의 if문 (레이저일 때)

상황 B는 if문 안에서의 else문 (여는 괄호일 때)

상황 C는 else문 (닫는 괄호일 때)

 

코드에 조금 더 충실하게 표를 그리자면

위와 같다. 레이저일 경우 i++로 건너뛰는 것을 표현해주었다.

728x90

'알고리즘 문제' 카테고리의 다른 글

[백준] 11866번 요세푸스 문제 0  (0) 2021.01.03
[백준] 2217번 로프  (0) 2021.01.02
[백준] 5582번 공통 부분 문자열  (0) 2020.09.10
[백준] 3055번 탈출  (0) 2020.09.04
[백준] 13904번 과제  (0) 2020.09.02

+ Recent posts