그랜드 아레나 파티!

solved.ac Grand Arena #4(Div. 2)에 출전해 7문제 중 3문제를 풀어 오프라인 참가자 65명 중 29등을 기록했습니다. 스코어보드는 여기에서, 에디토리얼은 여기에서 확인할 수 있습니다.

오프라인 PS 대회 출전은 처음이었는데, 새로운 경험이 되었던 것 같습니다.

일찍 일어나는 새가 춥다

대회일 아침, 분명히 7시에 알람을 맞춰 놓았는데 제가 일어난 시각은 7시 50분이었습니다. 대충 준비하고 대회장으로 향했습니다. 10시 반부터 등록이었는데, 한 시간이나 일찍 도착해버렸습니다. 그런데 저보다 일찍 도착하신 분이 계셨습니다. toycartoon 님은 등록 시작 3시간 전인 7시 30분에 도착을 하셨다고 합니다.

대체 왜요

대회 시작까지는 아직 한참 남아서 문 앞에서 노가리를 까면서 기다리고 있으니 점점 사람들이 많아졌습니다. 뭔가... 다들 PS를 하게 생기신 분들이셨어요(이게 무슨 소리지).

10시 반에 대회장의 문이 열리고 등록을 시작했습니다. 바로 들어가서 등록을 마치고 많은 양의 기념품을 받고 들어가서 자리에 앉았습니다.

기념품을 엄청 많이 받았습니다. 행사장 한쪽에는 풍선이 있었는데, 이런 PS 대회에서는 문제를 맞힐 때마다 해당하는 색깔의 풍선을 달아주는 문화가 있다고 합니다. 저는 제 자리에 풍선이 하나도 달리지 않는 사태가 생길까봐 살짝 걱정했습니다.

비추어라, 그러면 보일 것이다

함께 퍼즐을 풀어봅시다!

12시 30분까지 퍼즐 헌트 이벤트를 하고 있었습니다. 페이지에 들어가면 열 개의 문제가 있는데, 뭔가 엄청 어려워 보였습니다. 등록을 하고 입장할 때 투명한 카드 같은 걸 줬는데, 같은 팀원들이 받은 것과 조합을 해 보니...

FIND OPERATIONS

글자가 나타났습니다. FIND OPERATIONS 라는 글자가 보였고, 이를 페이지에 입력하니 문제가 풀렸습니다. 뭔가 다른 문제들은 풀 엄두가 나지 않아 밥을 먹던 중, 여덟 번째 문제를 보고 있었습니다.

이게 뭔데요

' 마법, 별빛이 비추는 길을 따라 ' 라고 되어 있었습니다. 그런데 그림이 뭔가...

티켓.

처음 등록할 때 받았던 티켓과 비슷하게 생겼습니다...? 그래서 빛을 비추어 보았습니다.

WELCOME KIT

빛을 비추어야만 보이는 WELCOME KIT 글자가 있었습니다! 그래서 저는 이 문제를 맞히며 팀의 1솔에 기여했습니다[1]처음으로 맞힌 사람이었다고 썼었는데, 다시 살펴보니 아니었네요. 다른 문제하고 헷갈렸어요 :blobsad:.

퍼즐 부스.

진짜 퍼즐을 풀어야 답을 알 수 있는 문제도 있었는데, 저희 팀원이 어떻게 해서 퍼즐을 풀고 답을 맞혀버렸습니다.

이외에도 팀원들이 여러 문제를 맞혀서 6문제를 맞힌 시점에서 이벤트가 끝났습니다. 꽤나 재밌었던 이벤트였습니다.

실버에서 3솔 난다

Div.2에서 제가 유일한 실버였고, 나머지 분들은 모두 골드 이상이었습니다. 실버 대표로 출전한 느낌이었습니다(누가 대표 시켜준대...?). 대회가 시작되자마자 ABCDEFG를 모두 켜 놓고, A부터 문제를 보기 시작했습니다.

31403

A, AC / 3

이 대회는 문제가 난이도 순으로 정렬되어 있었습니다. 그렇다는 얘기는 A번 문제가 가장 쉽다는 얘기고, 실제로도 A번이 뭔가 풀기 쉽게 생겼었습니다. 지문은 짧을 수록 좋습니다(아마도요).

