cs71107 blog


  • 홈

  • About

  • 아카이브

  • 태그

  • 검색

Codeforces Round 699(Div2) 후기

작성일 2021-02-06 | In contest |

총평

문제들은 다음 링크에서 확인할 수 있다.

http://codeforces.com/contest/1481

A~E가 전부 무난했다. F를 푸는데는 실패해서 아쉽다. 시스텟 전엔 40위로(div1+div2) 순위 준수한 성적을 기록했다. 저번 에듀를 안 쳤으면 rated 중엔 7위, top10 이었을 것 같다. 다음은 각 문제의 풀이다.

A

좌표가 주어지고, 문자열 S가 주어진다. 각 문자는 L,R,U,D로 구성되어 있고, 각각 왼쪽, 오른쪽, 위쪽, 아래쪽으로 1씩 움직이라는 뜻이다. 이때, 문자 중에 몇 개를 제거해서 (0,0)에서 원하는 좌표로 이동할 수 있는지 묻는 문제이다. 주어진 문자열을 통해 도달 가능한 x좌표, y좌표의 최댓값, 최솟값을 알 수 있으므로, 주어진 좌표가 그 범위안에 들어가는지 판별해주면 된다. 개인적으로 A치곤 살짝 어려웠다.

B

정수들이 있는 배열이 주어지는데, 다음 원소보다 지금 원소가 크거나 같으면 계속 진행, 그렇지 않으면 현재 원소를 1 증가 시키고, 끝까지 도달하면 전체 작업을 끝낸다. 이때, k번째 작업이 어디에서 끝나는 가를 묻는다. 제한을 생각하지 않고 풀면 어렵게 접근할 수 있다. 주어지는 배열의 길이도 100이하, 최댓값도 100 이하이므로, 그냥 시뮬레이션을 돌리면서 배열이 내림차순이 될 때까지 진행시키면 된다.

C

원래 수들이 있는 배열, 목표로 하는 상태의 배열이 주어진다. 그리고, 순서대로 정확히 하나의 원소를 특정 값으로 바꿀 수 있다. 이때, 원래 배열의 값을 적절히 바꾸어 목표로 하는 상태로 바꿀 수 있는 가를 묻는 문제이다. 이 문제를 풀 때 주의해야 하는 것은 한번 값을 바꾼 원소의 값을 또 바꾸는 것이 가능하다는 것이다. 그렇기 때문에, 순서대로 보는 것이 아니라 일단 전부 받은 후 역으로 보는 것이 문제를 더 편하게 풀 수 있다. 처음과 값이 달라져야 하는 부분, 같아야 하는 부분을 우선 구분한 뒤, 뒤에서 부터 보면서 처음과 값이 달라져야 하는 부분에 우선적으로 매칭을 시킨다. 이때, 매칭 하는 값이 하나도 없다면, 역으로 보고 있으므로 이미 매칭된 아무 값에 매칭을 시킨다. 이렇게 했을 때 매칭 하는 곳을 못 찾거나, 값이 바뀌어야 하는데도 그렇지 못 한 값이 남아있으면 NO, 아니면 YES이다.

D

아이디어 문제, 우선 어떤 두 정점 x,y가 있어 x->y, y->x에 대해서 쓰여 있는 문자가 같다면 x, y, x, y, …. 와 같으로 순회하면 같은 문자로 구성된 임의의 길이의 문자열을 항상 만들 수 있다. 이것은 자명하게 팰린드롬이다. 그렇지 않다면, 모든 정점 x,y 에 대해서 x->y, y->x에 쓰여 있는 문자가 다르다는 뜻이므로, x, y, x, y, …. 와 같이 순회할 경우, abababab… 또는 babababa…같은 문자열이 된다, 이때, 길이가 홀수이면, 이 문자열은 팰린드롬이되므로, 그대로 출력한다. 만약 짝수라면, n = 2일 경우 모두 불가능하다. 그 외에는 어떤, 정점 x,y,z가 존재하여, x->y에 쓰여진 글자는 a,x->z에 쓰여진 글자는 b인 x,y,z가 항상 존재한다. (증명은 간단하다.) 따라서 순서를 잘 조정해서 출력하면 된다.

E

E치고는 간단하다고 생각한 문제, 관찰은 책을 선택할 때 많아봤자 한번 선택하면 된다는 것 && 그리고 선택되지 않은 책들의 순서가 변하지 않고, 나머지 책들을 제거하면 조건을 만족시켜야 한다는 것이다. 따라서 dp를 쓰면 간단하게 풀린다. 정리된 책들의 배열을 생각했을 때 어떤 수 i가 존재하여 위치가 i이하인 책들은 뽑히지 않았고, 그 뒤의 책들은 뽑힌 책들이 되게 할 수 있으므로, 이 점에 착안하여 dp를 하면 된다.

더 읽어보기 »

Educational Round 103(Div2) 후기

작성일 2021-01-31 | In contest |

총평

