프로그래밍/문제 풀기

[대회] 첫 오프라인 대회 2026 SCSC 프로그래밍 경시대회 후기

jtw7977 2026. 5. 17. 00:31

SCSC에서 주최하는 2026 SCSC 프로그래밍 경시대회에 참가했습니다. div3부분에 참여를 했습니다.

첫 오프라인 대회라 긴장되기도 했지만 설레기도 했습니다.

 

A번 - 빠진 한 글자 찾기

주어진 문자열에 S가 2번 들어간다면 C를 C가 2번 들어간다면 S를 출력하면 되는 간단한 문제였습니다.

더보기
def main():
    input=open(0).readline
    s=input().strip()
    if s.count('S')==1:
        print('S')
    else:
        print('C')

main()

 

B번 - Mobilint 텐서 스케줄링 (REGULUS)

모든 텐서의 크기가 1임을 이용해 한개씩 처리해주면 된다고 생각했어서 처음에 사용되는 메모리양인 리프노드의 개수 + 1을 출력하여 AC을 받았습니다.

올바른 증명은 아니지만..

텐서의 크기가 1이 아닐때는 뭐였더라 Faker's 알고리즘인가?를 사용하는 문제라는 것을 듣고 놀라웠던 사실이네요.

더보기
def main():
    n,m=map(int,input().split())
    w=input().split()
    p=[*map(int,input().split())]
    print(n-len(set(p))+1)

main()

 

C번 - 오름차순으로 정렬했을 때 K번째 수

엄밀한 증명은 수학적 귀납법을 사용하는 것이겠지만, 직접 손으로 수열을 구해보니 M>N인 경우에는 a[k]번째의 요소가 추가된다는 것을 관찰하였고 그렇게 출력했더니 AC를 받았습니다.

처음에 M<=N일때는 정렬하면 안되는데 해버렸어서 +1WA

더보기
def main():
    n,k,m=map(int,input().split())
    a=[*map(int,input().split())]
    print(a[m-1]if m<=n else sorted(a)[k-1])

main()

 

D번 - 스시스시 회전초밥

각 칸이 최대 몇번 먹을 수 있는지 계산하고 M = min(K,T//N + ((T%N)>i ? 1 : 0)) ) 각 칸마다 앞에서 최대 M개를 먹었을때 나올수 있는 만족감을 구한후 다 더하면 되는 문제였습니다.

더보기
def main():
    input=open(0).readline
    n,t=map(int,input().split())
    ans=0
    for i in range(n):
        k,*x=map(int,input().split())
        tm=temp=0
        for j in range(min(k,t//n+(i<(t%n)))):
            temp+=x[j]
            tm=max(tm,temp)
        ans+=tm
    print(ans)
    
main()

 

E번 - DETOX

자신의 위치를 ?라고 한다면 O?O, OO?, ?OO, X?X, XX?, ?XX일때는 첫번째 라운드에 거수를 할 수 있으므로 1, 아니라면 2를 출력하게 하여 AC를 받았습니다. 2를 출력하는 경우에 대한 정확한 증명은 생각하지 못했는데 첫번째 라운드에 거수한 사람의 정보를 조합하면 무조건 2번째 라운드에서 거수를 할 수 있을 것 같기때문입니다.

더보기
def main():
    input=open(0).readline
    for _ in range(int(input())):
        n=int(input())
        s=input().strip()
        ans=[]
        for i in range(n):
            j=(i+1)%n
            k=(i-1)%n
            l=(i+2)%n
            m=(i-2)%n
            if (s[i]!=s[j] and s[i]!=s[k]) or (s[j]==s[l]) or (s[k]==s[m]):
                ans.append('1')
            else:
                ans.append('2')
        print(' '.join(ans))
    

main()

 

F번 - SQL

이문제는 대회중일때는 못 푼 문제입니다. 14:44분에 E번을 풀고 F번을 풀려고 했으나 WA를 계속 받으면서 멘탈적으로 흔들렸고 뒤에 문제를 보긴봤는데 자꾸 F번이 생각나서 풀지도 못했습니다.

대회 종료 20분전에 메인 아이디어가 떠올라서 구현을 했으나 구현을 실수해서 대회종료 3분전 WA를 받았고 이후 종료후 고쳐서 AC를 받았습니다.

각 X_i번째 쿼리의 결과를 A[i]라고 한다면 X_i < 0일때는 간단하게 결과을 구성할 수 있습니다. 하지만 X_i > 0 일때는 결과를 확정을 못하고 기다려야 합니다. 이를 그래프로 생각한다면 i번 노드가 X_i를 가리키는 형태로 모델링 할 수 있고 그래프에 대해서 bfs/dfs로 결과값을 전파해주면 정답이 나옵니다. 만약 가리키는 값이 비어 있으면 a<=|Q|, a!=0인 아무 a로 선택한후 출력하면 됩니다.

1시간동안 그래프로 생각을 하지 못하였어서 시간을 꽤 날린 문제인데 아쉽네요..

더보기
from collections import deque

def main():
    input=open(0).readline
    q=int(input())
    x=[*map(int,input().split())]
    t=[]
    C=None
    ans=[C]*q
    gr=[[]for _ in range(q)]
    for i in range(q):
        y=x[i]
        if y<0:
            ans[i]=str(x[-y-1])
        else:
            gr[y-1].append(i) # bfs로 전파를 위해 간선의 방향을 뒤집음
    dq=deque(i for i in range(q) if ans[i]!=C)
    #print(dq)
    while dq:
        x=dq.popleft()
        for y in gr[x]:
            ans[y]=ans[x]
            dq.append(y)
        
    print(' '.join([[x,str(q)][x==C] for x in ans]))

main()

 

후기 & 느낀점

5/10 solved로 대회 3x등을 하여 네이버페이 10000원을 받네요 ㅎㅎ

첫 오프라인 대회에 참가해보면서 오프라인 대회가 어떻게 진행되는지 느껴보는 경험이 된 것 같습니다.

해설 시간, 스팟보드로 등수 공개하기도 재밌었고 뒷풀이...를 가긴했는데 뭐음.. 사람들 본 것으로 만족합니다. 다음부터 먼저 말을 걸어야 할 것 같네요.. 말 먼저 거는게 힘들어서 한마디도 못해서 아쉽네요.

앞으로 다른 대학 대회에도 나가보면서 경험도 쌓고 사람들과도 친해지고 싶네요.

 

대회 제출 기록

 

기념품