당연히 일반적인 사칙연산 문제는 아닌 것 같고, A+B-C인데 +는 문자열로 이어붙이고, -는 숫자로 보고 빼야 하는 문제였습니다.

그래서 간단하게 문자열과 수를 왔다갔다 할 수 있게 코드를 뚝딱뚝딱 만들었고, 시작 3분 만에 맞았습니다!!를 받았습니다.

31395

B, AC +3 / 64

무슨 부분수열이 나오고 그럽니다. 저는 수학이 싫어요... 그런데 이거, 뭔가 풀 수 있을 것 같습니다. 문제에 나오는 수열을 한 번만 돌면 답이 나올 것 같습니다. 그리고 그 예상은 적중했습니다. 인접한 두 수를 한 번씩만 비교하면 되는 것이었습니다. 그런데, 뭔가를 잘못 생각했는지 계속 틀렸습니다가 나오는 겁니다. 그래서 일단 포기하고 C번을 풀고 돌아왔는데, 진짜 잘못 생각한 무언가가 있었습니다.

i부터 j까지 연속된 길이 k에 대해서 \frac{k(k+1)}{2}였는데, 이걸 팩토리얼하고 착각을 해서 팩토리얼을 적어버린 겁니다. 난 바보야 그래서 바로 고쳤고, 맞았습니다!!를 받았습니다.

깡!

오늘의 교훈: 예제만 보지 말고 테케 몇 개를 더 넣어 보자

31404

C, AC / 52

뽜밤뽜밤-! 아리스는 메이드 용사로 전직했습니다!

저희 집에도 로봇 청소기를 하나 들이고 싶은데, 비싸요. 하여튼 이 로봇 청소기는 써 있는 대로 움직이기 때문에, 그대로 구현을 했습니다. 그리고 영역을 나갔는지 확인하는 코드도 넣어주고, 무한 루프의 가능성도 있기 때문에 먼지가 없는 곳을 99999번 청소하면 프로그램이 터지고 원래 나와야 할 값을 던지는 코드도 넣어줬습니다.

그랬더니 한번에 맞았습니다!!를 받았습니다. 나중에 스코어보드를 보니 이 문제를 11번 틀리고 맞히신 분도 계셨고, 28번을 틀리시고 결국 맞히지 못한 분도 계셨네요.

import sys
input = sys.stdin.readline
h, w = map(int, input().strip().split())
r, c, d = map(int, input().strip().split())
a = [list(map(int, list(input().strip()))) for _ in range(h)]
b = [list(map(int, list(input().strip()))) for _ in range(h)]
x = [[0] * w for _ in range(h)]
o = 0
p = 0
k = 0
while True:
    if x[r][c] == 0:
        x[r][c] = 1
        k = 0
        d += a[r][c]
    else:
        p = 2
        k += 1
        d += b[r][c]
    if d > 3:
        d = d % 4
    if d == 0:
        r -= 1
    elif d == 1:
        c += 1
    elif d == 2:
        r += 1
    else:
        c -= 1
    o += 1
    if r < 0 or r >= h or c < 0 or c >= w:
        if k != 0:
            o = o - k
        break
    if k > 99999:
        o = o - k
        break
print(o)

31406

E, 시도하지 못함

DFS로 풀 수 있는 문제인 걸로 보였습니다. 그런데 문제는, 제가 DFS를 배운 적이 없다는 겁니다. 그래서 빠르게 스킵했습니다.


저는 그렇게 3개의 문제를 풀었고, 시간이 너무 많이 남아서 이불탐색을 띄워 놓고 잤습니다.

이 불 탐 색

PS도 식후경

이후에 유저 컨퍼런스 세션과 스코어보드 공개, 시상식이 있었습니다. 그리고 저는 감사하게도 특별상을 받았습니다!

특별상 장패드.

그리고 이후에 hjroh0315, toycartoon, ruykun, hibye1217 님과 함께 치킨을 먹었습니다. 맛있었어요 :blobnom:

