[백준] 2304번 창고 다각형

[백준] 2304번 창고 다각형

출처: [백준] 2304번 창고 다각형


시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
2 초 128 MB 4418 1870 1510 44.360%

문제

N 개의 막대 기둥이 일렬로 세워져 있다. 기둥들의 폭은 모두 1 m이며 높이는 다를 수 있다. 이 기둥들을 이용하여 양철로 된 창고를 제작하려고 한다. 창고에는 모든 기둥이 들어간다. 이 창고의 지붕을 다음과 같이 만든다.

  1. 지붕은 수평 부분과 수직 부분으로 구성되며, 모두 연결되어야 한다.
  2. 지붕의 수평 부분은 반드시 어떤 기둥의 윗면과 닿아야 한다.
  3. 지붕의 수직 부분은 반드시 어떤 기둥의 옆면과 닿아야 한다.
  4. 지붕의 가장자리는 땅에 닿아야 한다.
  5. 비가 올 때 물이 고이지 않도록 지붕의 어떤 부분도 오목하게 들어간 부분이 없어야 한다.

그림 1은 창고를 옆에서 본 모습을 그린 것이다. 이 그림에서 굵은 선으로 표시된 부분이 지붕에 해당되고, 지붕과 땅으로 둘러싸인 다각형이 창고를 옆에서 본 모습이다. 이 다각형을 창고 다각형이라고 하자.

img

그림1 . 기둥과 지붕(굵은 선)의 예

창고 주인은 창고 다각형의 면적이 가장 작은 창고를 만들기를 원한다. 그림 1에서 창고 다각형의 면적은 98 ㎡이고, 이 경우가 가장 작은 창고 다각형이다.

기둥들의 위치와 높이가 주어질 때, 가장 작은 창고 다각형의 면적을 구하는 프로그램을 작성하시오.


입력

첫 줄에는 기둥의 개수를 나타내는 정수 N이 주어진다. N은 1 이상 1,000 이하이다. 그 다음 N 개의 줄에는 각 줄에 각 기둥의 왼쪽 면의 위치를 나타내는 정수 L과 높이를 나타내는 정수 H가 한 개의 빈 칸을 사이에 두고 주어진다. L과 H는 둘 다 1 이상 1,000 이하이다.


출력

첫 줄에 창고 다각형의 면적을 나타내는 정수를 출력한다.


예제 입력 1

1
2
3
4
5
6
7
8
7
2 4
11 4
15 8
4 6
5 3
8 10
13 6

예제 출력 1

1
98

출처


알고리즘 분류


소스코드

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
import sys

input = sys.stdin.readline

N = int(input())
pillars = []
for _ in range(N):
idx, height = map(int, input().split())
pillars.append((idx, height))

pillars.sort(key=lambda x: x[0]) # 정렬

max_pillar = max(pillars, key=lambda x: x[1]) # 가장 높은 기둥찾기

# 땅에 기둥세우기
area = [0] * (pillars[-1][0] + 1)
for idx, height in pillars:
area[idx] = height
max_index = area.index(max_pillar[1]) # 높은 기둥의 인덱스찾기

temp = 0
total = 0
# 왼쪽부터 가장 높은 기둥까지
for i in range(max_index + 1):
if area[i] > temp:
temp = area[i]
total += temp

temp = 0
# 오른쪽부터 가장높은 기둥까지
for i in range(pillars[-1][0], max_index, -1):
if area[i] > temp:
temp = area[i]
total += temp

print(total)

[백준] 12605번 단어순서 뒤집기

[백준] 12605번 단어순서 뒤집기

출처: [백준] 12605번 단어순서 뒤집기


시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
5 초 512 MB 1349 822 710 61.525%

문제

스페이스로 띄어쓰기 된 단어들의 리스트가 주어질때, 단어들을 반대 순서로 뒤집어라. 각 라인은 w개의 영단어로 이루어져 있으며, 총 L개의 알파벳을 가진다. 각 행은 알파벳과 스페이스로만 이루어져 있다. 단어 사이에는 하나의 스페이스만 들어간다.


입력

첫 행은 N이며, 전체 케이스의 개수이다.

