[문제]

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

 

[문제]

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

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

 

[문제]

예제를 보고 규칙을 유추한 뒤에 별을 찍어 보세요.


[입력]

첫째 줄에 N(1 ≤ N ≤ 100)이 주어진다.


[출력] 

첫째 줄부터 2×N-1번째 줄까지 차례대로 별을 출력한다.

 

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

 

 


 

사실 이 문제는 상당히 헤맸다..

특히 어려웠던 부분은 for의 초기화식이다. 

for (k = 2 * num - 2 * i - 1; k > 0; k--)  << 이 부분을 찾아내는 것이 특히 어려웠다

그래도 for문을 잘 이해를 하고,

각 라인에 얼마만큼의 숫자나 공백이 어떠한 조건을 통해서 얼마만큼이 출력되어야 하는지를 고민하다보면 결국 답이 나온다.

 

여기에서의 간단한 팁은 아마 for문을 2개로 나눠서 각각 피라미드와 역피라미드가 출력되도록 해야 한다는 것이다.

 

이렇게 뿐만 아니라, 다양한 방법의 코드가 작성될 수 있다.

 

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

[문제]

John got a bad mark in math. The teacher gave him another task. John is to write a program which computes the sum of integers from 1 to n. If he manages to present a correct program, the bad mark will be cancelled.

Write a program which:

  • reads the number n from the standard input,
  • computes the sum of integers from 1 to n,
  • writes the answer to the standard output.

[입력]

The first and only line of the standard input contains one integer n (1 ≤ n ≤ 10 000).


[출력] 

One integer is to be written to the standard output. This integer should be the sum of integers from 1 to n.


다시 말해,  n을 입력받았을 때, n까지의 합을 구하는 프로그램을 작성하는 것.

for문을 통해서 다음과 같이 간단히 작성할 수 있다.

 


 

[코드 작성]

처음에 틀렸었는데, 이유는 sum의 초기화가 이루어지지 않았기 때문.. 꼭 초기화를 할 수 있도록 하자

 

출처: Contest > Algorithmic Engagements > PA 2006 0-1번
출처: https://www.acmicpc.net/problem/1016

+ Recent posts