[문제]

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

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

 

[문제]

Parenthesis String (PS) consists of two parenthesis symbols ‘(’ and ‘)’ only. In parenthesis strings, some strings are called a valid PS (shortly, VPS). Let us give the formal definition of VPS. A single “( )” is a member of VPS, called the base VPS. Let x and y be a member of VPS. Then “(x)”, a VPS which encloses a VPS x with a single pair of parenthesis, is also a member of VPS. And xy, the concatenation of two VPS x and y, is a member of VPS. For example, “(())()” and ((()))” are all VPS, but “(()(”, “(())()))” and “(()” are not VPS. You are given a set of PS. You should decide if the input string is VPS or not. 


[입력]

Your program is to read from standard input. The input consists of T test cases. The number of test cases T is given in the first line of the input. Then PS’s are given in the following T lines one by one. The length of each PS is between 2 and 50, inclusively.


[출력]

Your program is to write to standard output. Print the result in each line. If the input string is a VPS, then print “YES”. Otherwise print “NO”. 

 

백준에서 제시하는 입출력

 

 


몇 번이나 틀린 끝에 결국엔 성공한 코드.

중요한 부분은 char parenthesis[]의 방 크기를 50이 아닌 51(null문자까지 생각을 해야한다)로 하는 것이 좋다는 것.

 

또한, for문으로 for(int j=0; j<strlen(bracket); j++) 로 할 수도 있겠지만, 

while문으로  while(parenthesis[j]) 것이 더 좋을 수 있다는 것을 기억하자.

 

 

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

 

9012번: 괄호

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

www.acmicpc.net

출처2: ICPC > Regionals > Asia Pacific > Korea > Nationwide Internet Competition > Daejeon Nationalwide Internet Competition 2012 G번

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

[백준 6749번]Next in line  (0) 2021.03.17
[백준 2675번]문자열 반복  (0) 2021.03.16
[백준 2795번] Transactions  (0) 2020.09.05
[백준 2753번] 윤년  (0) 2020.09.05
[백준 2752번] 세 수 정렬  (0) 2020.09.05

[문제]

Whenever somebody goes to an ATM to withdraw or deposit money, a calculation has to be done to keep the person's bank balance correct. Your task in this problem is to do such calculations. There is a bank rule that says that a customer may not have an overdraft of more than $200, so any withdrawal that would take the balance below –200 must be stopped. (A minus sign is used to indicate an overdraft, or negative balance).


[입력]

Input consists of a number of lines, each representing a transaction. Each transaction consists of an integer representing the starting balance (between –200 and +10,000), the letter W or the letter D (Withdrawal or Deposit), followed by a second integer representing the amount to be withdrawn or deposited (between 5 and 400). Input will be terminated by a line containing 0 W 0.


[출력]

Output consists of one line for each line of input showing the new balance for each valid transaction If a withdrawal would take the balance below -200, the output must be the words ‘Not allowed’.

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

 


영어로 되어있어서 그렇지 문제 자체는 쉽다.

ATM기계에서 돈을 빼고 넣는 결과를 출력하는 문제이다.

시작값, W / D, 바뀔값, 결과값을 변수로 잡으면 될 것이다.

 

문제를 간단히 하면 다음과 같다. 

1. 0 W 0 이라는 값이 들어가면 프로그램이 종료되도록 한다.

2. W가 입력되면 시작값 - 바뀔값 = 결과값

3. D가 입력되면 시작값 + 바뀔값 = 결과값

4. 결과값이 -200보다 작을 경우, "Not allowed"라 출력되도록 한다.

 

 

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

 

[문제]

연도가 주어졌을 때, 윤년이면 1, 아니면 0을 출력하는 프로그램을 작성하시오.

윤년은 연도가 4의 배수이면서, 100의 배수가 아닐 때 또는 400의 배수일 때이다.

예를 들어, 2012년은 4의 배수이면서 100의 배수가 아니라서 윤년이다. 1900년은 100의 배수이고 400의 배수는 아니기 때문에 윤년이 아니다. 하지만, 2000년은 400의 배수이기 때문에 윤년이다.


[입력]

첫째 줄에 연도가 주어진다. 연도는 1보다 크거나 같고, 4000보다 작거나 같은 자연수이다.


[출력]

첫째 줄에 윤년이면 1, 아니면 0을 출력한다.

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

 


최대한 짧게 코딩을 해보기 위해서 이번에는 노력했다.

원래라면 if문 안에서 &&와 ||를 if중춥문을 사용해서 일일이 했을 것이나,

이렇게 if문 한 개를 사용해서 만드는 것 또한 가능하다는 것을 알아두자.

 

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

[문제]

동규는 세수를 하다가 정렬이 하고싶어졌다.

숫자 세 개를 생각한 뒤에, 이를 오름차순으로 정렬하고 싶어 졌다.

숫자 세 개가 주어졌을 때, 가장 작은 수, 그 다음 수, 가장 큰 수를 출력하는 프로그램을 작성하시오.


[입력]

숫자 세 개가 주어진다. 이 숫자는 1보다 크거나 같고, 1,000,000보다 작거나 같다. 이 숫자는 모두 다르다.


[출력]

제일 작은 수, 그 다음 수, 제일 큰 수를 차례대로 출력한다.

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

 


약간의 노가다와 시간이 오래 걸린다는 점이 있지만, 논리는 일단 맞다.

a, b, c가 각각 큰 경우에 따라서 나와야 하는 숫자의 정렬을 각각 출력하며,

a=b=c가 될 경우는 따로 else문으로 처리하였다.

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

참고로 Virtualbox에 ubuntu를 설치하였다.

 

Ubuntu를 처음 사용해보면서 조금이라도 익숙해지기 위해서 거의 이틀의 시간 동안 구글링을 하면서 우분투를 만졌다.

우분투로 c언어를 공부할 수 있는 방법도 찾아봤는데, 우선 가장 문제였던 것은 실습환경 및 c언어 환경 만들기였다.

분명 나중에 다시 까먹을 것 같아서 여기에 최소한 내가 어렵게 어렵게 검색하고 찾아낸 몇 가지의 부분들을 기록해둔다 (그래야 나도 나중에 다시 여기 와서 찾을 수 있을 것 같다).

 

1. Vim 설치

text editor 중에 손에 꼽히는 프로그램으로 vim부터 먼저 설치한다.

방법은 다음과 같다

1) 터미널 열기

