[백준] 15904번 UCPC는 무엇의 약자일까?

[백준] 15904번 UCPC는 무엇의 약자일까?

출처: [백준] 15904번 UCPC는 무엇의 약자일까?


시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
1 초 (추가 시간 없음) 512 MB 5119 2068 1745 41.776%

문제

UCPC는 ‘전국 대학생 프로그래밍 대회 동아리 연합 여름 대회’의 줄임말로 알려져있다. 하지만 이 줄임말이 정확히 어떻게 구성되었는지는 아무도 모른다. UCPC 2018을 준비하던 ntopia는 여러 사람들에게 UCPC가 정확히 무엇의 줄임말인지 물어보았지만, 아무도 정확한 답을 제시해주지 못했다. ntopia가 들은 몇 가지 답을 아래에 적어보았다.

  • Union of Computer Programming Contest club contest
  • Union of Computer Programming contest Club contest
  • Union of Computer Programming contest club Contest
  • Union of Collegiate Programming Contest club contest
  • Union of Collegiate Programming contest Club contest
  • Union of Collegiate Programming contest club Contest
  • University Computer Programming Contest
  • University Computer Programming Club contest
  • University Computer Programming club Contest
  • University Collegiate Programming Contest
  • University CPC

ntopia는 이렇게 다양한 답을 듣고는 UCPC가 무엇의 약자인지는 아무도 모른다고 결론내렸다. 적당히 슥삭해서 UCPC를 남길 수 있으면 모두 UCPC의 약자인 것이다!

문자열이 주어지면 이 문자열을 적절히 축약해서 “UCPC”로 만들 수 있는지 확인하는 프로그램을 만들어보자.

축약이라는 것은 문자열에서 임의의 문자들을 제거하는 행동을 뜻한다. 예를 들면, “apple”에서 a와 e를 지워 “ppl”로 만들 수 있고, “University Computer Programming Contest”에서 공백과 소문자를 모두 지워 “UCPC”로 만들 수 있다.

문자열을 비교할 때는 대소문자를 구분해 정확히 비교한다. 예를 들어 “UCPC”와 “UCpC”는 다른 문자열이다. 따라서 “University Computer programming Contest”를 “UCPC”로 축약할 수 있는 방법은 없다.

그나저나 UCPC는 정말 무엇의 약자였을까? 정확히 아시는 분은 제보 부탁드립니다.


입력

첫 번째 줄에 알파벳 대소문자, 공백으로 구성된 문자열이 주어진다. 문자열의 길이는 최대 1,000자이다. 문자열의 맨 앞과 맨 끝에 공백이 있는 경우는 없고, 공백이 연속해서 2번 이상 주어지는 경우도 없다.


출력

첫 번째 줄에 입력으로 주어진 문자열을 적절히 축약해 “UCPC”로 만들 수 있으면 “I love UCPC“를 출력하고, 만들 수 없으면 “I hate UCPC“를 출력한다.


예제 입력 1

1
Union of Computer Programming Contest club contest

예제 출력 1

1
I love UCPC

예제 입력 2

1
University Computer Programming

예제 출력 2

1
I hate UCPC

출처


알고리즘 분류


소스코드

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

input = sys.stdin.readline

string = input().rstrip()

check_alpha = ['U', 'C', 'P', 'C']

flag = True
for alpha in check_alpha:
if alpha in string:
string = string[string.index(alpha) + 1:]
else:
flag = False
break

print("I love UCPC") if flag else print("I hate UCPC")

[백준] 1543번 문서 검색

[백준] 1543번 문서 검색

출처: [백준] 1543번 문서 검색


시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
2 초 128 MB 10226 3896 3092 37.671%

문제

세준이는 영어로만 이루어진 어떤 문서를 검색하는 함수를 만들려고 한다. 이 함수는 어떤 단어가 총 몇 번 등장하는지 세려고 한다. 그러나, 세준이의 함수는 중복되어 세는 것은 빼고 세야 한다. 예를 들어, 문서가 abababa이고, 그리고 찾으려는 단어가 ababa라면, 세준이의 이 함수는 이 단어를 0번부터 찾을 수 있고, 2번부터도 찾을 수 있다. 그러나 동시에 셀 수는 없다.

