SSPC 2차

2차는 1차와 다르게 브론즈 문제 2개, 실버 문제 2개, 골드 문제 하나로 구성됩니다.
2차까지의 스코어보드를 확인하고, 문제 풀이를 적어보겠습니다.


2차 스코어보드

랭킹 아이디 A B C D E  
1 skuru 1 / 1 1 / 9 2 / 46 1 / 66 1 / 47 5 / 169
2 skysky_noob 1 / 3 1 / 44 1 / -- 0 / -- 1 / 27 3 / 74
3 cws111204 1 / 28 5 / 106 6 / -- 0 / -- 0 / -- 2 / 134
4 skipperkim307 5 / 133 1 / 79 0 / -- 0 / -- 0 / -- 2 / 212

전체 순위

순위 아이디 맞힌 문제 / 페널티
1 skuru 10 / 372
2 skysky_noob 8 / 230
3 cws111204 4 / 310
4 skipperkim307 4 / 388

문제 풀이

A. 지영 공주님의 마법 거울

브론즈 III 브론즈 III

그냥 구현 문제입니다.

Python 코드
1
2
3
4
5
6
7
8
9
10
11
n = int(input())

ji0 = [input() for _ in range(n)]
k = int(input())

if k == 1:
    print(*ji0, sep="\n")
elif k == 2:
    print(*(map(lambda x: x[::-1], ji0)), sep="\n")
else:
    print(*reversed(ji0), sep="\n")

B. 빙글빙글 스네일

브론즈 I 브론즈 I

약간 복잡한 구현 문제입니다.

위쪽, 오른쪽, 아래쪽, 왼쪽을 순서대로 0, 1, 2, 3으로 정하고
진행방향을 ward변수에 넣습니다. (초기엔 0)

한 방향으로 움직이는 최대 길이를 k로 정합니다. (초기엔 1)
이제 n은 더 움직일 수 있는 길이를 뜻합니다.
한 번 움직일 때마다 움직인 거리를 n에서 빼 줍니다.

오른쪽(1) 혹은 왼쪽(3)으로 간 경우엔 k를 1 더해 줍니다.

Python 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
n = int(input())

x, y = 0, 0
k = 1
ward = 0

while n:
    if ward == 0:
        y += min(k, n)
    elif ward == 1:
        x += min(k, n)
    elif ward == 2:
        y -= min(k, n)
    elif ward == 3:
        x -= min(k, n)

    if n < k:
        break
    n -= k

    if ward == 1 or ward == 3:
        k += 1
    ward += 1
    ward %= 4

print(x, y)

C. 효빈이의 과외

실버 IV 실버 IV

행렬 곱셈을 구현하는 문제입니다.

Python 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
n = int(input())


def mul(A, B):
    C = [[0] * len(B[0]) for _ in range(len(A))]
    for i in range(len(A)):
        for j in range(len(B[0])):
            for k in range(len(A[0])):
                C[i][j] += A[i][k] * B[k][j]
            C[i][j] %= 1000000007
    return C


x, y = map(int, input().split())
matrix = [list(map(int, input().split())) for _ in range(x)]

for _ in range(n - 1):
    x, y = map(int, input().split())
    if len(matrix[0]) != x:
        print(-1)
        exit(0)

    m = [list(map(int, input().split())) for _ in range(x)]

    matrix = mul(matrix, m)
ans = 0
for r in matrix:
    ans += sum(r)
print(ans % 1000000007)


D. 출력 형식이 잘못되었습니다

실버 II 실버 II

정규 표현식을 이용하는 문제입니다.
문제의 조건에 맞게 정규표현식을 이용해 문자열의 일부를 대체한 후 비교하면 됩니다.

Python 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import re
import sys

input = lambda: sys.stdin.readline().rstrip()


def minify(s: str):
    s = re.sub(r"\s*[({[]\s*", "(", s)
    s = re.sub(r"\s*[)}\]]\s*", ")", s)
    s = re.sub(r"\s*\.\s*", ".", s)
    s = re.sub(r"\s*[,;]\s*", ",", s)
    s = re.sub(r"\s*:\s*", ":", s)
    s = re.sub(r"\s+", " ", s)

    return s


for k in range(1, int(input()) + 1):
    s1 = input().strip().lower()
    s2 = input().strip().lower()

    print(f"Data Set {k}: ", end="")
    print("equal" if minify(s1) == minify(s2) else "not equal")
    print()

E. 공의 충돌

골드 V 골드 V

공에 각각 번호를 붙여줍시다. 1, 2, 3, …
그럼 공이 충돌하는 과정은 공이 서로 번호를 교환하고 갈 길 가는 것으로 바꾸어 해석할 수 있습니다.

인덱스가 작은 공이 인덱스가 큰 공과 부딫히는 횟수만 세면 중복을 제거할 수 있습니다. 이 횟수를 4로 나누면 답이 됩니다.
어떤 두 공이 마주볼 경우가 전체 경우의 1/4이기 때문입니다.

Python 코드
1
2
3
4
5
6
7
8
9
10
11
12
n = int(input())
pos = list(map(int, input().split()))
t = int(input())
ans = 0

for i in range(n):
    for j in range(i + 1, n):

        if abs(pos[i] - pos[j]) <= t * 2:
            ans += 1

print(ans / 4)

SSPC 2차