2022. 4. 3. 14:32ㆍC언어/백준
-Class2 : Silver 4
https://www.acmicpc.net/problem/9012
9012번: 괄호
괄호 문자열(Parenthesis String, PS)은 두 개의 괄호 기호인 ‘(’ 와 ‘)’ 만으로 구성되어 있는 문자열이다. 그 중에서 괄호의 모양이 바르게 구성된 문자열을 올바른 괄호 문자열(Valid PS, VPS)이라고
www.acmicpc.net
-결과
-코드
#include <stdio.h>
#include <string.h>
int main(void) {
int n;
char a[60];
char k = '('; // ( = 1
char l = ')'; // ) = -1
int m; //괄호가 1개씩 추가될 때마다 계산한 합
int res; //최종합
int len;
scanf("%d", &n);
for (int i=0; i<n; i++) {
scanf("%s", a);
m=0;
len = strlen(a);
for(int j=0; j<len; j++) {
if (a[j] == '(') {
m+=1;
}
else if (a[j] == ')') {
m -= 1;
}
if (m<0) {
break;
}
}
if (m==0) {
printf("YES\n");
}
else {
printf("NO\n");
}
}
}
-풀이
이 문제는 괄호가 제대로 된 순서로 잘 쓰였나에 관한 것이다.
하나의 괄호 문자열의 길이는 2 이상 50 이하이다.
라고 문제에 주어졌기 때문에 넉넉잡아서 배열의 크기를 60으로 잡는다.
그리고 계산하기 편하게 하기 위해서 '(' 기호를 +1로 생각하고, ')' 기호를 -1이라고 가정하고 출발한다.
먼저 몇 줄을 입력받을 건지를 입력받고, for문으로 각 줄마다 검사를 반복한다.
괄호로 쓰인 줄을 배열로 입력받는다.
strlen함수는 배열을 입력받아서 배열의 끝에 저장된 \0문자까지 문자들의 개수를 하나 하나 세는 함수이다. 즉, 문자열의 길이를 반환하는 함수이다.
이 strlen 함수를 이용해서 입력받은 문자열 a의 길이를 세고, 그 문자열 a 내에서 '('와 ')'를 1과 -1로 세서 총 합(m)이 0보다 작을 시에는 VPS가 아니라고 판단하도록 하는 for문을 실행한다.
'()'나 ')('나 ')))(((' 모두 총 합이 0이다. 그런데 합이 0이더라도 ')('와 ')))((('는 괄호의 순서가 틀리기 때문에 VPS가 아니다. 이런 경우도 잡아내기 위해서 문자열 a에서 괄호가 하나씩 추가될 때마다 바로 총 합(m)을 계산하여, m이 0보다 작아지는 순간이 있으면 for문을 바로 벗어나도록 break를 건다.
모든 줄의 문자열 계산이 끝나면 if문으로 만약 총 합이 0이라면 YES를 출력하도록 하고, 아니라면 NO를 출력하도록 한다.
'C언어 > 백준' 카테고리의 다른 글
1436: 영화감독 숌 (0) | 2022.05.01 |
---|---|
1181: 단어 정렬 (0) | 2022.05.01 |
1018: 체스판 다시 칠하기 (0) | 2022.05.01 |
10773: 제로 (0) | 2022.04.03 |
1094번: 막대기 (0) | 2022.04.03 |