세준이는 문서와 검색하려는 단어가 주어졌을 때, 그 단어가 최대 몇 번 중복되지 않게 등장하는지 구하는 프로그램을 작성하시오.


입력

첫 번째 줄에 알파벳 대소문자, 공백으로 구성된 문자열이 주어진다. 문자열의 길이는 최대 1,000자이다. 문자열첫째 줄에 문서가 주어진다. 문서의 길이는 최대 2500이다. 둘째 줄에 검색하고 싶은 단어가 주어진다. 이 길이는 최대 50이다. 문서와 단어는 알파벳 소문자와 공백으로 이루어져 있다.


출력

첫째 줄에 중복되지 않게 최대 몇 번 등장하는지 출력한다.


예제 입력 1

1
2
ababababa
aba

예제 출력 1

1
2

예제 입력 2

1
2
a a a a a
a a

예제 출력 2

1
2

출처


알고리즘 분류


소스코드1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import sys
from collections import Counter

input = sys.stdin.readline

doc = input().rstrip()
word = input().rstrip()
doc = doc.replace(word, "?")

temp = dict(Counter(list(doc)))
if '?' in temp:
print(temp['?'])
else:
print(0)

소스코드2

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

input = sys.stdin.readline

doc = input().rstrip()
word = input().rstrip()

count = 0
idx = 0

while idx <= len(doc) - len(word):
if doc[idx:idx + len(word)] == word:
count += 1
idx += len(word)
else:
idx += 1
print(count)

[백준] 2810번 컵홀더

[백준] 2810번 컵홀더

출처: [백준] 2810번 컵홀더


시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
1 초 128 MB 5819 2412 2094 40.787%

문제

십년이면 강산이 변한다.

강산이네 동네에 드디어 극장이 생겼고, 강산이는 극장에 놀러갔다. 매점에서 콜라를 산 뒤, 자리에 앉은 강산이는 큰 혼란에 빠졌다. 양쪽 컵홀더를 이미 옆 사람들이 차지했기 때문에 콜라를 꽂을 컵 홀더가 없었기 때문이다. 영화를 보는 내내 콜라를 손에 들고 있던 강산이는 극장에 다시 왔을 때는 꼭 콜라를 컵 홀더에 놓겠다는 다짐을 한 후 집에 돌아갔다.

극장의 한 줄에는 자리가 N개가 있다. 서로 인접한 좌석 사이에는 컵홀더가 하나씩 있고, 양 끝 좌석에는 컵홀더가 하나씩 더 있다. 또, 이 극장에는 커플석이 있다. 커플석 사이에는 컵홀더가 없다.

극장의 한 줄의 정보가 주어진다. 이때, 이 줄에 사람들이 모두 앉았을 때, 컵홀더에 컵을 꽂을 수 있는 최대 사람의 수를 구하는 프로그램을 작성하시오. 모든 사람은 컵을 한 개만 들고 있고, 자신의 좌석의 양 옆에 있는 컵홀더에만 컵을 꽂을 수 있다.

S는 일반 좌석, L은 커플석을 의미하며, L은 항상 두개씩 쌍으로 주어진다.

어떤 좌석의 배치가 SLLLLSSLL일때, 컵홀더를 *로 표시하면 아래와 같다.

1
*S*LL*LL*S*S*LL*

위의 예에서 적어도 두 명은 컵홀더를 사용할 수 없다.


입력

첫째 줄에 좌석의 수 N이 주어진다. (1 ≤ N ≤ 50) 둘째 줄에는 좌석의 정보가 주어진다.


출력

컵을 컵홀더에 놓을 수 있는 최대 사람의 수를 출력한다.


예제 입력 1

1
2
3
SSS

예제 출력 1

1
3

예제 입력 2

1
2
4
SLLS

예제 출력 2

1
4

예제 입력 3

1
2
9
SLLLLSSLL

예제 출력 3

1
7

출처


알고리즘 분류


소스코드

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

input = sys.stdin.readline

N = int(input())
seats = input().rstrip()

couples = seats.count('LL')

