알고리즘 문제해결/Codeforces

Codeforces Round #811 (Div. 3)

havana723 2022. 8. 2. 16:02

 

저녁에 그림 그리면서 수다 떨다가 아 코포 있었지! 하고 급하게 친 코포였는데 평소보다 잘 쳐서 기분이 좋습니다. 아마 레이팅 최고점을 찍을거 같아요.

 

문제는 잘 풀었는데 실수가 많았던 건 아쉽네요. 더 잘 칠 수 있었을 것 같지만 이 정도도 충분히 만족스럽습니다. 앞으로도 골랜디 열심히 해야지.

 

A. Everyone Loves to Sleep (+)

시간과 분을 전부 분 단위로 바꿔서 계산하면 쉽습니다.

 

알람 시간이 잠에 든 시간보다 뒤라면 그냥 빼주면 되고 이전이라면 24 * 60을 더한 다음 빼주면 됩니다. 이렇게 구한 값들 중 최솟값을 출력해주면 됩니다.

 

Div.3 A번 치고는 귀찮은 문제가 나온 것 같아서 당황했습니다. 그래서 조금 늦게 푼 것 같습니다.


B. Remove Prefix (+)

값을 first로, 인덱스를 second로 가지는 pair의 vector를 만든 후 정렬해서 답을 구했습니다.

 

pair를 정렬하면 first 기준으로 먼저 정렬된 뒤 second 기준으로 정렬되므로 이 경우 값을 기준으로, 그리고 값이 같다면 index가 작은 순으로 정렬됩니다.

 

수열에 중복된 값이 없으려면 같은 값이 여러 개 있을 때 해당 값을 가지는 가장 큰 인덱스를 제외하고는 전부 제거해야 하므로 각 값 별로 뒤에서 두 번째 인덱스를 구한 뒤 그렇게 구한 인덱스들의 최댓값이 답이 됩니다.

 

set을 쓰면 더 간단했을 거 같은데... 괜히 이렇게 풀다가 뒤에서 두 번째 인덱스 구하는 부분에서 뇌가 꼬여서 시간을 많이 잡아먹었습니다.

 

왠지 set과 map을 안 쓰는 이상한 버릇이 있습니다. set이랑 map 잘 몰라서 인턴 면접에서도 떨어졌던 거 같은데 슬퍼요.


C. Minimum Varied Number (+1)

제한을 보자마자 DB를 박고 싶어졌습니다.

 

$N$이 9보다 작을 때, 17보다 작을 때, 24보다 작을 때 ... 를 하나하나 if문으로 나눠서 풀었습니다. 각 경우는 차례대로 맨 뒤에 9가 들어갈 때, 맨 뒤에 89가 들어갈 때, 맨 뒤에 789가 들어갈 때로 나눠서 생각할 수 있습니다.

 

30 대신 20이라고 써서 한 번 틀렸습니다. 난 바보야.


D. Color with Occurrences (+1)

제한이 크지 않아서 전부 탐색해보는 방법으로 풀었습니다.

 

우선 각 $s_i$가 $t$와 겹치는 부분을 전부 구해줍니다. 그런 다음 아직까지 색칠되지 않은 가장 앞 인덱스를 포함하면서 끝나는 인덱스가 가장 긴 $s_i$로 칠해줍니다. 이걸 반복했을 때 건너뛰는 인덱스가 생길 경우 칠할 수 없습니다.

 

size()가 unsigned인걸 깜빡하고 값을 빼줬다가 런타임 에러를 한 번 띄웠습니다. 난 바보야.

 

제 기준 그렇게 쉽게 풀 문제는 아니었는데 아이디어가 바로 떠올랐어서 마음에 듭니다.


E. Add Modulo 10 (+1)

개인적으로 D보다 쉬웠습니다.

 

앞의 숫자 몇 개를 손으로 해보면 홀수는 항상 한 번의 연산으로 짝수로 변하고 짝수는 일의 자리가 2 -> 4 -> 8 -> 6 -> 2 ... 의 순서로 길이 4짜리 사이클을 따라 변하는 것을 알 수 있습니다. 따라서 모든 수를 일의 자리가 2가 될 때까지 맞춰주고 십의 자리의 홀짝이 같은지 확인하는 방식으로 풀 수 있습니다.

 

단 일의 자리가 5와 0인 경우는 끝자리가 항상 0으로 변하므로 해당 경우만 예외처리를 해주면 됩니다.

 

예외처리를 잘못해서 한 번 틀렸습니다.


F. Build a Tree and That Is It

문제 읽고 세 수의 대소관계에 따라 케이스 나눠서 풀면 되지 않을까... 까지만 생각했습니다. 평소 퍼포보다 잘 풀면 그 시점에서 생각을 멈춰버리는 나쁜 버릇이 있기 때문에 깊에 생각 안 했습니다. 풀이 대충 들으니 좀 더 생각했으면 풀었을 것 같습니다.

 

이거 안 풀고 놀고 있다가 옆에서 열심히 안 친다고 혼났습니다. 다음에는 열심히 풀게요.


G. Path Prefixes

F보다 월등히 많이 풀렸길래 읽어보기나 하자 하고 봤습니다. 문제가 되게 읽기 싫게 생겼었는데 어떻게 잘 읽었습니다.

 

DFS를 두 번 돌리면 될 거라고 생각했는데 역시 거기서 생각이 멈췄습니다. 풀이 들으니 제가 떠올리지는 못했을 거 같아서 크게 아쉽지는 않습니다. 끝나고 디코에서 사람들한테 물어보니까 바로 답이 나오던데, 어떻게 이런게 바로 떠오르는 걸까요. 신기해요.