N개의 케이스들이 이어지는데, 각 케이스는 스페이스로 띄어진 단어들이다. 스페이스는 라인의 처음과 끝에는 나타나지 않는다. N과 L은 다음 범위를 가진다.

  • N = 5
  • 1 ≤ L ≤ 25

출력

각 케이스에 대해서, 케이스 번호가 x일때 “Case #x: “ 를 출력한 후 그 후에 이어서 단어들을 반대 순서로 출력한다.


예제 입력 1

1
2
3
4
3
this is a test
foobar
all your base

예제 출력 1

1
2
3
Case #1: test a is this
Case #2: foobar
Case #3: base your all

출처


알고리즘 분류


소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
import sys

input = sys.stdin.readline

N = int(input())

for i in range(N):
sentence = list(input().rstrip().split())
result = []
while sentence:
result.append(sentence.pop())
print('Case #{0}: {1}'.format(i + 1, ' '.join(result)))

[백준] 5397번 키로거

[백준] 5397번 키로거

출처: [백준] 5397번 키로거


시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
1 초 256 MB 27893 7211 4761 24.497%

문제

창영이는 강산이의 비밀번호를 훔치기 위해서 강산이가 사용하는 컴퓨터에 키로거를 설치했다. 며칠을 기다린 끝에 창영이는 강산이가 비밀번호 창에 입력하는 글자를 얻어냈다.

키로거는 사용자가 키보드를 누른 명령을 모두 기록한다. 따라서, 강산이가 비밀번호를 입력할 때, 화살표나 백스페이스를 입력해도 정확한 비밀번호를 알아낼 수 있다.

강산이가 비밀번호 창에서 입력한 키가 주어졌을 때, 강산이의 비밀번호를 알아내는 프로그램을 작성하시오.


입력

첫째 줄에 테스트 케이스의 개수가 주어진다. 각 테스트 케이스는 한줄로 이루어져 있고, 강산이가 입력한 순서대로 길이가 L인 문자열이 주어진다. (1 ≤ L의 길이 ≤ 1,000,000) 강산이가 백스페이스를 입력했다면, ‘-‘가 주어진다. 이때 커서의 바로 앞에 글자가 존재한다면, 그 글자를 지운다. 화살표의 입력은 ‘<’와 ‘>’로 주어진다. 이때는 커서의 위치를 움직일 수 있다면, 왼쪽 또는 오른쪽으로 1만큼 움직인다. 나머지 문자는 비밀번호의 일부이다. 물론, 나중에 백스페이스를 통해서 지울 수는 있다. 만약 커서의 위치가 줄의 마지막이 아니라면, 커서 및 커서 오른쪽에 있는 모든 문자는 오른쪽으로 한 칸 이동한다.


출력

각 테스트 케이스에 대해서, 강산이의 비밀번호를 출력한다. 비밀번호의 길이는 항상 0보다 크다.


예제 입력 1

1
2
3
2
<<BP<A>>Cd-
ThIsIsS3Cr3t

예제 출력 1

1
2
BAPC
ThIsIsS3Cr3t

출처


알고리즘 분류


소스코드

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
50
51
52
53
54
55
56
import sys

input = sys.stdin.readline

T = int(input())

for _ in range(T):
stack = list(input().rstrip())
left, right = [], []

for x in stack:
if x == '<':
if left:
right.append(left.pop())
elif x == '>':
if right:
left.append(right.pop())
elif x == '-':
if left:
left.pop()
else:
left.append(x)

if right:
left.extend(reversed(right))

print(''.join(left))



----------------시간초과-------------------
import sys

input = sys.stdin.readline

T = int(input())

for _ in range(T):
stack = list(input().rstrip())
password = []

cur = 0
while stack:
temp = stack.pop()
if temp == '-' and stack:
stack.pop()
elif temp == '>':
cur -= 1
elif temp == '<':
cur += 1
else:
password.insert(cur, temp)
cur = 0

print(''.join(password))

[백준] 17608번 막대기

[백준] 17608번 막대기

출처: [백준] 17608번 막대기


시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
1 초 (추가 시간 없음) 512 MB 6130 2829 2254 48.162%