if couples < 2:
print(len(seats))
else:
print(len(seats) - couples + 1)

[백준] 10820번 문자열 분석

[백준] 10820번 문자열 분석

출처: [백준] 10820번 문자열 분석


시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
1 초 256 MB 16180 6710 5581 42.714%

문제

문자열 N개가 주어진다. 이때, 문자열에 포함되어 있는 소문자, 대문자, 숫자, 공백의 개수를 구하는 프로그램을 작성하시오.

각 문자열은 알파벳 소문자, 대문자, 숫자, 공백으로만 이루어져 있다.


입력

첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 거스름돈 C를 나타내는 정수 하나로 이루어져 있다. C의 단위는 센트이다. (1달러 = 100센트) (1<=C<=500)


출력

첫째 줄부터 N번째 줄까지 문자열이 주어진다. (1 ≤ N ≤ 100) 문자열의 길이는 100을 넘지 않는다.


예제 입력 1

1
2
3
4
This is String
SPACE 1 SPACE
S a M p L e I n P u T
0L1A2S3T4L5I6N7E8

예제 출력 1

1
2
3
4
10 2 0 2
0 10 1 8
5 6 0 16
0 8 9 0

출처


알고리즘 분류


소스코드

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

while True:
input_string = input().rstrip('\n')

if not input_string:
break

lower, upper, digit, space = 0, 0, 0, 0

for ch in input_string:
if ch.islower():
lower += 1
elif ch.isupper():
upper += 1
elif ch.isdigit():
digit += 1
elif ch.isspace():
space += 1

print(f"{lower} {upper} {digit} {space}")

[백준] 13417번 카드 문자열

[백준] 13417번 카드 문자열

출처: [백준] 13417번 카드 문자열


시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
1 초 256 MB 1290 798 696 65.108%

문제

N장의 카드가 일렬로 놓여있다. 각 카드에는 알파벳이 하나씩 적혀있다. 태욱이는 가장 왼쪽에 있는 카드부터 차례대로 한 장씩 가져올 수 있다. 가장 처음에 가져온 카드는 자신의 앞에 놓는다. 그다음부터는 가져온 카드를 자신의 앞에 놓인 카드들의 가장 왼쪽, 또는 가장 오른쪽에 놓는다. 태욱이는 모든 카드를 다 가져온 후에 자신의 앞에 놓인 카드를 순서대로 이어 붙여 카드 문자열을 만들려고 한다.

예를 들어 3장의 카드가 [M, K, U] 순으로 놓여있다고 하자. 태욱이는 먼저 가장 왼쪽에 있는 “M”이 적힌 카드를 가져와서 자신의 앞에 놓는다. 다음으로 남은 카드 중 가장 왼쪽에 있는 “K”가 적힌 카드를 가져와서 가장 왼쪽에 두고, 이어서 “U”가 적힌 카드를 가져와서 다시 가장 왼쪽에 두면 “UKM”이라는 문자열을 만들 수 있다. 만약 “K”가 적힌 카드를 가져와서 가장 왼쪽에 두고, 이어서 “U”가 적힌 카드를 가져와서 가장 오른쪽에 두면 “KMU”라는 문자열을 만들 수 있다. 이때, 태욱이가 만들 수 있는 문자열 중 사전 순으로 가장 빠른 문자열은 “KMU”이다.

N장의 카드에 적혀있는 알파벳의 처음 순서가 주어질 때, 태욱이가 만들 수 있는 카드 문자열 중 사전 순으로 가장 빠른 문자열을 출력하는 프로그램을 작성하시오.


입력

입력 데이터는 표준 입력을 사용한다. 입력은 T개의 테스트 데이터로 구성된다. 입력의 첫째 줄에 테스트 케이스의 개수를 나타내는 자연수 T가 주어진다. 각각의 테스트 케이스의 첫째 줄에 처음에 놓여있는 카드의 개수 N(1 ≤ N ≤ 1,000)이 주어진다. 두 번째 줄에는 N장의 카드에 적힌 알파벳의 초기 순서가 주어진다. 가장 왼쪽에 있는 카드에 적혀있는 알파벳부터 순서대로 N개가 공백으로 구분되어 주어진다. 모든 카드에는 한 개씩의 알파벳이 적혀있으며, 모두 대문자이다.