문제들은 다음 링크에서 확인할 수 있다.

https://codeforces.com/contest/1476

전체적으로 A~E는 무난한 문제들이었고, F,G의 경우 매우 어려운 문제 인 것 같다.

나의 경우, A~E 는 문제 없이 풀었고, F 솔브가 없는 것을 보고 바로 G로 왔으나, G도 풀지 못했다.

하지만 다행히 A~E를 준수하게 풀어서, rated 중 23위로 max rating을 경신할 수 있었다.

풀이를 정말 간략하게 남긴다.

A

n과 k가 주어진다. 그럼 양의 정수인 n개의 원소들의 총합이 k의 배수가 되는 것이 가능한지 묻는 문제이다. 적절한 case-work를 하면 된다. O(1)에 각 문제를 해결할 수 있다. 이번 라운드에서 나온 대부분의 핵이 A tl 핵이었던 것 같다.

B

문제를 처음 봤을 때는 생각이 잘 나지 않을 수 있는데, 잘 생각을 해보면 결국 제일 처음 수만 늘려도 손해가 없다는 것을 알 수 있다. 이분 탐색을 돌려주면 된다. 사람들이 처음에 B에서 많이 막혔던 것 같다.

C

특수한 형태의 그래프가 주어질 때, 단순 사이클의 최대 길이를 구하는 문제, dp를 잘 하면 된다. 지금 보고 있는 구간에서 사이클을 이어 나갈지, 여기에서 끝낼지를 보면 된다. 단, 어떤 구간에 대해 끝점이 같다면 예외처리를 해주어야 한다. 그렇게 하지 않으면 단순 사이클이 아닐 수 있다.

D

잘 생각해보면 어떤 도시에서 왼쪽, 오른쪽 도로의 방향이 처음과 같다면 한쪽으로만 갈 수 있다. 또, 한번 이동할 때마다 도로의 방향이 뒤집어지기 때문에, 한번 갔던 정점은 다시 방문이 가능하다. 이런 점을 생각하면, 각 도시에 대해 왼쪽으로 최대한 갔을 때 방문 가능한 도시 수, 오른쪽으로 최대한 갔을 때 방문 가능한 도시 수, 그리고 자기 자신을 합한 것이 답이 됨을 알 수 있다. 왼쪽, 오른쪽으로 최대한 갔을 때 방문 가능한 도시 수는 dp를 통해 구할 수 있다.

E

n개의 패턴, m개의 문자열이 주어진다. 패턴과 문자열의 길이는 k로 고정이다. 이때, 문자열들에 대해서 해당 문자열과 매칭이 가능한 패턴들에 대해 특정 패턴이 제일 먼저 나올 수 있게 순서를 조정할 수 있는지를 묻는 문제이다. 제한을 보지 않는 다면 문제를 푸는데 어려움을 겪을 수 있다. 하지만 제한에 k가 4이하로 주어진다고 돼있으므로, 여기서 실마리를 얻을 수 있다. 한 문자열에 대해 매칭 가능한 패턴의 수는 2^k이므로, 그냥 문자열들에 대해서 매칭 가능한 패턴을 전부 보면 된다. 이때, 그런 패턴이 없으면 NO를 출력한다. 만약에 모두 존재는 한다면, 문자열에 대해 매칭 가능한 패턴들의 순서를 정할 수 있다. 이를 바탕으로 그래프를 구성해준 다음, 위상정렬 했을 때 위상정렬이 제대로 된다면 YES, 실패한다면 NO이다.

더 읽어보기 »

cs71107 블로그 오픈

작성일 2021-01-11 | In general |

안녕하세요. 블로그를 개설하게 된 cs71107입니다.

이 블로그를 만들게 된 이유는, 제가 공부한 내용을 정리하고, 여러분께 공유하기 위함입니다.

부족한 블로그지만 이 블로그가 여러분들에게 조금이라도 도움이 되길 바랍니다.

주요 포스팅 내용은 아마 다음과 같습니다.

  1. 제가 푼 문제들 중 인상적이거나, 어려운 문제들의 대략적인 풀이.
  2. 프로그래밍 대회(GCJ, FHC, ACM-ICPC, SCPC, SNUPC, … ) 등의 참가 후기, 또는 대회 검수 후기
  3. 공부한 것 중 공유하고 싶은 알고리즘.
  4. 그외 개발(backend 등), CTF(입문 한다면) 관련 내용, 그리고 그냥 일상생활 등

이외에도 관심 분야가 바뀌는 것에 따라 포스팅 내용은 충분히 바뀔 수 있습니다. 기본적으론 일주일에 한번은 포스팅 하자는 생각을 가지고 있는데, 시험 기간 등의 이유로 하지 않을 수도, 더 많이 할 수도 있습니다.

감사합니다.

더 읽어보기 »
1 2
cs71107

cs71107

13 포스트
4 카테고리
12 태그
RSS
© 2022 cs71107
Powered by Jekyll
Theme - NexT.Muse