문제

아래 그림처럼 높이만 다르고 (같은 높이의 막대기가 있을 수 있음) 모양이 같은 막대기를 일렬로 세운 후, 왼쪽부터 차례로 번호를 붙인다. 각 막대기의 높이는 그림에서 보인 것처럼 순서대로 6, 9, 7, 6, 4, 6 이다. 일렬로 세워진 막대기를 오른쪽에서 보면 보이는 막대기가 있고 보이지 않는 막대기가 있다. 즉, 지금 보이는 막대기보다 뒤에 있고 높이가 높은 것이 보이게 된다. 예를 들어, 그림과 같은 경우엔 3개(6번, 3번, 2번)의 막대기가 보인다.

img

N개의 막대기에 대한 높이 정보가 주어질 때, 오른쪽에서 보아서 몇 개가 보이는지를 알아내는 프로그램을 작성하려고 한다.


입력

첫 번째 줄에는 막대기의 개수를 나타내는 정수 N (2 ≤ N ≤ 100,000)이 주어지고 이어지는 N줄 각각에는 막대기의 높이를 나타내는 정수 h(1 ≤ h ≤ 100,000)가 주어진다.


출력

오른쪽에서 N개의 막대기를 보았을 때, 보이는 막대기의 개수를 출력한다.


예제 입력 1

1
2
3
4
5
6
7
6
6
9
7
6
4
6

예제 출력 1

1
3

예제 입력 2

1
2
3
4
5
6
5
5
4
3
2
1

예제 출력 2

1
5

출처


알고리즘 분류


소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import sys

input = sys.stdin.readline

N = int(input())

stack = [int(input()) for _ in range(N)]

max_height = 0
cnt = 0
while stack:
temp = stack.pop()
if temp > max_height:
max_height = temp
cnt += 1

print(cnt)

[백준] 3986번 좋은 단어

[백준] 3986번 좋은 단어

출처: [백준] 3986번 좋은 단어


시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
1 초 256 MB 7866 3720 3094 48.863%

문제

이번 계절학기에 심리학 개론을 수강 중인 평석이는 오늘 자정까지 보고서를 제출해야 한다. 보고서 작성이 너무 지루했던 평석이는 노트북에 엎드려서 꾸벅꾸벅 졸다가 제출 마감 1시간 전에 깨고 말았다. 안타깝게도 자는 동안 키보드가 잘못 눌려서 보고서의 모든 글자가 A와 B로 바뀌어 버렸다! 그래서 평석이는 보고서 작성을 때려치우고 보고서에서 ‘좋은 단어’나 세보기로 마음 먹었다.

평석이는 단어 위로 아치형 곡선을 그어 같은 글자끼리(A는 A끼리, B는 B끼리) 쌍을 짓기로 하였다. 만약 선끼리 교차하지 않으면서 각 글자를 정확히 한 개의 다른 위치에 있는 같은 글자와 짝 지을수 있다면, 그 단어는 ‘좋은 단어’이다. 평석이가 ‘좋은 단어’ 개수를 세는 것을 도와주자.


입력

첫째 줄에 단어의 수 N이 주어진다. (1 ≤ N ≤ 100)

다음 N개 줄에는 A와 B로만 이루어진 단어가 한 줄에 하나씩 주어진다. 단어의 길이는 2와 100,000사이이며, 모든 단어 길이의 합은 1,000,000을 넘지 않는다.


출력

첫째 줄에 좋은 단어의 수를 출력한다.


예제 입력 1

1
2
3
4
3
ABAB
AABB
ABBA

예제 출력 1

1
2

예제 입력 2

1
2
3
4
3
AAA
AA
AB

예제 출력 2

1
1

예제 입력 3

1
2
1
ABBABB

예제 출력 3

1
1

출처


알고리즘 분류


소스코드

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 sys

input = sys.stdin.readline
N = int(input())
cnt = 0

for _ in range(N):
stack = []
word = list(input().rstrip())

while word:
temp = word.pop()
if not stack:
stack.append(temp)
else:
if stack[-1] == temp:
stack.pop()
else:
stack.append(temp)
if not stack:
cnt += 1