출력

출력은 표준 출력을 사용한다. 입력받은 데이터에 대해, 한 줄에 1개씩 태욱이가 만들 수 있는 문자열 중에서 사전 순으로 가장 빠른 문자열을 출력한다.


예제 입력 1

1
2
3
4
5
6
7
3
3
M K U
5
A S D F G
7
B A C A B A C

예제 출력 1

1
2
3
KMU
ASDFG
AAABCBC

출처


알고리즘 분류


소스코드

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

input = sys.stdin.readline

T = int(input())
for _ in range(T):
N = int(input())
card_list = deque(input().rstrip().split())
new_list = deque(card_list.popleft())

while card_list:
temp = card_list.popleft()
if temp > new_list[0]:
new_list.append(temp)
else:
new_list.appendleft(temp)

print(''.join(new_list))

[백준] 4889번 안정적인 문자열

[백준] 4889번 안정적인 문자열

출처: [백준] 4889번 안정적인 문자열


시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
1 초 128 MB 2235 1068 890 46.793%

문제

여는 괄호와 닫는 괄호만으로 이루어진 문자열이 주어진다. 여기서 안정적인 문자열을 만들기 위한 최소 연산의 수를 구하려고 한다. 안정적인 문자열의 정의란 다음과 같다.

1
2
3
4
5
1. 빈 문자열은 안정적이다.
2. S가 안정적이라면, {S}도 안정적인 문자열이다.
3. S와 T가 안정적이라면, ST(두 문자열의 연결)도 안정적이다.

