
일단 이 대회를 제 1회때부터 알고 있었다
하지만 그 당시 신청 기간을 까먹고 있다가 지원하지 않아서 결국 제1회는 날렸다
제 2회때는 다른 대회와 겹쳐서 하지 못했다
그리고 제 3회때가 되어서야 아무 문제없이 할 수 있게 되었다!
또 이후에 바뀐 사항으로 인해 시간만 겹치지 않으면 두 개 이상의 분야 지원도 가능해서 파이썬과 알고리즘 부문을 신청했다
사실 알고리즘 문제야 뭐 내가 계속 풀어오던 것이라 크게 준비한게 없었다
계속 백준 골드 수준의 문제들을 풀어오며 가벼운 마음으로 준비했다
4문제 중 2문제를 푸는 것과, 동상(상위 10%)을 받는 것이 목표였다
대회가 토요일 오전 11시라서 그 전날에 좀 일찍 잤다 사실 일찍 자진거다
근데 문제는 내가 일찍 일어난건 좋은데 너무 이른 시간인 새벽 3시에 일어나버렸다
다시 자면 분명 11시를 넘어버릴 것 같아서 그냥 깨어있기로 했다
결국 7시쯤에 나도 모르게 다시 자버리고, 나는 12시에 일어났다
파이썬 부문을 날려버린거다 내 4만원 ㅠ
그래도 다행인점은 더 중요하던 알고리즘 부문은 할 수 있었다
급하게 일어났기에 빨리 책상 정리를 하고, 신분증, 종이, 노트북을 준비했다
이후 오후 2시에 줌에 접속했고, 대회 사이트 접속에도 성공했다
30분 정도의 대기 시간이 있고 대회는 시작되었다!
A,B번 문제를 AC 하는 것이 목표였기에 A번 문제를 빨리 푸는 것이 가장 중요하다고 생각했다
그래서 빠르게 문제를 읽고 평소에 많이 보던 그리디? 느낌의 문제길래 종이에 대충 그려보고 코드를 짜기 시작했다
일단 문제 설명을 하자면, 대충 가로 n, 세로 2 크기 안에서 해당 위치에 일자 파이프가 있는지, 꺾인 파이프가 있는지 주어지고 0,0 위치에서 시작해 1,n 위치에 도달할 수 있는지를 판별하는 문제였다
일자 파이프는 가로, 세로 둘 중 하나로 존재할 수 있으며
꺾인 파이프는 가로 위, 세로 위, 가로 아래, 세로 아래 형태로 존재할 수 있다
일단 일자 파이프는 전체 세로 크기가 2이기에 세로 형태가 오게 되면 일단 망한다
그래서 일자 파이프는 무조건 가로 형태로 와야 한다는 것을 캐치했고,
단순하게 생각해보면 어느 방향으로 왔는지만 판별해주면 꺾인 파이프의 형태를 확정지을 수 있을 것 같았다
예를 들어 왼쪽에서 왔으면 위 아래만 정해주면 되고, 위에서 왔냐 아래에서 왔냐를 가지고 또 판별해주면 된다
설명이 조금 이상했지만 아무튼 코드로 구현하면 아래와 같다
def find(x,y,d):
while 1:
if x == (n-1) and y == 1:
res = True
break
elif x >= n or y > 1:
res = False
break
if y == 0:
if top[x] == 'I':
if d == 'left':
x += 1
else:
res = False
break
else:
if d == 'left':
y = 1
d = 'bottom'
elif d == 'top':
x += 1
y = 0
d = 'left'
else:
res = False
break
else:
if bot[x] == 'I':
if d == 'left':
x += 1
else:
res = 0
break
else:
if d == 'bottom':
x += 1
y = 1
d = 'left'
elif d == 'left':
y = 0
d = 'top'
else:
res = 0
break
return res
n = int(input())
top = list(input())
bot = list(input())
if find(1,0,'left') or find(0,1,'bottom'):
print('YES')
else:
print('NO')
좀 복잡한 코드이긴 하지만 현재 위치가 위냐 아래냐를 구분하고 방향을 구분해서 이동시켜준 것 말고는 없는 코드이다
사실 처음에 이것을 재귀 함수로 구현했다가 런타임 에러가 났는데 파이썬에서 재귀 제한을 푸는 방법이 기억이 안나서 빨리 while문 형태로 고쳤더니 AC가 떴다
이 대회는 특이하게 끝나기 30분전까지 다른 사람들의 순위와 내 순위를 확인할 수 있다
A번 문제를 푼 시점은 35분이었고 나는 무려 4등이었다!
사실 1,2등이 A번 문제를 약 10분만에 풀어서 '역시 세상에 미친놈은 많구나' 생각이 들었고, 목표의 절반와서 기쁜 마음으로 B번 문제를 풀러갔다
사실 B번 문제는 잘 기억은 안나지만 대충 수열이 있으면 해당 수열의 길이 n이 수열에 있다면 n을 제거하고, 없으면 추가하는 것을 k번 반복했을때 수열의 합을 출력하는 문제였다
일단 시간 제한은 5초였지만 입력이 정말 엄청나게 들어오기 때문에 O(N제곱)은 할 수 없었다
그래도 부분 점수 긁는 마인드로 단순 구현으로 코드를 빠르게 짜보았고 결국 부분 57점을 받았다
이후에 계속해서 다양한 방식으로 시도했지만 결국 57점의 한계를 느끼고 C번 문제로 넘어갔다
다행히 내가 여전히 4등이었고, 1,2등은 B번 문제를 푼 상태였고, C번은 아직 풀기 전이었다
밑에 5등이 B번 57점을 받은 시점이 나랑 1분 차이나길래 정말 운이 좋았다고 생각했다
그래서 스코어보드를 왔다 갔다거리며 3등을 차기하기 위해 노력했지만 이어서 3등도 2번을 풀었길래 C번으로 넘어갔다
스파이라는 문제였는데 솔직히 딱 처음보자 마자 이건 못 풀겠다 싶어서 바로 눈에 보이는 3점을 긁었고, 이후에 DP로 푸는 것을 시도하다가 결국 대회는 종료되었다

대회 종료 30분전 기준 스코어 보드이다
저기 보이는 4등이 나다
밑에 5등과 차이가 얼마 안나기 때문에 사실 끝날때까지 계속 시도했지만 결국 최종 점수는 160점이었다
그래도 내가 160점을 도달하던 시점이 딱 2시간 30분이기에 5,6등 혹은 밑에 참가자들이 갑자기 B번을 풀지 않은 이상 아마 4등인 것 같다
조금 아쉬운건 이 대회 대상이 1등, 금상이 2,3등, 은상이 4~6등이라 B번 문제를 풀었다면 3등까지 노려볼만 했는데 좀 아쉽다
그래도 은상은 받은 것 같아 행복하다

이것이 내 제출 기록이다
일단 A번은 35분만에 풀려서 행복했고, B번을 못 풀어서 아쉽지만
결과적으로 4~6등 안에 든 것 같아 나름 만족스러운 PS 대회였다!
이것을 기점으로 제발 앞으로도 PS 수상 경력이 많아지면 좋겠다...
+이때 인원이 약 30명이었는데 설마 인원 적다고 수상 대상 축소되는건 아니겠지...?