본문 바로가기
C++/Baekjoon

[BOJ] 2022 SISS 1학기 스터디 - 4주차

by 단월໒꒱ 2022. 5. 8.

#2164 : 카드2 (Class 2 Silver 4)

 

[문제]

 

 

 

[코드 및 결과]

 

 

#include <iostream>
#include <queue>

using namespace std;

int main() {
    int N, temp;
    queue<int> Q;
    
    cin >> N;
    
    for (int i = 1; i <= N; i++) {
        Q.push(i);
    }
    
    while (Q.size() > 1) {
        Q.pop();
        
        temp = Q.front();
        Q.push(temp);
        
        Q.pop();
    }
    
    cout << Q.front() << "\n";
    
    return 0;
}

 

 

 

 

 

 

[설명]

이 문제를 풀기 위해 queue stl을 사용하였다.

카드의 장수인 N을 입력받고, 반복문을 사용하여 1부터 N까지의 숫자를 큐에 저장해준다.

큐에 1개만 남을 때까지 while문을 사용하여 반복해주는데, 이를 판단할 때 size 함수를 이용한다.

pop으로 가장 앞에 있는 수를 없애고, temp에 가장 앞에 있는 수를 저장한 뒤 이를 큐 맨 뒤에 push 해준다.

그리고 맨 앞에 있는 수를 pop해서 제거해준다.

이런 과정을 반복하여 마지막에 남은 수가 곧 큐의 첫번째 수이므로 front로 가져와서 출력해준다.

 

 

 

#11866 : 요세푸스 문제 0 (Class 2 Silver 4)

 

[문제]

 

 

[코드 및 결과]

 

 

#include <iostream>
#include <list>

using namespace std;

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    
    int N, K;
    list<int> L;
    
    cin >> N >> K;
    
    for (int i = 1; i <= N; i++) {
        L.push_back(i);
    }
    
    cout << "<";
    
    list<int>:: iterator idx;
    idx = L.begin();
    
    while (L.size() > 1) {
        for (int i = 1; i < K; i++) {
            idx++;
            
            if (idx == L.end())
                idx = L.begin();
        }
        
        cout << *idx << ", ";
        
        idx = L.erase(idx);
        
        if (idx == L.end())
            idx = L.begin();
    }
    
    cout << *idx << ">\n";
    
    return 0;
}

 

 

 

 

 

 

[설명]

이 문제를 풀기 위해 list stl을 사용하였다.

main 함수의 첫 3줄은 입력과 출력을 빠르게 하기 위해서 추가한 코드이다.

입력받은 수 N만큼 반복문으로 리스트에 1부터 N까지 수를 저장해준다.

idx를 선언하고 여기에 리스트 맨 앞의 수를 저장하여 첫번째 포인터로 사용하기로 한다.

위의 문제와 마찬가지로 while문으로 리스트에 1개의 수만 남을 때까지 반복하도록 한다.

반복문으로 1부터 K까지 반복하도록 하여 숫자를 세주고, idx가 리스트 맨 끝으로 갈 경우에는 처음으로 다시 돌아가도록 지정해준다.

K번 반복이 끝나면 idx를 출력해주고 현재 저장되어 있는 idx를 삭제한 뒤에 idx에 그 다음수를 저장해준다.

이런식으로 하면 계속 리스트를 돌면서 입력받은 수 K만큼 지나갈 때마다 해당 수를 없애고 마지막에 남은 수를 출력해준다.

 

 

 

#2559 : 수열 (자유 Silver 3)

 

[문제]

 

 

 

 

[코드 및 결과]

 

 

#include <iostream>
#include <algorithm>

using namespace std;

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    
    int N, K, tmp[100001];
    
    cin >> N >> K;
    
    for (int i = 0; i < N; i++) {
        cin >> tmp[i];
    }
    
    long long sum = 0;
    long long result = -10000000;
    int idx = 0;
    
    for (int i = 0; i < N; i++) {
        sum += tmp[i];
        
        if (i >= K-1) {
            result = max(result, sum);
            sum -= tmp[idx++];
        }
    }
    
    cout << result << "\n";
    
    return 0;
}

 

 

 

 

 

[설명]

온도를 측정하는 날짜 수 N, 연속적인 날짜의 수 K를 입력 받는다.

반복문으로 N만큼 수를 입력받아 각 날짜의 온도 N개를 배열에 저장해준다.

sum과 result는 수가 커질 수도 있으니 long long형으로 선언해주었고, 필요한 값으로 초기화시킨다.

반복문을 써서, sum에 tmp 배열에 저장된 온도값들을 더해주는데, i가 K-1 보다 크거나 같아질 경우에는 K만큼 확인 한 경우이므로, 여태까지 더해서 나온 sum과 result 값을 비교하여 큰 값을 result에 저장해주고, sum에서 tmp[idx++]를 빼준다.

이는 K개의 온도들 중에 제일 앞에 있는 수를 빼주는 과정이다.

이렇게 하여 저장된 리스트를 K개씩 확인한 후에 최종적으로 나온 result 값을 출력해준다.

 

채점하면 계속 틀렸다고 하는데 예제에 있는 것들에 대해서는 잘만 결과값이 나와서 애 좀 먹었던 문제이다.

최솟값에 대한 처리 과정을 조금 바꿔주고 입출력을 빠르게 처리하도록 해주었더니 해결되었다.

 

 

 

댓글