print(cnt)

[백준] 10799번 쇠막대기

[백준] 10799번 쇠막대기

출처: [백준] 10799번 쇠막대기


시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
1 초 256 MB 25974 16167 11772 62.497%

문제

여러 개의 쇠막대기를 레이저로 절단하려고 한다. 효율적인 작업을 위해서 쇠막대기를 아래에서 위로 겹쳐 놓고, 레이저를 위에서 수직으로 발사하여 쇠막대기들을 자른다. 쇠막대기와 레이저의 배치는 다음 조건을 만족한다.

  • 쇠막대기는 자신보다 긴 쇠막대기 위에만 놓일 수 있다. - 쇠막대기를 다른 쇠막대기 위에 놓는 경우 완전히 포함되도록 놓되, 끝점은 겹치지 않도록 놓는다.
  • 각 쇠막대기를 자르는 레이저는 적어도 하나 존재한다.
  • 레이저는 어떤 쇠막대기의 양 끝점과도 겹치지 않는다.

아래 그림은 위 조건을 만족하는 예를 보여준다. 수평으로 그려진 굵은 실선은 쇠막대기이고, 점은 레이저의 위치, 수직으로 그려진 점선 화살표는 레이저의 발사 방향이다.

img

이러한 레이저와 쇠막대기의 배치는 다음과 같이 괄호를 이용하여 왼쪽부터 순서대로 표현할 수 있다.

  1. 레이저는 여는 괄호와 닫는 괄호의 인접한 쌍 ‘( ) ’ 으로 표현된다. 또한, 모든 ‘( ) ’는 반드시 레이저를 표현한다.
  2. 쇠막대기의 왼쪽 끝은 여는 괄호 ‘ ( ’ 로, 오른쪽 끝은 닫힌 괄호 ‘) ’ 로 표현된다.

위 예의 괄호 표현은 그림 위에 주어져 있다.

쇠막대기는 레이저에 의해 몇 개의 조각으로 잘려지는데, 위 예에서 가장 위에 있는 두 개의 쇠막대기는 각각 3개와 2개의 조각으로 잘려지고, 이와 같은 방식으로 주어진 쇠막대기들은 총 17개의 조각으로 잘려진다.

쇠막대기와 레이저의 배치를 나타내는 괄호 표현이 주어졌을 때, 잘려진 쇠막대기 조각의 총 개수를 구하는 프로그램을 작성하시오.


입력

한 줄에 쇠막대기와 레이저의 배치를 나타내는 괄호 표현이 공백없이 주어진다. 괄호 문자의 개수는 최대 100,000이다.


출력

잘려진 조각의 총 개수를 나타내는 정수를 한 줄에 출력한다.


예제 입력 1

1
()(((()())(())()))(())

예제 출력 1

1
17

예제 입력 2

1
(((()(()()))(())()))(()())

예제 출력 2

1
24

출처


알고리즘 분류


소스코드

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

input = sys.stdin.readline

razer = list(input().rstrip())
# print(razer)

answer = 0
stack = []

for i in range(len(razer)):
if razer[i] == '(':
stack.append('(')
else:
if razer[i - 1] == '(': # )가 왔는데 이전이 바로 (일 경우
stack.pop()
answer += len(stack)
else:
stack.pop()
answer += 1

print(answer)

[백준] 1406번 에디터

[백준] 1406번 에디터

출처: [백준] 1406번 에디터


시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
0.3 초 (하단 참고) 512 MB 48952 13490 8865 26.934%

문제

한 줄로 된 간단한 에디터를 구현하려고 한다. 이 편집기는 영어 소문자만을 기록할 수 있는 편집기로, 최대 600,000글자까지 입력할 수 있다.

이 편집기에는 ‘커서’라는 것이 있는데, 커서는 문장의 맨 앞(첫 번째 문자의 왼쪽), 문장의 맨 뒤(마지막 문자의 오른쪽), 또는 문장 중간 임의의 곳(모든 연속된 두 문자 사이)에 위치할 수 있다. 즉 길이가 L인 문자열이 현재 편집기에 입력되어 있으면, 커서가 위치할 수 있는 곳은 L+1가지 경우가 있다.