2) sudo apt-get update 를 입력

   --> [sudo] ~~ 의 암호: 라고 뜬다 --> 비밀번호 입력!

아무리 비밀번호는 쳐도 움직이지 않고 보이지도 않을 것이다. 무시하고 비밀번호를 치고 enter를 누르면 정상 작동할 것이다.

3) sudo apt-get install vim 를 입력

 --> [sudo] ~~의 암호: 라고 뜬다 --> 비밀번호 입력!

 --> vim이 설치될 것이다.

 

 


 

 

2. C언어 공부를 위해 .vimrc를 통해 파일을 생성하고 설정 만들기

출처: https://hyoje420.tistory.com/51
 

[Vim]vim 설정하기

 리눅스에는 터미널환경에서 사용가능한 다양한 텍스트 편집기가 있다. 그 중 대표적인 편집기로 vim이 있다. vim은 vi의 클론으로 vi의 기본적인 명령어를 그대로 계승하고, 거기에 사용자가 더 �

hyoje420.tistory.com

이 사이트를 들어가면 굉장히 자세히 친절하게 설명이 되어있다! 들어가서 보도록 하자.

 

 


 

 

3. Ubuntu 해상도 설정

1) 사진과 같이 오른쪽 위에 아래로 향하는 화살표를 눌러서 톱니바퀴의 설정을 누른다.

Ubuntu 해상도 설정하기 1단계

2) 설정을 누르면 설정창이 뜨고, 목록에서 "디스플레이"를 누르면 "해상도"라는 창이 뜬다. 그러면 해상도의 종류를 고를 수 있다. 

Ubuntu 해상도 설정하기 2단계-1
Ubuntu 해상도 설정하기 2단계-2 _ 해상도를 고르고 오른쪽 위에 적용버튼을 누른다.
Ubuntu 해상도 설정하기 2단계-3 _ 변경사항을 유지할지 말지 결정하고 누른다.

※만약 원하는 해상도가 없다면, https://www.tecmint.com/set-display-screen-resolution-in-ubuntu/를 확인하는 것도 좋다. 직접 terminal에 몇 가지 코드를 입력해서 원하는 해상도를 설정할 수 있다. ("How to Add Missing or Set Custom Display Resolution Using xrandr" 부분을 확인하면 된다).

 

