흔하디 흔한 if-else문을 익히는 문제이다.

다만 이렇게 정리하는 이유는 원래 사용하던 C/C++이었으면 금방 풀었을텐데, 

아직도 2개 이상의 입력받기를 할 때 python으로 처리하는 방법이 계속 햇갈려서이다.

정리겸 한 번 올리기로 한다.

출처: https://www.acmicpc.net/problem/11367


예제 입력에서 "name value"의 형태로 입력받는 부분이 계속 햇갈린다..

그냥 scanf로 받으면 되는 C/C++과는 살짝 다르게 python을 받기 때문이다.

중요한 것은 split()을 사용하고, 각각의 변수에 이를 통해서 저장하도록 만들어야 한다는 점이다.

즉, 다음과 같은 형태가 필요하다.

1
name, score = input().split()
cs

 

결국 내가 만든 정답코드는 다음과 같다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
repeat = int(input())
for i in range(0, repeat):
    name, score = input().split()  # 이 부분이 중요. 2개 이상 입력받기를 계속 햇갈리는 중...2021-7-16
    # print(name, score, sep=' ')
    if int(score) >= 97:
        grade = "A+"
    elif int(score) <= 96 and int(score) >= 90:
        grade = "A"
    elif int(score) <= 89 and int(score) >= 87:
        grade = "B+"
    elif int(score) <= 86 and int(score) >= 80:
        grade = "B"
    elif int(score) <= 79 and int(score) >= 77:
        grade = "C+"
    elif int(score) <= 76 and int(score) >= 70:
        grade = "C"
    elif int(score) <= 69 and int(score) >= 67:
        grade = "D+"
    elif int(score) <= 66 and int(score) >= 60:
        grade = "D"
    else:
        grade = "F"
    print(name, grade, sep=' ')
 
cs

문제는 내가 바보라서 일일이 int(score)를 elif에 넣었다는 것이다.

그냥 간단하게 ....

1
score = int(score)
cs

이렇게 한 다음 elif문에 score만 넣으면 되는 것을....

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
repeat = int(input())
for i in range(0, repeat):
    name, score = input().split()  # 이 부분이 중요. 2개 이상 입력받기를 계속 햇갈리는 중...2021-7-16
    # print(name, score, sep=' ')
    score = int(score)  # 이렇게 하나만 넣으면 score는 int형으로 변환이 된다.
    if score >= 97:
        grade = "A+"
    elif score <= 96 and score >= 90:
        grade = "A"
    elif score <= 89 and score >= 87:
        grade = "B+"
    elif score <= 86 and score >= 80:
        grade = "B"
    elif score <= 79 and score >= 77:
        grade = "C+"
    elif score <= 76 and score >= 70:
        grade = "C"
    elif score <= 69 and score >= 67:
        grade = "D+"
    elif score <= 66 and score >= 60:
        grade = "D"
    else:
        grade = "F"
    print(name, grade, sep=' ')
cs

 

 

출처: https://www.acmicpc.net/problem/11367

 

11367번: Report Card Time

The input will begin with a single line containing just a whole number, n, of the number of hobbits in the class, followed by n lines in the form a b, where a is the hobbit’s name (only alphabetical characters) and b is the hobbit’s grade, given as a w

www.acmicpc.net

 

매우 단순한 수학문제임에도 불구하고 몇 번이고 틀려서 계속 고민하다가 겨우 왜 그런지 알게된 문제라서 이렇게 정리를 해본다.

출처: https://www.acmicpc.net/problem/10093

문제를 보다시피 매우 간단한 문제이다.

다만, 한 가지를 간과한 것이 있어서 계속 틀렸다.

숫자가 예제에서 "8 14" 라고 되어있는데, 잊지 말자... "14 8"도 들어갈 수 있고, "13, 14"도 들어갈 수 있음을...

 

처음에 그래서 매우 간단하게 만든 코드이자 계속 틀렸다고 나온 코드가 다음의 코드이다.

(물론, 위에서 주어진 예제인 "8 14"는 무척이나 잘 돌아간다...)

1
2
3
4
5
num1, num2 = list(map(int, input().split()))
btw_num = num2-num1-1
print(btw_num)
for i in range(num1+1, num2):
    print(i, end=' ')
 

 