이 편집기가 지원하는 명령어는 다음과 같다.

L 커서를 왼쪽으로 한 칸 옮김 (커서가 문장의 맨 앞이면 무시됨)
D 커서를 오른쪽으로 한 칸 옮김 (커서가 문장의 맨 뒤이면 무시됨)
B 커서 왼쪽에 있는 문자를 삭제함 (커서가 문장의 맨 앞이면 무시됨) 삭제로 인해 커서는 한 칸 왼쪽으로 이동한 것처럼 나타나지만, 실제로 커서의 오른쪽에 있던 문자는 그대로임
P $ $라는 문자를 커서 왼쪽에 추가함

초기에 편집기에 입력되어 있는 문자열이 주어지고, 그 이후 입력한 명령어가 차례로 주어졌을 때, 모든 명령어를 수행하고 난 후 편집기에 입력되어 있는 문자열을 구하는 프로그램을 작성하시오. 단, 명령어가 수행되기 전에 커서는 문장의 맨 뒤에 위치하고 있다고 한다.


입력

첫째 줄에는 초기에 편집기에 입력되어 있는 문자열이 주어진다. 이 문자열은 길이가 N이고, 영어 소문자로만 이루어져 있으며, 길이는 100,000을 넘지 않는다. 둘째 줄에는 입력할 명령어의 개수를 나타내는 정수 M(1 ≤ M ≤ 500,000)이 주어진다. 셋째 줄부터 M개의 줄에 걸쳐 입력할 명령어가 순서대로 주어진다. 명령어는 위의 네 가지 중 하나의 형태로만 주어진다.


출력

첫째 줄에 모든 명령어를 수행하고 난 후 편집기에 입력되어 있는 문자열을 출력한다.


예제 입력 1

1
2
3
4
5
abcd
3
P x
L
P y

예제 출력 1

1
abcdyx

예제 입력 2

1
2
3
4
5
6
7
8
9
10
11
abc
9
L
L
L
L
L
P x
L
B
P y

예제 출력 2

1
yxabc

예제 입력 3

1
2
3
4
5
6
7
8
9
10
11
12
13
dmih
11
B
B
P x
L
B
B
B
P y
D
D
P z

예제 출력 3

1
yxz

출처


알고리즘 분류


소스코드

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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
import sys

input = sys.stdin.readline

init_string = list(input().rstrip())
N = int(input())
string2 = []

for _ in range(N):
comm = list(input().split())
if comm[0] == 'P':
init_string.append(comm[1])
elif comm[0] == 'L':
if init_string:
string2.append(init_string.pop())
elif comm[0] == 'D':
if string2:
init_string.append(string2.pop())
elif comm[0] == 'B':
if init_string:
init_string.pop()

print(''.join(init_string + list(reversed(string2))))






----------시간초과1---------------------
import sys

input = sys.stdin.readline

init_string = input().rstrip()
N = int(input())
cursor = len(init_string)
for _ in range(N):
comm = list(input().split())
if comm[0] == 'P':
init_string = init_string[0:cursor] + comm[1] + init_string[cursor:]
cursor += 1
elif comm[0] == 'L':
if not cursor == 0:
cursor -= 1
else:
continue
elif comm[0] == 'D':
if not cursor == len(init_string):
cursor += 1
else:
continue

elif comm[0] == 'B':
if cursor == 0:
continue
else:
init_string = init_string[0:cursor - 1] + init_string[cursor:]
cursor -= 1
print(''.join(init_string))



-----------시간초과2---------------
import sys

input = sys.stdin.readline

init_string = list(input().rstrip())
N = int(input())
cursor = len(init_string)
for _ in range(N):
comm = list(input().split())
if comm[0] == 'P':
init_string.insert(cursor, comm[1])
cursor += 1
elif comm[0] == 'L':
cursor -= 1
if cursor < 0:
cursor = 0
elif comm[0] == 'D':
cursor += 1
elif comm[0] == 'B':
if cursor == 0:
continue
else:
cursor -= 1
init_string.pop(cursor)

print(''.join(init_string))


[백준] 1991번 트리 순회

