티스토리 뷰

https://codeforces.com/contest/1634

 

Dashboard - Codeforces Round #770 (Div. 2) - Codeforces

 

codeforces.com

 

!!!! 모든 답은 제 풀이일 뿐 정해가 아닐 수 있습니다 !!!!

 

A. Reverse and Concatenate

https://codeforces.com/contest/1634/problem/A

 

Problem - A - Codeforces

 

codeforces.com

문제

 

string s와 integer k가 주어진다. 아래의 2가지중 하나를 k번 연산했을 때 나올 수 있는 string의 수를 출력하는 문제

1. s= s + rev(s)

2. s =rev(s) + s

 

풀이

 

주어진 문자가 팰린드롬이 되는 순간 더이상 종류는 증가할 수 없다. 처음부터 팰린드롬이면 답은 1, 이외에는 한번 연산을 하는 순간 모든 문자가 팰린드롬이 되기 때문에 답은 2가된다. k가 0이면 예외적으로 1 출력

 

 

코드

 

    #include <bits/stdc++.h>
    using namespace std;
    string s;
    int main() {
        ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
        int T;
        cin >> T;
        while (T--) {
            int n, k;
            cin >> n >> k;
            cin >> s;
            if (k == 0) {
                cout << 1 << '\n';
                continue;
            }
            bool flag = true;
            int n2 = n / 2;
            for (int i = 0; i < n2; i++) {
                if (s[i] != s[n - i - 1]) {
                    flag = false;
                    break;
                }
            }
            if (flag)cout << 1 << '\n';
            else cout << 2 << '\n';
        }
    }

 

 

B. Fortune Telling

https://codeforces.com/contest/1634/problem/B

 

Problem - B - Codeforces

 

codeforces.com

문제

 

n개의 수와 x,y가 주어진다. 엘리스는 x수로 시작하고 밥은 x+3으로 시작한다. 이후 n개의 수로 순차적으로 탐방하면서

1. x += a[i]

2. x ^= a[i]

를해서 엘리스나 밥중 y를 만들 수 있는 사람을 찾는 문제이다.

 

풀이

 

x와 x+3은 한 수는 짝수고 한 수는 홀수다. +연산과 xor연산은 둘다 첫번째 비트가 1이면 서로 홀수와 짝수 상태가 바뀐다. 홀수 or 짝수로 시작해서 홀수 짝수 상태가 몇번 바뀌는지 체크하고 y와 홀짝상태가 같은 사람을 출력하면 된다

 

코드

 

    #include <bits/stdc++.h>
    using namespace std;
    long long a[100001];
    int main() {
        ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
        int T;
        cin >> T;
        while (T--) {
            long long n, x, y;
            cin >> n >> x >> y;
            long long x2 = x + 3LL;
            int even = 0, odd = 0;
            for (int i = 0; i < n; i++) {
                cin >> a[i];
                if (a[i] % 2)odd++;
                else even++;
            }
            int now = x % 2;
            now += odd;
            if ((now % 2) == (y % 2))cout << "Alice\n";
            else cout << "Bob\n";
          
     
        }
    }

C. OKEA

https://codeforces.com/contest/1634/problem/C

 

Problem - C - Codeforces

 

codeforces.com

문제

 

n 과 k가 주어진다. 1 .. n*k 까지 수가 있는데 n개의 행에 k개를 나열해서 모든 n개 행의 l..r구간의 평균이 정수가 되도록 수를 나열하는 문제

 

풀이

 

n개의 행에 짝수만 따로 홀수만 따로 놓으면된다. 그럼 각 행마다 k개의 홀수나 짝수를 놓아야 하는데 홀수와 짝수의 개수는 각각 (n*k)/2개니까 이 수가 k로 나누어지는지 확인하면 된다. 나누어진다면 홀수끼리 짝수끼리 행애 배치해서 출력한다

 

코드

 

    #include <bits/stdc++.h>
    using namespace std;
    int ans[501][501];
    int main() {
        ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
        int T;
        cin >> T;
        while (T--) {
            int n, k;
            cin >> n >> k;
            if (k == 1) {
                cout << "YES\n";
                for (int i = 1; i <= n; i++)cout << i << '\n';
                continue;
            }
            if (n == 1) {
                cout << "NO\n";
                continue;
            }
            int nk = n * k;
            if (nk % 2) {
                cout << "NO\n";
                continue;
            }
            int nk2 = nk / 2;
            if (nk2 % k) {
                cout << "NO\n";
                continue;
            }
            int n2 = n / 2;
            int x = 1,y=1;
            for (int i = 1; i <= nk; i += 2) {
                ans[x][y] = i;
                x++;
                if (x > n2) {
                    x = 1; y++;
                }
            }
            x = n2 + 1; y = 1;
            for (int i = 2; i <= nk; i += 2) {
                ans[x][y] = i;
                x++;
                if (x > n) {
                    x = n2 + 1; y++;
                }
            }
            cout << "YES\n";
            for (int i = 1; i <= n; i++) {
                for (int j = 1; j <= k; j++) {
                    cout << ans[i][j] << ' ';
                }
                cout << '\n';
            }
        }
    }

 

 

자세한 설명에 중점을 두기보다는 대회 기록에 중점을 둔 글입니다 !

틀린 부분은 감사히 지적받겠습니다.