문제
괄호가 입력되면 올바른 괄호이면 “YES", 올바르지 않으면 ”NO"를 출력합니다. (())() 이것은 괄호의 쌍이 올바르게 위치하는 거지만, (()()))은 올바른 괄호가 아니다.
💡 입력설명
첫 번째 줄에 괄호 문자열이 입력됩니다. 문자열의 최대 길이는 30이다.
💡 출력설명
첫 번째 줄에 YES, NO를 출력한다.
💡 입력예제1
(()(()))(()
💡 출력예제1
NO
💡 입력예제2
()()(()())
💡 출력예제2
YES
코드
첫 번째 풀이
#include <stdio.h>
int main() {
int i, cnt = 0;
char a[31];
scanf("%s", &a);
for(i = 0; a[i] != '\0'; i++) {
if(a[0] == 41) {
cnt += 31;
break;
} else if(a[i + 1] == '\0') {
if(a[i] == 40) {
cnt += 31;
break;
}
}
if(a[i] == 40) {
cnt++;
} else {
cnt--;
}
}
if(cnt == 0) {
printf("YES");
} else {
printf("NO");
}
return 0;
}
최종 풀이
#include <stdio.h>
int main() {
int i, cnt = 0;
char a[31];
scanf("%s", &a);
for(i = 0; a[i] != '\0'; i++) {
if(a[i] == '(') {
cnt++;
} else {
cnt--;
}
if(cnt < 0) {
printf("NO");
break;
}
}
if(cnt == 0) {
printf("YES");
} else if(cnt > 0) {
printf("NO");
}
return 0;
}
설명
사용자로부터 괄호를 입력받고 a배열에 할당한다.
문자열을 순회하는 for문을 작성하고 item이 '('에 해당하면 cnt를 1증가하고 ')'에 해당하면 cnt를 1감소한다.
만약 cnt가 음수가 된 순간부터 올바른 괄호에 해당하지 않기 때문에 'NO'를 출력하고 break로 해당 for문에서 나온다.
순회를 마치고 cnt값이 0이면 올바른 괄호에 해당하므로 'YES'를 출력하고 0보다 클 경우 올바른 괄호에 해당하지 않으므로 'NO'를 출력한다.
배운 점
괄호의 첫번째가 ')' 이거나 마지막 부분이 '('일 경우를 따로 적어줬는데 cnt가 음수로 도달하면 이전 조건문을 쓰지 않고도 같은 의미라는 것을 알게되었다.
해당 내용은 김태원님의 'it 취업을 위한 알고리즘 문제풀이' 강의를 듣고 작성한 글입니다.