SSPC 1차

상상코딩학원에서 프로그래밍 챌린지를 열었습니다. 대회는 총 4번에 걸쳐 진행됩니다.
1차까지의 스코어보드를 확인하고, 문제 풀이를 적어보겠습니다.


1차 스코어보드

랭킹 아이디 A B C D E  
1 skysky_noob 1 / 96 1 / 36 1 / 15 1 / 7 1 / 2 5 / 156
2 skuru 3 / 114 2 / 75 1 / 10 1 / 3 1 / 1 5 / 203
3 cws111204 0 / -- 1 / -- 0 / -- 1 / 14 1 / 7 2 / 21
4 skipperkim307 1 / -- 0 / -- 0 / -- 1 / 82 1 / 94 2 / 176

문제 풀이

A. 비행기

실버 I 실버 I

그냥 구현 문제입니다. 문제에서 하라는걸 잘 구현하면 됩니다.

C++ 코드
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <bits/stdc++.h>
using namespace std;


int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n, time = -1;
    cin >> n;

    vector<int> arrival(n);
    for (int i = 0; i < n; i++) cin >> arrival[i];
    vector<int> row(n, 0);
    set<int> not_arrived;
    for (int i = 0; i < n; i++) not_arrived.insert(i);
    vector<int> sitting(n, 0);

    while (not_arrived.size()) {
        time++;
        for (int i = 0; i < n; i++) {
            if (not_arrived.find(i) == not_arrived.end()) continue;

            if (row[i] == arrival[i]) {
                sitting[i]++;

                if (sitting[i] == 5) {
                    not_arrived.erase(i);
                    row[i] = -1;
                }
                continue;
            }

            bool blocked = false;
            for (int j = 0; j < n; j++) {
                if (row[j] == row[i] + 1) {
                    blocked = true;
                    break;
                }
            }

            if (not blocked) {
                row[i]++;
            }
        }
    }

    cout << time;
}

B. 원숭이 매달기

실버 II 실버 II

$2^{최대\ 깊이}$가 답입니다.
최대깊이는 스택을 이용해 구할 수 있습니다.
꺽쇠괄호가 한번 열릴 때마다 깊이 += 1, 닫힐 때마다 깊이 -= 1으로 구하면 됩니다.

Python 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
for _ in range(int(input())):
    s = input()
    max_depth = 0
    depth = 0

    stack = []

    for i in s:
        if i == "]":
            stack.pop()
            depth -= 1
        else:
            stack.append("[")
            depth += 1
            max_depth = max(max_depth, depth)

    print(2**max_depth)

C. 카드 뒤집기

실버 III 실버 III

빈 deque를 만들고 왼쪽에 1, 오른쪽에 2, 왼쪽에 3, 오른쪽에 4, … 같은 방법으로 넣으면 항상 모든 카드를 뒤집을 수 있습니다.

Python 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from collections import deque

print("YES")

n = int(input())

l = deque()
appendleft = True
for i in range(1, n + 1):
    if appendleft:
        l.appendleft(i)
    else:
        l.append(i)
    appendleft ^= 1

seq = [0 for _ in range(n + 1)]
for i, v in enumerate(l):
    seq[v] = i + 1

print(*l)
print(*seq[1:])

D. 슬라임 합치기

실버 III 실버 III

가장 큰 슬라임 2개를 계속 합치면 됩니다.

Python 코드
1
2
3
4
5
6
7
8
9
10
n = int(input())
slimes = sorted(map(int, input().split()))

score = 0
size = 0
for i in reversed(slimes):
    score += size * i
    size += i

print(score)

E. 謎紛芥索紀 (Small)

실버 V 실버 V

그냥 구현 문제입니다.

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

sum_ = 0
for _ in range(n):
    c, k = map(int, input().split())
    sum_ += c * k

print(sum_)

SSPC 1차