5명에 2치킨이라니

그러고 나서는 toycartoon 님과 같이 부천 어택에서 리듬게임을 하다가 집에 갔습니다.

받았던 팜레스트와 키캡을 장착해 보았습니다. 귀엽군요.

이번 대회의 레이팅은 온사이트와 미러를 합쳐서 계산이 되었습니다. 그래서 총 참가자 398명 중 67등으로, 퍼포먼스는 S+ 1920으로 판정이 되었고, 레이팅은 A+ 1444가 되었습니다. 이번 대회에서 그랜드 아레나 파티 배경아레나 상위 100위 뱃지를 얻었습니다.

그렇게 제 첫 대회는 즐겁게 끝나게 되었습니다. 참여하신 모든 분들과 스탭 분들 수고 많으셨습니다!

골드 길도 브론즈 5부터

Gold V

이 글을 작성하는 시점에 Gold V Gold V이 되었습니다! 🎉

각주

각주
1 처음으로 맞힌 사람이었다고 썼었는데, 다시 살펴보니 아니었네요. 다른 문제하고 헷갈렸어요 :blobsad:

solved.ac Grand Arena #3

solved.ac 그랜드 아레나 #3(Division 2)에 출전해 7문제 중 2문제를 풀어 등록한 사용자 395명 중 168등을 기록했습니다. 스코어보드는 여기에서, 에디토리얼은 여기에서 확인할 수 있습니다.

30802

A, AC / 6

일단 펜의 개수부터 보겠습니다. N개의 펜을 P로 나눈 몫과 나머지를 구하면 됩니다.

티셔츠의 개수를 보겠습니다. S개의 티셔츠를 T로 나눈 몫과 나머지를 구해봅니다. 만약에 나머지가 0이라면, 나눈 몫만큼만 구매하면 됩니다. 나머지가 0이 아니라면, 결국 한 묶음을 추가로 구매해야 하므로 나눈 몫에서 1개를 더 주문해야 합니다. 모든 사이즈에 대해서 각각 구한 다음, 이 값을 모두 합해주면 됩니다.

저도 온사이트 아레나 가게 해주세요

30803

B, AC +1 / 19

왜 물탱크에 N개의 수도꼭지를 연결하는 걸까요... 수학 시험지에 딴지를 거는 것 같네요. 철수와 영희는 왜 그런 짓을 했는지에 대하여

문제는 저한테 쿼리를 날립니다. 쿼리는 두 가지 중 하나입니다.

  • 쿼리 1, i, xA_{i}을 바꿉니다.
  • 쿼리 2, i는 해당 수도꼭지를 잠그거나 엽니다.

생각해보면, 이 쿼리들은 i번째 수도꼭지만 바꾸고 나머지는 바꾸지 않습니다. 그러면, 이전 쿼리에서 나온 답을 저장해 놓고, 쿼리가 들어올 때마다 이 값만 어떻게 해볼 수 있겠습니다.

제 코드를 여기에 옮겨 보겠습니다.

import sys
n = int(sys.stdin.readline().rstrip())
a = list(map(int, sys.stdin.readline().rstrip().split()))
b = [1 for i in range(len(a))]
o = sum(a)
print(o)
q = int(sys.stdin.readline().rstrip())
for x in range(q):
    query = list(map(int, sys.stdin.readline().rstrip().split()))
    if query[0] == 1:
        if b[query[1]-1] == 0:
            a[query[1]-1] = query[2]
        else:
            o -= a[query[1]-1]
            a[query[1]-1] = query[2]
            o += query[2]
    else:
        if b[query[1]-1] == 0:
            b[query[1]-1] = 1
            o += a[query[1]-1]
        else:
            b[query[1]-1] = 0
            o -= a[query[1]-1]
    print(o)

30804

C, 시도하지 못함

탕후루 먹고 싶다

뭔가 느낌이 최장 부분 어쩌구 수열을 구하는 것 같았습니다. 그럼 문제가 생깁니다. 저는 최장 부분 수열 같은 걸 구하는 걸 몰랐습니다.