그리고 max와 min값을 새로 처리해서 만들어야 한다.

결국 다음과 같은 코드가 정답인 코드이다.

1
2
3
4
5
6
7
8
9
10
a, b = list(map(int, input().split()))
num2 = max(a, b)
num1 = min(a, b)
btw_num = num2-num1-1
if num1 == num2 or num1+1 == num2:
    btw_num = 0
print(btw_num)
for i in range(num1+1, num2):
    print(i, end=' ')
 
cs

 

출처: https://www.acmicpc.net/problem/10093

 

10093번: 숫자

두 양의 정수가 주어졌을 때, 두 수 사이에 있는 정수를 모두 출력하는 프로그램을 작성하시오.

www.acmicpc.net

 

파이썬을 최근에 처음부터 배우기 시작하면서 기능을 하나씩 알아가고 있는 중이다.

 

이 문제는 특히 n진수를 10진수의 숫자로 변환을 하는 방법이다.

 

원래 C언어에서라면 일일이 배열로 받고, 그것을 다시 10진수로 처리해야하는 과정이 있었겠지만,

파이썬에서는 input으로 수를 받고, 그것을 int()를 통해서 밑을 n이라는 수로 받음으로써 쉽게 처리할 수 있다.

 

 

출처: https://www.acmicpc.net/problem/11104

 


 

1
2
3
4
5
# 파이썬에서는 binary를 input으로 입력을 받고, 이를 int를 통해서 binary변수의 수를 밑이 2인 것으로 하여 변환이 가능하다.
for i in range(0int(input())):
    binary = input()
    print(int(binary, 2))  # 밑(2가 있는 자리)을 어떤 수로 해서 처리할 것인지 
 
cs

 

[문제]

N개의 정수가 주어진다. 이때, 최솟값과 최댓값을 구하는 프로그램을 작성하시오.


[입력]

첫째 줄에 정수의 개수 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 N개의 정수를 공백으로 구분해서 주어진다. 모든 정수는 -1,000,000보다 크거나 같고, 1,000,000보다 작거나 같은 정수이다.


[출력]

첫째 줄에 주어진 정수 N개의 최솟값과 최댓값을 공백으로 구분해 출력한다.

백준에서 제시하는 예시


간단한 문제로써, 사실 오늘 내로 코드 하나는 풀어야겠고, 시간은 없고 해서 이걸로 간단하게 하루를 마무리용으로 했다

(나중에는 더 실력을 쌓아서 좀 더 어려운 문제도 금방 금방 해결할 수 있기를...)

 

그런데 이 와중에 처음에는 "컴파일 에러"가 나왔다. 다음 코드처럼 if ~ if ~ 대신에 if ~ else if ~를 했기 때문이다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/*본코드는 컴파일에러가 뜬다*/
#include <stdio.h>
 
int main(void)
{
    int N, num;
    int max = -1000001, min = 1000001;
    
    scanf("%d"&N);
    
    for (int i = 1; i <= n; i++){
        scanf("%d"&num);
        if (num > max){
            max = num;
        }
        else if (num < min){
            min = num;
        }
    }
    printf("%d %d", min, max);
 
    return 0;
}
cs

 

 

결국, else if가 아닌 if문으로 바꿨을 때야 비로소 제대로 맞았다고 나왔다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
 
int main(void)
{
    int N, num;
    int max = -1000001, min = 1000001;
    
    scanf("%d"&N);
    
    for (int i = 1; i <= n; i++){
        scanf("%d"&num);
        if (num > max){
            max = num;
        }
        if (num < min){
            min = num;
        }
    }
    printf("%d %d", min, max);
 
    return 0;
}
cs

 

출처: https://www.acmicpc.net/problem/10818

 

10818번: 최소, 최대

첫째 줄에 정수의 개수 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 N개의 정수를 공백으로 구분해서 주어진다. 모든 정수는 -1,000,000보다 크거나 같고, 1,000,000보다 작거나 같은 정수이다.

www.acmicpc.net

 

'코딩 문제풀이 및 연습 > [C언어]백준' 카테고리의 다른 글

