본문 바로가기
PS/코드포스

Codeforces Round #642 (Div. 3)

by 방준이 2020. 5. 15.
반응형

 

생전 태어나서 처음으로 코드포스 콘테스트에 참여해보았다. 

친구들과 밥을 먹고나서 웹툰을 좀 보면서 쉬려고 하다가 전에 신청해놓은 코드포스가 언제였는지 보려고 사이트에 들어갔다가 대회가 시작 한지 15분 정도 지나있다는 것을 알게 되었다... 하.. 쉴지 말지를  한참 고민을 하던 중에 그래 한번 보자!! 해서  콘테스트를 치르게 되었다

물론 보던 웹툰은 다보고 나서   하지만 결과는 크음 .....

처음인 만큼 결과는 아주 참담했다 .....ㅠㅠㅠㅠ   아니 ? 처음 이여도 잘하는 사람은 많겠지 ... 

결과는  6문제 중 2문제를 풀었다...

 

 

밑에 사진은 내가 코드를 제출한 이력이다..

 

 

이 두 문제는 각 10분씩 투자해서 풀 수 있었다..  오?! 할 만 한데?라고 생각이 들었지만 이는 뒤로 갈수록 아니었다..

나의 실력이 이 정도밖에 안 되는구나..라는 것을 느낄 수 있었다.. 

백준 온라인 저지에서 많은 문제들을 풀어 봤지만 이는 또 다른 세상인 것 같다. 이런  TMI는 뒤로 하고...

 

 

내가 풀었던 것들을 정리해보자!!!

 

[ A. Most Unstable Array ]

 

테스트 케이스가 주어지고 각 테스트 케이스마다  배열의 길이 n과 배열의 각 원소의 합 m 주어 진다.

출력으로는 각 테스트 케이스 마다 다음의 가능 한 값 중 가장 큰 값을 출력하는 것이 문제이다

 

 

문제 설명 하단 Note 부분을 보면 문제를 빠르게 이해할 수 있을 것이다.

주어진 배열의 길이가 

n = 1  이라면 원소는 하나가 되므로 m 이 어떤 값이 와도 정답은  0이 된다.

n = 2  이라면 주어진 조건을 만족하는 배열은 [m, 0] 이므로 정답은 m 이 될 것이다.

n >= 3 이라면 예를 들어 n = 5, m = 5 [0,2,0,3,0]  자연수인 원소 사이에 0을 배치하게 되면 

각 각의 원소는 2번씩 더해지게 되므로 최종적으로 2 * m 인 값이 나오게 된다.

 

 

[ 소스 코드]

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
using namespace std;
int t, n, m;
int main() {
    cin >> t;
    while (t--) {
        cin >> n >> m;
        if (n == 1cout << 0 << '\n';
        else if (n == 2cout << m << '\n';
        else cout << m * 2 << '\n';
    }
    return 0;
}
cs

 

 

 

[ B. Two Arrays And Swaps ]

 

문제를 설명해 보자면 각 각의 테스트 케이스마다 배열의 길이 n , 연산을 수행할 수 있는 횟수 k 가 주어지고

A배열의 원소들 n 개와 B배열의 원소들 n 개가 입력으로 주어진다  최대 K번 A의 원소와 B의 원소를 swap 할 수 있다. 

출력으로는  A원소의 합 중 가능 한 가장 큰 값을 출력하는 것이다.  문제를 풀던 와중에 

if you can do no more than (i.e. at most) k such moves (swaps).라는 부분을 제대로 해석을 못하고 넘어가

무조건 k번 연산을 수행해야 하는 줄 알고 풀었다. 풀고 나서 테스트 케이스 출력이 다르게 나와 문제를 다시 한번 읽던 도중에 빠진 조건을 찾아 문제를 풀 수 있었다.

 

내가 생각한 문제의 풀이는 다음과 같다. 

일단은 최대 K번 교환이 가능하다는 말은 B의 원소중 가장 큰 원소 K개를  A의 원소로 가져올 수 있다는 것이다

그 수가 A의 있는 모든 원소보다 크거나 작은 말이다. 일단은 가져와서 A의 원소에서 정렬을 수행하면 된다.

 

즉 B의 원소들을 내림 차순으로 정렬을 하고 가장 큰 원소 K개를 A의 원소에 추가시킨다. 

그다음 A의 원소들(추가된 것 포함)을 다시 내림차순으로 정렬을 해 n 개의 원소를 차례로 더하면

문제에서 요구하는 가장 큰 값을 구 할 수 있다.

 

[ 소스 코드]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
typedef vector<int> vi;
int n, k, t;
bool cmp(int a, int b) {
    return a > b;
}
int main() {
    ios_base::sync_with_stdio(0), cin.tie(0);
    cin >> t;
    while (t--) {
        int ans = 0, cnt = 0;
        cin >> n >> k;
        vi a(n), b(n);
        for (int i = 0; i < n; i++cin >> a[i];
        for (int i = 0; i < n; i++cin >> b[i];
        sort(b.begin(), b.end(), cmp);
        for (int i = 0; i < k; i++) {
            a.push_back(b[i]);
        }
        sort(a.begin(), a.end(), cmp);
        for (int i = 0; i < n; i++) {
            ans += a[i];
        }
        cout << ans << '\n';
    }
    return 0;
}
cs

 

[대회가 끝나고 느낀점]

 

영어로 된 문제를 해석 하고 PS 를 한다는 것이 처음이라 그런지 조금은 어색 했지만 이번 문제들은 여럽지 않게 해석 할 수 있었다. 물론 파파고 번역기의 도움을 일부 받았다. 

나머지 못 푼 문제들도 해설을 보고 나서 내가 풀 수 있는 수준이라면   왜 못 풀었는지 무엇을 요구 하는 문제인지

정리해서 블로그에 꼭 올려야겠다..

주위에 사람들이랑 같이 하는 것이 아닌 혼자서 하는 것이라 뭔가 동기부여는 딱히 없고 잘하는 사람들은 진짜 많은 것 같다..

나는 아무 것도 아니구나.. 

그래도 졸업 하기전까진  블루 한번 찍어 보고 싶다라는 생각 밖에 안든다.. 이제 처음 코드 포스 대회를 치루었지만 너무 꿈이 큰 거 아닌가 싶다.  BOJ 에서 파란 색 ID 를 접할 때 제일 매력적으로 보였고 눈에 확 띄어서 좋았다.. 그게 이유다

확실히 BOJ 에서는 정해진 유형의 문제만 접하다가

내가 써야 할 큰 틀을 알고 푸는 것과 쌩판 모르는 문제를 푸는 것과는 큰 차이가 있구나 라는 것을 느꼇다. 

앞으로의 목표라고 한다면 시간이 되는 한 매 콘테스트마다 참여 해봐야 겠다

이제 자자..

반응형

'PS > 코드포스' 카테고리의 다른 글

Codeforces Round #650 (Div. 3)  (0) 2020.06.17
Codeforces Round #642 (Div. 3) [못푼 문제]  (0) 2020.05.18