[알고리즘] 백준 10818, 2953, 1158

은개·2025년 2월 28일

[CS] 알고리즘

목록 보기
4/21

백준 10818 - 최소, 최대

정답

#include <iostream>
#include <sstream>
#include <vector>
#include <algorithm>
#include <iterator>

using namespace std;

int main() {
    int N;
    cin >> N;
    
    vector<int> numbers(istream_iterator<int>(cin), {});

    
    sort(numbers.begin(), numbers.end());
    
    cout << numbers[0] << " " << numbers[N - 1];
}


백준 2953 - 나는 요리사다

정답

#include <iostream>
#include <sstream>
#include <iterator>
#include <algorithm>
#include <vector>

using namespace std;

int main() {
    const int MAX_ROW = 5;
    const int MAX_COL = 4;
    int winner = 0;
    int score = 0;
    vector<vector<int>> participant(MAX_ROW, vector<int>(MAX_COL, 0));
    
    for (int i = 0; i < MAX_ROW; i++) {
        for (int j = 0; j < MAX_COL; j++) {
            cin >> participant[i][j];
        }
    }
    
    for (int i = 0; i < MAX_ROW; i++) {
        int tmp = 0;
        
        for (int j = 0; j < MAX_COL; j++) {
            tmp += participant[i][j];
        }
        
        if (tmp >= score) {
            winner = i;
            score = tmp;
        }
    }
    
    cout << winner + 1 << " " << score;
}


백준 1158 - 요세푸스 문제

오답

#include <iostream>
#include <sstream>
#include <iterator>
#include <algorithm>
#include <vector>

using namespace std;

int main() {
    int N, K;
    cin >> N >> K;

    vector<int> human;
    for (int i = 1; i <= N; i++) {
        human.push_back(i);
    }
    
    cout << "<";
    for (int i = K - 1; N > 1; i+= K) {
        i %= human.size();
        cout << human[i] << ", ";
        
        N--;
    }
        cout << ">";
}

💭 풀이
1. i = K - 1번째부터 K만큼 건너뜀
2. 해당 i의 원소를 출력

💥 문제점

  • 그냥 K - 1번째부터 K만큼 건너뛰어서 출력하면 될 줄 알았는데 배열 전체를 그대로 순회하니까 이미 출력한 원소는 건너뛰어야 하는데 다 포함해버려서 이상하게 나옴
  • <, ,, > 이것까지 출력 해야하는데 빼먹었었음

정답 (교재 및 GPT 참고)

#include <iostream>
#include <sstream>
#include <iterator>
#include <algorithm>
#include <vector>
#include <list>

using namespace std;

int main() {
    int N, K;
    cin >> N >> K;

    list<int> people;
    for (int i = 1; i <= N; i++) {
        people.push_back(i);
    }
    
    auto it = people.begin();
    cout << "<";
    
    while(!people.empty()) {
        // K - 1번 이동 (K번째 원소를 삭제하기 위해)
        for (int i = 1; i < K; i++) {
            it++;
            if (it == people.end()) { // 끝에 도달하면 처음으로 이동
                it = people.begin();
            }
        }
        
        cout << *it;
        // 현재 위치의 원소 제거
        it = people.erase(it); // erase()는 삭제 후 다음 원소를 가리킴
        
        if (!people.emtpy()) {
            cout << ", ";
        }
        
        if (it == people.end()) { // 삭제 후 end()이면 다시 처음으로
            it = people.begin();
        }
    }
    cout << ">";
    
    return 0;
}

💭 풀이
list를 사용하여 1 ~ N까지 사람 저장
iterator를 활용하여 순회하면서 K번째 원소를 erase()로 제거
원형 구조를 유지하기 위해 ++it(iterator, next라고 보면 될 듯)를 활용하여 end()이면 begin()으로 순환

0개의 댓글