그래서 하나하나 모든 경우의 수를 구해보려고 했는데, 맞았습니다!!를 받고 싶은 제 마음과는 다르게 비효율적인 방법밖에 생각이 나지 않아 포기했습니다. 솔직히 글을 쓰고 있는 지금도 에디토리얼을 보고 있지만 뭔 소린지 모르겠습니다.


오랜만의 아레나 출전이었습니다. 레이팅 계산 공식이 변경되어 A 1310B 995가 되었다가, 이번 대회의 퍼포먼스는 A+ 1517으로 판정이 되었고, 레이팅이 B+ 1157이 되었습니다.

실버 1이지만 구현으로 최강입니다

8월 12일부터 15일까지 4개의 대회에 참가했습니다.

대회에디토리얼SolveRank
제1회 유틸컵 - Chapter 1-4 +8689/466
solved.ac Grand Arena #2에디토리얼2 +45346/1098(Rated)
365/675(All)
제 1회 하이콘 Open Contest에디토리얼3 +4469/235
제3회 고려대학교 MatKor Cup : 2023 Summer Open Contest - Phase 1에디토리얼1 +68162/297(All)

예전보다 문제 푸는 실력이 늘어난 것 같아 행복합니다.

28453

유틸컵 A, AC / 2 +22

메이플스토리의 만렙이 300이 된 지도 몰랐습니다. 옛날 200 시절밖에 모르는데...

모든 입력은 4개의 구간 중 하나에 속하게 되므로, 조건문 3개를 사용하여 출력하면 됩니다. 한 줄에 출력해야 하기 때문에 print문에서 end=" "을 사용해 출력할 수 있습니다.

28454

유틸컵 B, AC / +6

문제의 입력이 주어진 현재 날짜보다 늦은지를 검사하면 됩니다. 파이썬의 datetime 모듈을 사용할 수도 있지만, 연도와 월, 일을 순서대로 비교할 수도 있습니다.

28455

유틸컵 C, AC / 2 +32

메이플에 유니온이라는 시스템이 있었군요. 옛날 메이플에는 그런 거 없었는데

일단 입력을 리스트 안에 모두 받아주고, 내림차순으로 정렬해 42개의 요소만 남깁니다. 이후, 캐릭터마다 레벨이 60, 100, 140, 200, 250 이상인지 검사해 줍니다. 이후, 레벨의 합과 검사한 값의 합을 각각 출력하면 됩니다.

28456

유틸컵 D, AC / +26

일단 2차원 배열을 입력받아주고, 각 연산마다 하라고 했던 걸 해주면 됩니다. 연산의 첫 자리가 1인 경우 맨 뒤 원소를 없애고 맨 앞으로 삽입합니다. 2인 경우 배열을 회전시켜주면 됩니다.

28701

GA2 A, AC / 2

1부터 N까지의 수의 합의 제곱과 1부터 N까지의 세제곱의 합이 같다는 사실을 오늘 알았습니다.

문제에서 주어진 대로 구현하면 됩니다. 1부터 N까지의 수의 합은 \frac{N(N+1)}{2}이므로 그대로 구현하면 되고, 1부터 N까지의 세제곱의 합은 1부터 N까지의 수의 합의 제곱과 같다고 했으므로 합의 제곱을 두 번 출력하면 됩니다. 두 값이 같다는 증명은 에디토리얼에 있습니다.

28702

GA2 B, AC +1 / 22

세 개의 입력 중 한 번 이상은 숫자가 그대로 들어옵니다. 아마도요. 그렇지 않으면 이 문제를 풀 수 없을 겁니다.

일단 그렇다는 가정을 하고, 입력 중 숫자를 찾아 문제에서 주어진 규칙에 따라 출력을 해주면 됩니다.

28444

하이콘 A, AC / 1 +1

HI-ARC=?

문제에서 주어진 그대로 계산을 해 주면 됩니다. 입력을 i라는 리스트로 받았을 때, i[0]i[1]을 곱하고, i[2], i[3], i[4]를 곱한 값을 빼주면 되는 간단한 문제였습니다.

28445

하이콘 B, AC / 1 +9

앵무새는 귀엽습니다.