{}, {}{}, {{}{}}는 안정적인 문자열이지만, }{, {{}{, {}{는 안정적인 문자열이 아니다.

문자열에 행할 수 있는 연산은 여는 괄호를 닫는 괄호로 바꾸거나, 닫는 괄호를 여는 괄호로 바꾸는 것 2가지이다.


입력

입력은 여러 개의 데이터 세트로 이루어져 있다. 각 데이터 세트는 한 줄로 이루어져 있다. 줄에는 여는 괄호와 닫는 괄호만으로 이루어진 문자열이 주어진다. 문자열의 길이가 2000을 넘는 경우는 없고, 항상 길이는 짝수이다.

입력의 마지막 줄은 ‘-‘가 한 개 이상 주어진다.


출력

각 테스트 케이스에 대해서, 테스트 케이스 번호와 입력으로 주어진 문자열을 안정적으로 바꾸는데 필요한 최소 연산의 수를 출력한다.


예제 입력 1

1
2
3
4
}{
{}{}{}
{{{}
---

예제 출력 1

1
2
3
1. 2
2. 0
3. 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
25
26
import math
import sys

input = sys.stdin.readline
i = 0
while True:
i += 1
input_string = list(input().rstrip())

if input_string[0] == '-':
break
else:
open_bracket = []
close_bracket = []
for x in input_string:
if x == '{':
open_bracket.append(x)
elif x == '}':
if open_bracket:
open_bracket.pop()
else:
close_bracket.append(x)

count = math.ceil(len(open_bracket) / 2) + math.ceil(len(close_bracket) / 2)
print(f"{i}. {count}")

[백준] 2257번 화학식량

[백준] 2257번 화학식량

출처: [백준] 2257번 화학식량


시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
2 초 128 MB 1931 617 474 35.268%

문제

우리가 널리 사용하는 H2O(물), CH3COOH(아세트산)과 같은 화학식은 알파벳과 숫자, 그리고 괄호로 구성된다. 먼저 알파벳은 원자를 나타내는 것으로 H는 수소(Hydrogen), C는 탄소(Carbon), O는 산소(Oxygen) 원자를 뜻한다. 또한 원자를 나타내는 알파벳 뒤에 따르는 숫자는 그 원자가 몇 개 포함되어 있는지를 뜻한다. 따라서 COOHHH 분자는 CO2H3로 나타낼 수 있다. 이 문제에서, 숫자는 항상 2 이상 9 이하로만 입력으로 주어진다. 따라서 CO23과 같이 숫자가 두자리인 경우는 없다.

물의 화학식을 보고 물은 두 개의 수소 원자와 한 개의 산소 원자로 이루어졌음을 알 수 있다. 또한 아세트산의 화학식처럼 한 종류의 알파벳이 화학식에 여러 번 나타날 수도 있다. 실제 화학식 또한 이렇게 사용되는데, 이는 분자의 결합 구조를 나타내기 위함이다.

종종 화학식에는 괄호가 사용되기도 하는데 괄호로 묶인 원자들은 하나의 새로운 원자와 같은 작용을 한다. 따라서 CH(CO2H)(CO2H)(CO2H) 분자는 CH(CO2H)3와 같이 나타낼 수 있다. 괄호 안에 아무런 알파벳도 없는 경우도 있을 수 있는데, 이런 경우는 괄호가 없는 경우와 마찬가지라고 생각하면 된다.

이러한 화학식을 보고 우리는 화학식량을 계산할 수 있는데, 화학식량이란 그 화학식에 포함되어 있는 모든 원자들의 질량의 합을 말한다. 수소 원자 하나의 질량은 1, 탄소 원자 하나의 질량은 12, 산소 원자 하나의 질량은 16이다. 물은 두 개의 수소 원자와 한 개의 산소 원자로 이루어져 있으므로 물의 화학식량은 18이다.

화학식이 주어졌을 때, 이 화학식의 화학식량을 계산하는 프로그램을 작성하시오. 화학식은 수소, 탄소, 산소만을 포함하고 있는 것만이 입력으로 주어진다.


입력

첫째 줄에 화학식이 주어진다. 화학식은 H, C, O, (, ), 2, 3, 4, 5, 6, 7, 8, 9만으로 이루어진 문자열이며, 그 길이는 100을 넘지 않는다.


출력

첫째 줄에 화학식량을 출력한다. 분자량이 10,000이 넘는 고분자는 입력으로 주어지지 않는다.


예제 입력 1

1
(H)2(O)

예제 출력 1

1
18

출처


알고리즘 분류


소스코드

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

input = sys.stdin.readline

input_string = list(input().rstrip())

values = {'H': 1, 'C': 12, 'O': 16}
stack = []
tmp = 0
for x in input_string:
if x == '(':
stack.append(x)
elif x == ')':
tmp = 0
while stack[-1] != '(':
num = stack.pop()
tmp += num
stack.pop()
stack.append(tmp)
elif x.isdigit():
tmp = stack.pop()
stack.append(tmp * int(x))
else:
stack.append(values[x])

print(sum(stack))

[백준] 11899번 괄호 끼워넣기

[백준] 11899번 괄호 끼워넣기

출처: [백준] 11899번 괄호 끼워넣기


시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
1 초 32 MB 864 586 498 69.071%

문제

심심한 승현이는 너무 심심한 나머지 올바른 괄호열을 가지고 놀고 있었습니다.

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

그러다가 어쩌다 보니 괄호열을 부러뜨렸습니다.

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

크게 낙담한 승현이는 노력해 보았지만, 대부분이 부러져 버려 단 한 부분만 재사용할 수 있다는 것을 깨닫게 되었습니다.

1
)))()

승현이는 이 괄호열을 가지고 놀려고 했으나 올바른 괄호열이 아니기 때문에 행복하지 않았습니다. 이를 보던 지학이는 승현이에게 “그러면 앞과 뒤에 적절하게 괄호를 붙이면 올바른 괄호열이 되지 않을까?”라고 했고, 승현이는 조금 생각한 뒤 그렇게 하기로 했습니다. 예를 들어, 위의 올바르지 않은 괄호열의 경우 앞에 여는 괄호 3개를 붙이면 올바른 괄호열이 됩니다.

1
((()))()

그러나 괄호열을 사서 붙이는 데에는 돈이 들고 많이 붙일수록 놀기가 불편해지기 때문에, 승현이는 가능한 한 괄호열을 적게 추가하려고 합니다.

승현이가 망가뜨리고 사용 가능한 올바르지 않은 괄호열이 주어질 때, 올바른 괄호열으로 만들기 위해 앞과 뒤에 붙여야 할 괄호의 최소 개수를 구하는 프로그램을 작성하세요.


입력

첫 번째 줄에 올바르지 않은 괄호열 S가 주어집니다. S의 길이는 1 이상 50 이하입니다.


출력

첫 번째 줄에 S를 올바른 괄호열으로 만들기 위해 앞과 뒤에 붙여야 할 괄호의 최소 개수를 출력합니다. 불가능한 경우는 주어지지 않습니다.


예제 입력 1

1
)))()

