BOJ 1213번 팰린드롬 만들기 문제

코드에 주석을 달았다. 홀수번 등장하는 알파벳이 두 개 이상이면 팰린드롬을 만들 수 없다.

1213.cpp

#include <bits/stdc++.h>
#define ALPHABET 26
using namespace std;
int alphabet[ALPHABET];
string result;
int main() {
    string input;
    cin >> input;
    int input_size = input.size();
    for (int i = 0; i < input_size; i++) {
        alphabet[input[i] - 'A']++;
    }
    int odd_index, odd;
    odd_index = -1;
    odd = 0;
    for (int i = 0; i < ALPHABET; i++) {
        if (alphabet[i] % 2 == 1) {
            odd++;
            odd_index = i;
        }
    }
    // 홀수번 등장한 알파벳이 2개 이상이면 만들 수 없다.
    if (odd > 1) {
        result = "I\'m Sorry Hansoo";
    }
    // 홀수번 등장한 알파벳이 1번이면 
    // AAABBBA -> AABBBAA
    else if (odd == 1) {
        char odd_char = odd_index + 'A';
        // temp : 홀수번 등장한 알파벳을 제외한 string 저장.
        // AAABBBA -> AAABBA, odd_char = 'B'
        string temp = "";
        bool do_once = true;
        for (int i = 0; i < input_size; i++) {
            if (do_once && input[i] == odd_char) {
                do_once = false;
                continue;
            }
            temp += input[i];
        }
        // temp = AAAABB
        // half = AAB
        sort(temp.begin(), temp.end());
        string half = "";
        int temp_size = temp.size();
        for (int i = 0; i < temp_size; i += 2) {
            half += temp[i];
        }
        result = half + odd_char;
        // half = BAA
        reverse(half.begin(), half.end());
        result += half;
    }
    // 모두 짝수번 등장. 
    // ABAABA -> AABBAA
    else {
        sort(input.begin(), input.end());
        string half = "";
        for (int i = 0; i < input_size; i += 2) {
            half += input[i];
        }
        result += half;
        reverse(half.begin(), half.end());
        result += half;
    }
    cout << result;
}

BOJ 1072번 게임 문제

이분탐색으로 풀면 된다. 99%일때 예외 경우를 따로 해줘야한다. 1패라도 있으면 승률이 100%가 될 수 없다.

1072.cpp

#include <bits/stdc++.h>
#define MAX_ 1000000000
using namespace std;
typedef long long ll;
int main() {
    ll x, y, z, low, high, mid, test_z;
    cin >> x >> y;
    z = 100 * y / x;
    if (z >= 99) {
        cout << -1;
        return 0;
    }

    low = 0;
    high = MAX_;

    while (low <= high) {
        mid = (low + high) / 2;
        test_z = 100 * (y + mid) / (x + mid);
        if (z < test_z) {
            high = mid - 1;
        } else {
            low = mid + 1;
        }
    }
    cout << low;
}

BOJ 2872번 우리집엔 도서관이 있어 문제

우리 학교, hi-arc 학회 갓 연두님의 꿀잼꿀문으로 추천받아서 풀었다.

제자리에 없으면 답을 1씩 증가시킨다. 제자리에 있으면 check 값을 1씩 줄여가며 비교한다.

2872.cpp

#include <bits/stdc++.h>
using namespace std;
int book[300001];
int main() {
    int n;
    cin >> n;
    for (int i = 0; i < n; i++){
        cin >> book[i];
    }
    int checkingNum = n;
    int ans = 0;
    for (int i = n - 1; i >= 0; i--) {
        if (book[i] == checkingNum) {
            checkingNum--;
        }
        else{
            ans++;
        }
    }
    cout << ans;
    return 0;
}

BOJ 2752번 세수정렬 문제

sort 쓰면 쉽게 풀 수 있다.

2752.cpp

#include <bits/stdc++.h>
using namespace std;

int arr[3];

int main() {
    int input;
    for (int i = 0; i < 3; i++) {
        cin >> input;
        arr[i] = input;
    }
    sort(arr, arr + 3);
    for (int i = 0; i < 3; i++)
        cout << arr[i] << ' ';
}

BOJ 2864번 5와 6의 차이 문제

5는 모두 6으로 바꿨을때, 6은 모두 5로 바꿨을때를 만들어서 합을 출력하면 된다.

2864.cpp

#include <bits/stdc++.h>
using namespace std;

int main() {
    string s1, s2;
    cin >> s1 >> s2;
    int s1_size = s1.size();
    int s2_size = s2.size();

    for (int i = 0; i < s1_size; i++) {
        if (s1[i] == '6') s1[i] = '5';
    }
    for (int i = 0; i < s2_size; i++) {
        if (s2[i] == '6') s2[i] = '5';
    }
    cout << stoi(s1) + stoi(s2) << ' ';

    for (int i = 0; i < s1_size; i++) {
        if (s1[i] == '5') s1[i] = '6';
    }
    for (int i = 0; i < s2_size; i++) {
        if (s2[i] == '5') s2[i] = '6';
    }
    cout << stoi(s1) + stoi(s2);
}

BOJ 3052번 나머지 문제

나머지를 체크하는 bool 배열[42]을 만들어서 true의 개수를 센다.

3052.cpp

#include <bits/stdc++.h>
using namespace std;

bool check[42];

int main() {
    int n = 10;
    while (n--) {
        int input;
        cin >> input;
        check[input % 42] = true;
    }
    int result = 0;
    for (int i = 0; i < 42; i++) {
        if (check[i]) {
            result++;
        }
    }
    cout << result;
}

BOJ 9085번 더하기 문제

그냥 n개를 덧셈을 해서 출력하면 된다.

9085.cpp

#include <bits/stdc++.h>
using namespace std;

void solve() {
    int n;
    int result = 0;
    cin >> n;
    while (n--) {
        int plus;
        cin >> plus;
        result += plus;
    }
    cout << result << '\n';
}

int main() {
    int t;
    cin >> t;
    while (t--) {
        solve();
    }
}

+ Recent posts