문제의 조건에 따라, 나올 수 있는 조합은 최대 16개입니다. 서로 다른 색의 개수에 따라 조건문을 만들 수도 있습니다. 하지만 더 쉬운 방법을 찾을 것입니다. 늘 그랬듯이.

우선 모든 색 조합을 구하고, 파이썬의 set 자료형을 사용해 중복을 제거합니다. 정렬하고 출력해 주면 됩니다.

28446

하이콘 C, AC / 2 +34

보자마자 '이건 딕셔너리다' 싶은 문제였습니다.

딕셔너리를 사용하면 문제가 간단해집니다. 1번 입력을 받으면 d[w] = x 로 값을 저장하고, 2번 입력을 받으면 d[w]를 출력하면 됩니다.

그렇대요
저런

28682

MatKor A, AC / 3 +68

아마도 처음으로 풀어보는 인터랙티브 문제일 겁니다.

몬티홀 문제라는 매우 유명한 문제가 있습니다.

세 개의 문 중에 하나를 선택하여 문 뒤에 있는 선물을 가질 수 있는 게임쇼에 참가했다. 한 문 뒤에는 자동차가 있고, 나머지 두 문 뒤에는 염소가 있다. 이때 어떤 사람이 예를 들어 1번 문을 선택했을 때, 게임쇼 진행자는 3번 문을 열어 문뒤에 염소가 있음을 보여주면서 1번 대신 2번을 선택하겠냐고 물었다. 참가자가 자동차를 가지려할 때 원래 선택했던 번호를 바꾸는 것이 유리할까?

결론은 '바꾸는 것이 유리하다'입니다. 선택을 바꾸지 않았을 때의 당첨 확률은 \frac{1}{3}, 바꿨을 때의 당첨 확률은 \frac{2}{3}입니다.

인터랙티브 문제는 출력을 한 이후 sys.stdout.flush() 등으로 출력 버퍼를 flush해야 합니다. 바부같이 import sys를 적지 않아 두 번이나 틀렸습니다를 받았습니다.


그랜드 아레나 2에 등록하고 출전해 퍼포먼스는 S+ 1927, 레이팅은 B 866A 1310이 되었습니다.

solved.ac Grand Arena #1

solved.ac가 개최하는 첫 경쟁 프로그래밍 대회, 그랜드 아레나 #1에 참가했습니다.

스코어보드는 여기에서, 에디토리얼은 여기에서 확인할 수 있습니다. 저는 총 3문제를 풀고, 총 패널티 -138로 등록한 사용자 1,362명 중 285등을 기록했습니다.(Rated 285/1,362 | All 302/847)

28431

A, AC / 10

양말 짝 맞추기입니다. 마치 항상 짝이 안 맞는 제 양말을 보는 것 같았습니다.

입력된 숫자 중 '홀수 개'인 숫자가 있다면, 그 숫자는 반드시 짝이 맞지 않게 됩니다. 그렇다면 그 숫자가 답이 됩니다.

에디토리얼에 따르면, 모든 입력을 XOR하면 답이 된다고 합니다.

28432

B, AC +2 / 36

정답은 ? 앞의 문자열의 마지막 글자로 시작해야 하고, ? 다음 문자열의 첫 글자로 끝나야 합니다. 그리고, 단어는 중복될 수 없기 때문에 같은 문자열이 나오지 않는지도 검사해줘야 합니다.

N이 1개거나 2개인 경우에 대해 예외처리를 하지 않아서 런타임 에러를 두 번이나 받았습니다.

28438

H, AC / 52

작년 대학 수학 시간에 잠깐 배웠던 행렬을 이용해야 하는 문제가 나왔습니다. 이 문제에 나오는 연산은 두 개 뿐입니다. r행에 v를 더하거나, c열에 v를 더하는 것입니다. rc열의 수는 r행에 더해진 수와 c열에 더해진 수를 합한 값이 될 것입니다.


이번 아레나는 등록만 하고 문제를 풀지 않은 사람이 많아서, 퍼포먼스가 매우 높은 SS 2066으로 판정이 되었고, 레이팅은 Unrated 0B 866이 되었습니다.