알고리즘 문제/2024 AOC

[2024 AOC] 2일차 CPP

odaebum 2024. 12. 3. 01:03
728x90

https://adventofcode.com/2024

 

Advent of Code 2024

 

adventofcode.com

 

문제 1번 풀이

#include <iostream>
#include <vector>
#include <string>
using namespace std;

const int INPUT_MAX = 1000;
const int DIFF_LEVEL = 3;

bool sol(vector<int> v){
    bool increase = true;
    for(int i = 0; i < v.size()-1; i++){
        if(abs(v[i] - v[i+1]) > DIFF_LEVEL) return false;
        if(v[i] == v[i+1]) return false;
        
        if(i == 0){
            increase = v[i] < v[i+1];
        }
        else{
            if(increase){
                if(v[i] >= v[i+1]) return false;
            }
            else{
                if(v[i] <= v[i+1]) return false;
            }
        }
    }
    
    return true;
}

int main(){
    vector<int> levels;
    string str;

    int answer = 0;
    
    for(int i = 0; i < INPUT_MAX; i++){
        getline(cin, str);
        levels.clear();

        string tmp = "";
        for(int i = 0; i < str.length(); i++){
            char c = str[i];
            if(c == ' '){
                levels.push_back(stoi(tmp));
                tmp = "";
            }
            else{
                tmp += c;
            }
        }
        levels.push_back(stoi(tmp));

        bool res = sol(levels);
        if(res){
            answer++;
        } 
        
    }

    cout << answer << endl;

    return 0;
}

 

 

문제 2번 풀이

#include <iostream>
#include <vector>
#include <string>
using namespace std;

const int INPUT_MAX = 1000;
const int DIFF_LEVEL = 3;

bool sol(vector<int> v){
    bool increase = true;
    for(int i = 0; i < v.size()-1; i++){
        if(abs(v[i] - v[i+1]) > DIFF_LEVEL) return false;
        if(v[i] == v[i+1]) return false;
        
        if(i == 0){
            increase = v[i] < v[i+1];
        }
        else{
            if(increase){
                if(v[i] >= v[i+1]) return false;
            }
            else{
                if(v[i] <= v[i+1]) return false;
            }
        }
    }
    
    return true;
}

bool process(vector<int> v){
    for(int i = 0; i < v.size(); i++){
        vector<int> tmp = v;
        tmp.erase(tmp.begin()+i);
        if(sol(tmp)) return true;
    }

    return false;
}

int main(){
    vector<int> levels;
    string str;

    int answer = 0;
    
    for(int i = 0; i < INPUT_MAX; i++){
        getline(cin, str);
        levels.clear();

        string tmp = "";
        for(int i = 0; i < str.length(); i++){
            char c = str[i];
            if(c == ' '){
                levels.push_back(stoi(tmp));
                tmp = "";
            }
            else{
                tmp += c;
            }
        }
        levels.push_back(stoi(tmp));

        bool res = process(levels);
        if(res){
            answer++;
        } 
        
    }

    cout << answer << endl;

    return 0;
}

문제 풀이 1번에 현재 가지고 있는 숫자 중에서 1개를 제외했을 때 Safe한 것이 있으면 return true;

728x90