[백준] 1991번 트리 순회

출처: [백준] 1991번 트리 순회


시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
2 초 128 MB 25295 15857 12064 63.929%

문제

이진 트리를 입력받아 전위 순회(preorder traversal), 중위 순회(inorder traversal), 후위 순회(postorder traversal)한 결과를 출력하는 프로그램을 작성하시오.

img

예를 들어 위와 같은 이진 트리가 입력되면,

  • 전위 순회한 결과 : ABDCEFG // (루트) (왼쪽 자식) (오른쪽 자식)
  • 중위 순회한 결과 : DBAECFG // (왼쪽 자식) (루트) (오른쪽 자식)
  • 후위 순회한 결과 : DBEGFCA // (왼쪽 자식) (오른쪽 자식) (루트)

가 된다.


입력

첫째 줄에는 이진 트리의 노드의 개수 N(1≤N≤26)이 주어진다. 둘째 줄부터 N개의 줄에 걸쳐 각 노드와 그의 왼쪽 자식 노드, 오른쪽 자식 노드가 주어진다. 노드의 이름은 A부터 차례대로 영문자 대문자로 매겨지며, 항상 A가 루트 노드가 된다. 자식 노드가 없는 경우에는 .으로 표현된다.


출력

첫째 줄에 전위 순회, 둘째 줄에 중위 순회, 셋째 줄에 후위 순회한 결과를 출력한다. 각 줄에 N개의 알파벳을 공백 없이 출력하면 된다.


예제 입력 1

1
2
3
4
5
6
7
8
7
A B C
B D .
C E F
E . .
F . G
D . .
G . .

예제 출력 1

1
2
3
ABDCEFG
DBAECFG
DBEGFCA

출처

-


알고리즘 분류


소스코드

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
import sys

input = sys.stdin.readline

N = int(input())

tree = {}
for _ in range(N):
root, left, right = input().rstrip().split()
tree[root] = [left, right]


def preorder(root):
if root != '.':
print(root, end='')
preorder(tree[root][0])
preorder(tree[root][1])


def inorder(root):
if root != '.':
inorder(tree[root][0])
print(root, end='')
inorder(tree[root][1])


def postorder(root):
if root != '.':
postorder(tree[root][0])
postorder(tree[root][1])
print(root, end='')


preorder('A')
print()
inorder('A')
print()
postorder('A')

[프로그래머스] [Summer/Winter Coding 2018] 스킬트리

[프로그래머스] [Summer/Winter Coding 2018] 스킬트리

출처: [Summer/Winter Coding 2018] 스킬트리


문제

선행 스킬이란 어떤 스킬을 배우기 전에 먼저 배워야 하는 스킬을 뜻합니다.

예를 들어 선행 스킬 순서가 스파크 → 라이트닝 볼트 → 썬더일때, 썬더를 배우려면 먼저 라이트닝 볼트를 배워야 하고, 라이트닝 볼트를 배우려면 먼저 스파크를 배워야 합니다.

위 순서에 없는 다른 스킬(힐링 등)은 순서에 상관없이 배울 수 있습니다. 따라서 스파크 → 힐링 → 라이트닝 볼트 → 썬더와 같은 스킬트리는 가능하지만, 썬더 → 스파크라이트닝 볼트 → 스파크 → 힐링 → 썬더와 같은 스킬트리는 불가능합니다.

선행 스킬 순서 skill과 유저들이 만든 스킬트리1를 담은 배열 skill_trees가 매개변수로 주어질 때, 가능한 스킬트리 개수를 return 하는 solution 함수를 작성해주세요.


제한

  • 스킬은 알파벳 대문자로 표기하며, 모든 문자열은 알파벳 대문자로만 이루어져 있습니다.
  • 스킬 순서와 스킬트리는 문자열로 표기합니다.
    • 예를 들어, C → B → D 라면 “CBD”로 표기합니다
  • 선행 스킬 순서 skill의 길이는 1 이상 26 이하이며, 스킬은 중복해 주어지지 않습니다.
  • skill_trees는 길이 1 이상 20 이하인 배열입니다.
  • skill_trees의 원소는 스킬을 나타내는 문자열입니다.
    • skill_trees의 원소는 길이가 2 이상 26 이하인 문자열이며, 스킬이 중복해 주어지지 않습니다.

