본문 바로가기
  • 비둘기다
  • 비둘기다
  • 비둘기다
코딩테스트/baekjoon

[스택] 백준 10799번 (C언어) : 쇠 막대기

by parzival56 2023. 5. 18.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define N 100000
char str[N];

int main(void) {
	int count = 0, sum = 0;

	scanf("%s", str);

	for (int i = 0; i < strlen(str); i++) {
		if (str[i] == '(') {
			count++;
		}
		else if(str[i] == ')') {
			count--;
			if (str[i - 1] != str[i])
				sum += count;
			if (str[i] == str[i + 1])
				sum += 1;
		}
	}

	printf("%d", sum);
}

main함수 안에 있는 for문을 살펴보면 일단 열리는 괄호 ( 가 나오면  )도 존재하여 하나의 쌍이 완성되기 때문에 count를 1 올립니다. 그다음에 닫히는 괄호가 나오면 count를 1 낮춰줄 건데, 여기서 만약 직전의 괄호가 여는 괄호라면 자르는 포인트이기 때문에 그대로 count를 최종값인 sum에 모두 넣어줍니다. 

그리고 비록 직전의 괄호가 여는 괄호더라도 바로 뒤의 괄호가 닫는 괄호이면 그대로 sum을 1 증가시켜줍니다. 이는 위 코드에서는 여닫는 대응 관계에 있는 괄호들을 매칭시켜 줄 수 없기 때문입니다. 그래서 매칭시킬 수 없는 대신 sum을 1 증가시켜서 마치 대응된 것처럼 처리해 주는 것입니다.

댓글