예제 출력 1

1
3

예제 입력 2

1
)(()

예제 출력 2

1
2

예제 입력 3

1
))()((

예제 출력 3

1
4

예제 입력 4

1
)(()(()))

예제 출력 4

1
1

힌트

괄호열이란 여는 괄호 ‘(’와 닫는 괄호 ‘)’로만 구성된 문자열을 말합니다.

올바른 괄호열은 아래와 같이 정의할 수 있습니다.

  • “()”는 올바른 괄호열입니다.
  • A가 올바른 괄호열이라면 “(A)” 역시 올바른 괄호열입니다.
  • A와 B가 모두 올바른 괄호열이라면 “AB” 역시 올바른 괄호열입니다.

출처


알고리즘 분류


소스코드

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

input = sys.stdin.readline

input_string = list(input().rstrip())

left = []
right = []

for x in input_string:
if x == '(':
left.append(x)
elif x == ')':
if left:
left.pop()
else:
right.append(x)

print(len(left) + len(right))

[백준] 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)))

[백준] 9322번 철벽 보안 알고리즘

[백준] 9322번 철벽 보안 알고리즘

출처: [백준] 9322번 철벽 보안 알고리즘


시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
1 초 256 MB 1389 853 679 63.045%

문제

소희는 공개키와 개인키 한 쌍으로 보안을 유지하는 것이 매우 불편하다고 생각했다. 그래서 소희는 공개키만을 이용하는 암호화 체계를 개발했다. 이를 “철벽 보안 알고리즘”이라고 부르기로 했다. 알고리즘은 다음과 같다.

한 단어는 1~10개의 대문자(A-Z)들로 이루어진 문자열이다. 한 문장은 공백으로 구분된 단어들로 이루어졌다.

제 1 공개키는 최대 한 번만 사용된 단어들로 되어있다.

제 2 공개키는 제 1 공개키의 단어들을 재배치하여 만들어진다.

평문(암호화 되지 않은 문장)은 제 1 공개키와 같이 여러 단어들로 되어있지만, 제 1 공개키와 다르게 각 단어들은 중복이 가능하다.

암호문(암호화 된 문장)은 평문을 제 2 공개키를 만든 규칙의 반대로 재배치하여 만들어진다.

주어진 2개의 공개키와 암호문으로 평문을 복구하라.


입력

입력의 첫 줄에는 테스트 케이스의 수를 의미하는 하나의 정수가 입력된다. 정수는 100을 넘지 않는다.

각 테스트케이스마다 아래 항목들을 한 줄씩 입력받는다.

  • 한 문장의 단어 수 n (1 ≤ n ≤ 1 000)
  • 제 1 공개키
  • 제 2 공개키
  • 암호문

모든 단어들은 최소 1개, 최대 10개의 대문자들로 이루어져있다.


출력

각 케이스마다

  • 암호문을 해독한 평문

을 한 줄에 줄력한다.


예제 입력 1

1
2
3
4
5
6
7
8
9
2
4
A B C D
D A B C
C B A P
3
SECURITY THROUGH OBSCURITY
OBSCURITY THROUGH SECURITY
TOMORROW ATTACK WE

예제 출력 1

1
2
B A P C
WE ATTACK TOMORROW

출처

img


알고리즘 분류


소스코드

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

input = sys.stdin.readline

T = int(input())

for _ in range(T):
N = int(input())
first_public_key = list(input().split())
second_public_key = list(input().split())
cipher_text = list(input().split())

rule = []
for i in range(N):
rule.append(second_public_key.index(first_public_key[i]))

for i in rule:
print(cipher_text[i], end=' ')