알고리즘

Codeforces Round #742 복기

spideyDev 2021. 9. 7. 20:50

라운드가 4~5일 정도 없다가 오랜만에 진행한 코드포스 라운드, 라운드가 없는동안 알고리즘에 소흘하기도 했다가 당일에서야 라운드가 있는걸 알고 2시간 정도 전에 등록했었다.

컨디션도 안좋고 피곤한 상태라 라운드를 안하는게 맞았지만 두 문제정도 풀 생각으로 참여했었다.

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

 

Problem - A - Codeforces

 

codeforces.com

문제 A는 시간복잡도 O(N)으로 L, R이 입력되면 그대로 출력, U나 D가 입력되면 반대로 출력하면 되는 문제. 풀어본 Div 2 문제 중에서 가장 쉬웠던거 같다.

 

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

 

Problem - B - Codeforces

 

codeforces.com

 문제 B는 입력값 a, b에 대해서 정수 배열의 MEX 값이 a이고 배열내의 모든 값을 XOR 계산한 결과가 b를 만족하는 배열 중 가장 짧은 배열의 길이를 출력하는 문제.

피곤한 상태라 영어도 잘 안읽히고 MEX도 처음보는 개념이라 스트레스 받았었다.

일단 MEX 값이 a이기 위해서 배열은 0, 1, ... , a-1을 배열에 포함하고 있어야한다. 그리고 0부터 a-1까지 XOR 연산한 결과를 x라고 할 때  x ⊕ x ⊕ b = b라는 xor의 성질을 이용해 푸는 문제.

세가지 경우로 나뉘는데

1. x = b인 경우 0부터 a-1까지 포함하고 있는 배열이 최소 길이이기 때문에 a를 출력한다.

2. x != b이고 x ⊕ b != a인 경우, x ⊕ b만 배열에 추가하면 조건을 만족하기 때문에 a+1를 출력한다.

3. x != b이고 x ⊕ b = a인 경우, x ⊕ b를 배열에 추가할 수 없기 때문에 x ⊕ b ⊕ 1과 1을 배열에 추가하면 조건을 만족한다. a+2를 출력.

MEX의 개념때문에 그런건지 몰라도 배열에 중복된 숫자를 포함하면 안된다는 조건이 없었는데 중복이 불가능하다 생각해서 못풀었었다. 약간 아쉬운 문제.

 

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

 

Problem - C - Codeforces

 

codeforces.com

B에서 막혀 C로 바로 넘어갔는데 나에게는 너무 어려웠던 문제.

덧셈에서 올림을 다음 자릿수가 아니라 다다음 자릿수에 넘겨주는 방식으로 한다고 할 때 주어진 입력 값 n을 두 양의 정수의 합으로 만들 수 있는 쌍이 몇 개 있는지 출력하는 문제.

올림이 두자리 위로 가기 때문에 홀수 자릿수와 짝수 자릿수의 숫자들은 서로에게 영향을 주지 않는다는 점을 이용해서 홀수 자릿수와 짝수 자릿수를 추출해 두 개의 숫자를 만들면 각각을 정상적인 덧셈으로 만드는 정수 쌍을 찾는 문제로 변한다.

숫자 n을 정수 두 개로 만드는 쌍은 (0, n), ... (n, 0)로 n+1개라는것을 간단하게 알수 있고 홀수 자릿수의 경우의 수와 짝수 자릿수의 경우의 수를 곱해주고 부분적인 경우에서는 0이 될 수 있지만 전체 경우에서는 0이 될 수 없기 때문에 2를 빼준것이 정답이 된다. 시간복잡도는 O(log n).

여전히 A, B, C 문제에서 헤매고 있다. 아이디어만 떠올리면 따로 최적화도 필요없고 대부분 시간복잡도가 커봐야 O(n)인 문제들인데 따로 공부 할 수 있는게 아니라 경험과 수학능력을 요구하는거라 오히려 답답하기도 하다.