입출력

skill skill_trees return
"CBD" ["BACDE", "CBADF", "AECB", "BDA"] 2

입출력 예 1

  • “BACDE”: B 스킬을 배우기 전에 C 스킬을 먼저 배워야 합니다. 불가능한 스킬트립니다.
  • “CBADF”: 가능한 스킬트리입니다.
  • “AECB”: 가능한 스킬트리입니다.
  • “BDA”: B 스킬을 배우기 전에 C 스킬을 먼저 배워야 합니다. 불가능한 스킬트리입니다.

풀이

-


소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def solution(skill, skill_trees):
answer = 0

for skills in skill_trees:
skill_list = list(skill)

for s in skills:
if s in skill:
if s != skill_list.pop(0):
break
else:
answer += 1

return answer
[백준] 2002번 추월

[백준] 2002번 추월

출처: [백준] 2002번 추월


시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
2 초 128 MB 2040 894 757 44.766%

문제

대한민국을 비롯한 대부분의 나라에서는 터널 내에서의 차선 변경을 법률로 금하고 있다. 조금만 관찰력이 있는 학생이라면 터널 내부에서는 차선이 파선이 아닌 실선으로 되어 있다는 것을 알고 있을 것이다. 이는 차선을 변경할 수 없음을 말하는 것이고, 따라서 터널 내부에서의 추월은 불가능하다.

소문난 명콤비 경찰 대근이와 영식이가 추월하는 차량을 잡기 위해 한 터널에 투입되었다. 대근이는 터널의 입구에, 영식이는 터널의 출구에 각각 잠복하고, 대근이는 차가 터널에 들어가는 순서대로, 영식이는 차가 터널에서 나오는 순서대로 각각 차량 번호를 적어 두었다.

N개의 차량이 지나간 후, 대근이와 영식이는 자신들이 적어 둔 차량 번호의 목록을 보고, 터널 내부에서 반드시 추월을 했을 것으로 여겨지는 차들이 몇 대 있다는 것을 알게 되었다. 대근이와 영식이를 도와 이를 구하는 프로그램을 작성해 보자.


입력

입력은 총 2N+1개의 줄로 이루어져 있다. 첫 줄에는 차의 대수 N(1 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 대근이가 적은 차량 번호 목록이 주어지고, N+2째 줄부터 N개의 줄에는 영식이가 적은 차량 번호 목록이 주어진다. 각 차량 번호는 6글자 이상 8글자 이하의 문자열로, 영어 대문자(‘A’-‘Z’)와 숫자(‘0’-‘9’)로만 이루어져 있다.

같은 차량 번호가 두 번 이상 주어지는 경우는 없다.


출력

첫째 줄에 터널 내부에서 반드시 추월을 했을 것으로 여겨지는 차가 몇 대인지 출력한다.


예제 입력 1

1
2
3
4
5
6
7
8
9
4
ZG431SN
ZG5080K
ST123D
ZG206A
ZG206A
ZG431SN
ZG5080K
ST123D

예제 출력 1

1
1

예제 입력 2

1
2
3
4
5
6
7
8
9
10
11
5
ZG508OK
PU305A
RI604B
ZG206A
ZG232ZF
PU305A
ZG232ZF
ZG206A
ZG508OK
RI604B

예제 출력 2

1
3

예제 입력 3

1
2
3
4
5
6
7
8
9
10
11
5
ZG206A
PU234Q
OS945CK
ZG431SN
ZG5962J
ZG5962J
OS945CK
ZG206A
PU234Q
ZG431SN

예제 출력 3

1
2

출처


알고리즘 분류


소스코드

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 sys

input = sys.stdin.readline

N = int(input())

count = 0
input_car = {}
output_car = []

for i in range(N):
input_car[input().rstrip()] = i

for i in range(N):
output_car.append(input().rstrip())

for i in range(N - 1):
for j in range(i + 1, N):
if input_car[output_car[i]] > input_car[output_car[j]]:
count += 1
break

print(count)