How to Set A Custom Screen Resolution in Ubuntu Desktop

Is your screen (or external monitor) resolution is low? thus making the items on your screen look larger and less clear? Or do you want to simply increase the current maximum resolution or add a custom resolution? In this article, we will show how to add m

www.tecmint.com


 

 

4. 복사 붙여넣기(Copy & Paste) 기능

Ubuntu의 버전에 따라서, 그리고 사용하는 VM(가상머신 _ 예를 들어 VMWare나 Virtualbox)에 따라서 다를 수 있으나,

지금부터 설명할 부분은 Ubuntu 20.04 + Virtualbox 에 대한 부분임을 명심하고 봤으면 한다.

여기서 말하는 copy & paste기능은 Host와 Guest 간의 복붙을 뜻한다. 

이런식으로 호스트에서 게스트(우분투)로 copy&paste를 가능하게 하고 싶은 것이다!!!

 

방법은 다음과 같다: 

1) Virtualbox의 설정-일반-고급-클립보드공유&드래그 앤 드롭을 "양방향"으로 설정한다.

2) 장치 - 게스트확장을 시킨다.

3) virtualbox-guest-x11 패키지를 설치한다.

Ubuntu 복사 붙여넣기(Copy & Paste) 기능 1단계_virtualbox에서 설정을 누른다
Ubuntu 복사 붙여넣기(Copy & Paste) 기능 1단계-1_설정-일반-고급-클립보드공유&드래그 앤 드롭을 "양방향"으로 설정하기

 

Ubuntu 복사 붙여넣기(Copy & Paste) 기능 2단계 - 게스트 확장시키기


여기 까지라면 복붙이 되는 경우도 있고, 안 되는 경우도 있을 것이다.

만약, 작동을 하지 않는다면!

virtualbox-guest-x11 패키지가 설치가 되지 않아서다.

따라서 다음을 터미널에 입력을 시키면 된다.

sudo apt-get update
sudo apt-get install virtualbox-guest-x11

이 부분에 대해서는 링크를 통해 확인이 가능하다

(https://superuser.com/questions/1318231/why-doesnt-clipboard-sharing-work-with-ubuntu-18-04-lts-inside-virtualbox-5-1-2)

 

Why doesn't clipboard sharing work with Ubuntu 18.04 LTS inside VirtualBox 5.1.26?

I installed Ubuntu 18.04 LTS inside VirtualBox 5.1.26. I installed guest additions, enabled clipboard sharing and rebooted the guest VM. However, clipboard sharing doesn't work. How can it be fixed?

superuser.com

2444번_별찍기-7(피라미드데칼코마니)

2444번_별찍기-7(피라미드데칼코마니)


 

2445번_별찍기_8(나비모양)

2445번_별찍기_8(나비모양)


 

2446번_별찍기_9(모래시계)

2446번_별찍기_9(모래시계)

 

 

 

출처: https://www.acmicpc.net/workbook/view/20 백준 문제집: 별 찍기 中

 

2438번_별찍기_1(피라미드오른쪽)

2438번_별찍기_1(피라미드오른쪽)

 


 

2439번_별찍기_2(피라미드왼쪽)

2439번_별찍기_2(피라미드왼쪽)

 


 

2440번_별찍기_3(5-4-3-2-1)

2440번_별찍기_3(5-4-3-2-1)

 


 

2441번_별찍기_4(역순_5-4-3-2-1)

2441번_별찍기_4(역순_5-4-3-2-1)


 

2442번_별찍기_5(피라미드)

2442번_별찍기_5(피라미드)


 

2443번_별찍기_6(역피라미드)

2443번_별찍기_6(역피라미드)

 

 

 

출처: https://www.acmicpc.net/workbook/view/20 백준 문제집: 별 찍기 中

[문제]

세 정수 A, B, C가 주어진다. 이때, 두 번째로 큰 정수를 출력하는 프로그램을 작성하시오. 


[입력]

첫째 줄에 세 정수 A, B, C가 공백으로 구분되어 주어진다. (1 ≤ A, B, C ≤ 100)


[출력]

두 번째로 큰 정수를 출력한다.

 

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


내가 푼 방식은 다음과 같이 각각의 숫자가 최댓값일 때로 나눠서 총 3가지의 경우의 수로 if~else문을 만들었다.

 

조금 노가다의 향이 나기는 한다...

 

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

+ Recent posts