[백준 6749번]Next in line  (0) 2021.03.17
[백준 2675번]문자열 반복  (0) 2021.03.16
[백준 9012번] Parenthesis  (0) 2020.10.08
[백준 2795번] Transactions  (0) 2020.09.05
[백준 2753번] 윤년  (0) 2020.09.05

[문제]

Given two integers, calculate and output their sum.


[입력]

The input contains several test cases. The first line contains and integer t (t ≤ 100) denoting the number of test cases. Then t tests follow, each of them consisiting of two space separated integers x and y (−109 ≤ x, y ≤ 109).


[출력]

For each test case output output the sum of the corresponding integers.

 

백준에서 제시하는 예제 입출력


매우 간단한 사칙연산 문제이다.

단지, C++를 건드리기 시작한지 얼마 안되었기 때문에 C++로 한 번 코드를 작성해보았다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
#include <iostream>
using namespace std;
 
int main()
{
    int num, a, b, sum;
    cin >> num; //scanf("%d", &num);
    for(int i=0; i<num; i++){
        cin >> a >> b; //scanf("%d %d", &a, &b);
        sum = a + b;
        cout << sum << endl//printf("%d\n", sum);
    }
 
    return 0;
}
cs

주석을 보면 C언어로 했을 때의 코드이다.

 

출처: https://www.acmicpc.net/problem/7891

 

7891번: Can you add this?

The input contains several test cases. The first line contains and integer t (t ≤ 100) denoting the number of test cases. Then t tests follow, each of them consisiting of two space separated integers x and y (−109 ≤ x, y ≤ 109).

www.acmicpc.net

 

[문제]

숫자 맞추기 게임은 초등학교 학생들 사이에서 유행하는 게임이다. 선생님은 학생들의 연산 실력과 논리적인 사고력을 기르기위해 학생들에게 이 게임을 권유하고 있다.

이 게임을 시작할 때는 친구가 숫자 하나를 머리속에 생각해야 한다. 이 숫자를 n0이라고 하자. 그러고 나서 다음과 같이 게임을 진행한다.

  1. 친구에게 n1 = 3*n0 계산을 하라고 한 뒤, n1이 짝수인지 홀수인지를 말해달라고 한다.
  2. n1이 짝수라면, n2 = n1/2를, 홀수라면 n2 = (n1+1)/2를 계산해달라고 한다.
  3. n3 = 3*n2의 계산을 부탁한다.
  4. 친구에게 n4 = n3/9를 계산한 뒤, 그 값을 말해달라고 한다. (n4는 나눗셈의 몫이다)
  5. 자 이제, n1이 짝수였다면, n0 = 2*n4로, 홀수였다면, n0 = 2*n4+1로 처음 친구가 생각한 숫자를 맞출 수 있다.

예를 들어,  친구가 생각한 수가 n0=37이었다면, n1 = 111이 되고 홀수이다. 그 다음 n2 = 56, n3 = 168, n4 = 18이 된다. 친구는 n4를 알려주게 된다. 

그럼 2*n4+1 = 37이기 때문에, 친구가 제일 처음 생각한 숫자를 맞출 수 있다.

n0이 주어졌을 때, n1이 홀수인지 짝수인지와 n4를 구하는 프로그램을 작성하시오.


[입력]

입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루어져 있고, n0으로 이루어져 있다. (0 < n0 < 1,000,000) 입력의 마지막 줄에는 0이 하나 주어진다.


[출력]

각 테스트 케이스에 대해서, 케이스 번호를 출력하고 n1이 짝수라면 'even', 홀수라면 'odd'를 출력하고, n4를 출력한다.

 

백준에서 제시하는 예제 입출력


문제가 조금 길어서 쫄았지만, 알고 보니 문제에서 논리 및 코드의 흐름을 그대로 보여준 것이었기 때문에, 문제들의 n0 ~ n5까지 배열로 바꿔버리면 매우 간단히 해결이 가능하다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>
using namespace std;
 
int main()
{
    int n[5];
    int i=1;
    cin >> n[0]; //scanf("%d", n);  //&n[0]과 같다.
    
    while(n[0!= 0){
        n[1]=3*n[0]; //친구에게 n(1) = 3*n(0) 계산을 하라고 한 뒤, n(1)이 짝수인지 홀수인지를 말해달라고 한다.
    
        n[2]=(n[1]+1)/2//n(1)이 짝수라면, n(2) = n(1)/2를, 홀수라면 n(2) = (n(1)+1)/2를 계산해달라고 한다.
 
        n[3]=3*n[2]; //n3 = 3*n2의 계산을 부탁한다.
    
        n[4]=n[3]/9//친구에게 n4 = n3/9를 계산한 뒤, 그 값을 말해달라고 한다. (n4는 나눗셈의 몫이다)
    
        if(n[1]%2 == 0){
            cout << i << ". even " << n[4<< endl//printf("%d. even %d\n", i, n[4]);
        }
        else{
            cout << i << ". odd " << n[4<< endl//printf("%d. odd %d\n", i, n[4]);
        }
        i++;
        cin >> n[0]; //scanf("%d", n);
    }
    
    return 0;
    
}
cs

 

C++로 하기는 했지만, 주석으로 달았듯이, scanf와 printf로 바꾸기만 하면 C언어로도 가능하다.

 

출처: https://www.acmicpc.net/problem/4892

 

4892번: 숫자 맞추기 게임

입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루어져 있고, n0으로 이루어져 있다. (0 < n0 < 1,000,000) 입력의 마지막 줄에는 0이 하나 주어진다.

www.acmicpc.net

 

[문제]

You know a family with three children. Their ages form an arithmetic sequence: the difference in ages between the middle child and youngest child is the same as the difference in ages between the oldest child and the middle child. For example, their ages could be 5, 10 and 15, since both adjacent pairs have a difference of 5 years.

Given the ages of the youngest and middle children, what is the age of the oldest child?

 


[입력]

The input consists of two integers, each on a separate line. The first line is the age Y of the youngest child (0 ≤ Y ≤ 50). The second line is the age M of the middle child (Y ≤ M ≤ 50).


[출력]

The output will be the age of the oldest child.

 

백준에서 제시하는 예제 입출력


영어라서 그렇지, 문제 자체는 매우 기초적인 문제이다!

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
 
int main()
{
    int youngest, middle;
    
    scanf("%d %d"&youngest, &middle);
    
    printf("%d\n", middle + (middle-youngest));
 
    return 0;
}
 
cs

 

출처: https://www.acmicpc.net/problem/6749

 

6749번: Next in line

You know a family with three children. Their ages form an arithmetic sequence: the difference in ages between the middle child and youngest child is the same as the difference in ages between the oldest child and the middle child. For example, their ages c

www.acmicpc.net

 

'코딩 문제풀이 및 연습 > [C언어]백준' 카테고리의 다른 글

[백준 10818번] 최소, 최대  (0) 2021.03.18
[백준 2675번]문자열 반복  (0) 2021.03.16
[백준 9012번] Parenthesis  (0) 2020.10.08
[백준 2795번] Transactions  (0) 2020.09.05
[백준 2753번] 윤년  (0) 2020.09.05

[문제]

문자열 S를 입력받은 후에, 각 문자를 R번 반복해 새 문자열 P를 만든 후 출력하는 프로그램을 작성하시오. 즉, 첫 번째 문자를 R번 반복하고, 두 번째 문자를 R번 반복하는 식으로 P를 만들면 된다. S에는 QR Code "alphanumeric" 문자만 들어있다.

QR Code "alphanumeric" 문자는 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ\$%*+-./: 이다.

 


[입력]

첫째 줄에 테스트 케이스의 개수 T(1 ≤ T ≤ 1,000)가 주어진다. 각 테스트 케이스는 반복 횟수 R(1 ≤ R ≤ 8), 문자열 S가 공백으로 구분되어 주어진다. S의 길이는 적어도 1이며, 20글자를 넘지 않는다. 


[출력]

각 테스트 케이스에 대해 P를 출력한다.

백준에서 제시하는 예제 입출력

 


 

첫번째 시도는 다음과 같다. T를 for문을 통해서 돌렸는데, 계속해서 컴파일 에러가 났다.

(참고로, strlen(S) 대신에 R를 사용했는데, 이건 아예 틀렸다고 답이 나온다.. 분명 예제 입출력데로 나오는데도 말이다.

이유는 "문제"의 입력형식데로 맞춰야 하기 때문이라고 추정된다)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
#include <string.h>
 
int main()
{
    int T, R;
    char S[21];
    scanf("%d"&T);
    for(int i=0; i<T; i++){
        scanf("%d %s"&R, &S);
        for(int j=0; j<strlen(S); j++){
                for (int k=0; k<R; k++){
                    printf("%c", S[j]);
            }
        }
        printf("\n");
    }
    return 0;
}
cs

결국 여러 번 시도한 끝에, for문을 바꿔야 하는 것으로 결론이 났다.

(다음과 같이 해야 제대로 맞았다고 나온다. while문을 통해서 T를 계속 하나씩 뺀다)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
#include <string.h>
 
int main() {
    int T, R;
    char S[21];
    
    scanf("%d"&T);
    //T만큼의 테스트케이스
    while (T--) {
        scanf("%d %s"&R, S);
        
        //결과를 출력하기 위한 반복문
        for (int i = 0; i < strlen(S); i++) {
            for (int j = 0; j < R; j++)
                printf("%c", S[i]);
        }
 
        printf("\n");
    }
    return 0;
}
 
cs

 

 

출처1: www.acmicpc.net/problem/2675

 

2675번: 문자열 반복

문자열 S를 입력받은 후에, 각 문자를 R번 반복해 새 문자열 P를 만든 후 출력하는 프로그램을 작성하시오. 즉, 첫 번째 문자를 R번 반복하고, 두 번째 문자를 R번 반복하는 식으로 P를 만들면 된다

www.acmicpc.net

'코딩 문제풀이 및 연습 > [C언어]백준' 카테고리의 다른 글

[백준 10818번] 최소, 최대  (0) 2021.03.18
[백준 6749번]Next in line  (0) 2021.03.17
[백준 9012번] Parenthesis  (0) 2020.10.08
[백준 2795번] Transactions  (0) 2020.09.05
[백준 2753번] 윤년  (0) 2020.09.05

[문제]

요세푸스 문제는 다음과 같다.

1번부터 N번까지 N명의 사람이 원을 이루면서 앉아있고, 양의 정수 K(≤ N)가 주어진다. 이제 순서대로 K번째 사람을 제거한다. 한 사람이 제거되면 남은 사람들로 이루어진 원을 따라 이 과정을 계속해 나간다. 이 과정은 N명의 사람이 모두 제거될 때까지 계속된다. 원에서 사람들이 제거되는 순서를 (N, K)-요세푸스 순열이라고 한다. 예를 들어 (7, 3)-요세푸스 순열은 <3, 6, 2, 7, 5, 1, 4>이다.

N과 K가 주어지면 (N, K)-요세푸스 순열을 구하는 프로그램을 작성하시오.


[입력]

첫째 줄에 N과 K가 빈 칸을 사이에 두고 순서대로 주어진다. (1 ≤ K ≤ N ≤ 1,000)


[출력]

예제와 같이 요세푸스 순열을 출력한다.

 

예제 입력

 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream> 
#include <queue>
using namespace std;
 
int main()
{
    int N, K; //N명의 사람이 원으로 앉고, K번째 사람을 제거한다. 
    cin >> N >> K; //N과 K 입력  
    queue<int> q;  //앉아있는 사람들의 큐  
 
    for(int i=1; i <= N; i++){ //1~N을 순차적으로 입력 
        q.push(i);
    }
    
    cout << "<";
    
    while(!q.empty()){  //큐가 비어있지 않을때까지 반복(원에서 사람들이 제거될때까지 계속) 
        for(int i=1; i<=K-1; i++){  //front에서 K-1개만큼 back에 추가하고, front에서 빼면, 그것을 삭제한다. 
            q.push(q.front()); //front의 숫자를 back에 추가한다. 
            q.pop(); //추가된 숫자를 삭제한다. 
        }
        cout << q.front(); //K번째 숫자를 출력한다.
        q.pop(); //K번째 숫자를 삭제한다.
        
        if(!q.empty()){
            cout << ", "//큐가 비어있으면 출력X 
        }
    }
    
    cout<< ">" <<endl;
    
    return 0
}
cs

 

출처1: www.acmicpc.net/problem/11866

 

11866번: 요세푸스 문제 0

첫째 줄에 N과 K가 빈 칸을 사이에 두고 순서대로 주어진다. (1 ≤ K ≤ N ≤ 1,000)

www.acmicpc.net

 

[문제]

괄호 문자열(Parenthesis String, PS)은 두 개의 괄호 기호인 ‘(’ 와 ‘)’ 만으로 구성되어 있는 문자열이다. 그 중에서 괄호의 모양이 바르게 구성된 문자열을 올바른 괄호 문자열(Valid PS, VPS)이라고 부른다. 한 쌍의 괄호 기호로 된 “( )” 문자열은 기본 VPS 이라고 부른다. 만일 x 가 VPS 라면 이것을 하나의 괄호에 넣은 새로운 문자열 “(x)”도 VPS 가 된다. 그리고 두 VPS x 와 y를 접합(concatenation)시킨 새로운 문자열 xy도 VPS 가 된다. 예를 들어 “(())()”와 “((()))” 는 VPS 이지만 “(()(”, “(())()))” , 그리고 “(()” 는 모두 VPS 가 아닌 문자열이다.

여러분은 입력으로 주어진 괄호 문자열이 VPS 인지 아닌지를 판단해서 그 결과를 YES 와 NO 로 나타내어야 한다. 


[입력]

입력 데이터는 표준 입력을 사용한다. 입력은 T개의 테스트 데이터로 주어진다. 입력의 첫 번째 줄에는 입력 데이터의 수를 나타내는 정수 T가 주어진다. 각 테스트 데이터의 첫째 줄에는 괄호 문자열이 한 줄에 주어진다. 하나의 괄호 문자열의 길이는 2 이상 50 이하이다. 


[출력]

출력은 표준 출력을 사용한다. 만일 입력 괄호 문자열이 올바른 괄호 문자열(VPS)이면 “YES”, 아니면 “NO”를 한 줄에 하나씩 차례대로 출력해야 한다. 

 

백준에서 제시하는 입출력


 

전에 C언어로 풀었던 문제인데, 최근에 C++을 조금 건드리면서 이 문제를 C++로 스택을 활요하여 다시 풀어보게 되었다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <iostream>
#include <stack>
#include <string>
using namespace std;
 
int main()
{
    int num;  //총 반복횟수
    stack<char> st; //스택 생성
    string s; //괄호 문자들  
    
    cin >> num;  //총 반복횟수 입력
    
    for (int i = 0; i < num; i++){ //총 반복 횟수 
        
        cin >> s; //괄호 문자들 입력 
        
        for (int i = 0; i < s.length(); i++){ //괄호문자들의 갯수(=s.length)만큼 반복한다. 
            if(s[i] == '('|| st.empty()) {  //첫번째 괄호는 무조건 '('이어야 하기 때문에 '('를 if문의 첫번째로 한다  *Q.왜st.empty가 있어야할까? 
                st.push(s[i]);  //'('면 stack에 넣는다(=push한다.)
            } 
            else if(st.top() == '(' && s[i] == ')'){ //스택에 현재 '('가 있어야 하고, 그에 따라 ')'가 들어오면 짝을 이루기 때문에 스택에서 '('를 뺀다.
                st.pop();
            } 
        }
        
        if(st.empty()){
            cout << "YES" << endl//스택이 비어있으면 YES 
        } 
        else{
            cout << "NO" << endl;  //스택이 비어있지 않으면 NO 
        }
        
        while(!st.empty()){  //다음 반복문을 돌기 위해서 YES/NO 출력 후, 스택을 비운다. 
            st.pop();
        }
        
    }
    
    return 0
}
cs

 

 

다행히 작동을 잘 하였다!

 

출처1: www.acmicpc.net/problem/9012

 

9012번: 괄호

괄호 문자열(Parenthesis String, PS)은 두 개의 괄호 기호인 ‘(’ 와 ‘)’ 만으로 구성되어 있는 문자열이다. 그 중에서 괄호의 모양이 바르게 구성된 문자열을 올바른 괄호 문자열(Valid PS, VPS)이라고

www.acmicpc.net

 

+ Recent posts