문제:

감수성이 뛰어난 음유시인 영재는 일상생활 중에 번뜩 시상이 떠오르곤 한다.

 

하지만 기억력이 좋지 못한 영재는 시상이 떠오르면 그 순간 컴퓨터로 기록해야만 안 까먹는다! 시는 대문자, 소문자 알파벳과 빈칸으로 이루어져 있따. 시상은 매번 훌륭하지만 제목 짓는 센스가 부족한 영재는 시에 나오는 단어들의 첫 글자를 대문자로 바꾼 뒤 순서대로 이어서 제목을 만든다. 만약 시의 내용이 'There is no cow level' 이라면 시의 제목은 'TINCL'이 된다.

 

시도 때도 없이 시를 기록하느라 낡아버린 영재의 키보드는 수명이 얼마 남지 않았다. 앞으로 스페이스 바와 영자판을 누를 수 있는 횟수가 정해져 있어 이를 초과하면 키보드가 수명이 다 하여 어떠한 작업도 하지 못하게 된다. 하나 다행인 점은, 키보드를 쓸 때 같은 문자가 연속으로 나오거나 빈칸이 연속으로 나오는 경우 영재는 자판을 꾹 눌러 한 번만 사용해서 키보드를 좀 더 효율적으로 쓸 수 있다. (A와 a는 다른 문자이므로 'Aa'는 2번의 a자판을 누른 것으로 한다.

 

시의 내용과 시의 제목은 Enter 키로 구분된다. 다향히 Shift 키와 Enter 키는 항상 수명이 무한한 상황이다!

 

음유시인 영재가 이번에 지은 시의 내용과 스페이스 바와 영자판을 누를 수 있는 횟수가 주어졌을 때, 시의 내용과 제목을 모두 기록할 수 있다면 시의 제목을 출력하고, 만약 키보드의 수명이 다 하여 기록을 완벽하게 못 하게 된다면 -1을 출력하여라.

입력:

첫 줄에 시의 내용이 주어진다.

 

둘째 줄에는 스페이스 바의 남은 사용 가능 횟수가 주어진다.

 

셋째 줄에는 대소문자를 구별하지 않고, 26개의 알파벳에 대한 영자판의 남은 사용 가능 횟수가 알파벳순으로 주어진다.

출력:

시의 내용과 제목을 모두 기록할 수 있다면 제목을 출력하여라.

만약 키보드의 수명이 다 하여 기록을 완벽하게 못 하게 되어 작업을 하지 못한다면 -1을 출력하여라.

풀이방법:

주어진 조건대로 구현을 해서 풀면 된다. 이 문제에서 고려해야 하는 조건들은 다음과 같다.

1. 시의 내용과 제목을 모두 작성할 수 있어야 한다.

2. 연속된 문자는 효율적으로 작성을 할 수 있지만 대,소문자 구분은 해야 한다.

 

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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
strings = input().split()
space = int(input())
counts= list(map(int,input().split()))
if len(strings)-1 > space:
    print(-1)
else:
    answer = True
    title = ''
    idx = 0
    while answer and idx < len(strings):
        string = strings[idx]
        i = 0
        while i < len(string):
            if i >= 1 and string[i]==string[i-1]:
                i+=1
                continue
            if counts[ord(string[i].lower())-97]:
                counts[ord(string[i].lower())-97]-=1
            else:
                answer = False
                break
            i+=1
        idx+=1
        if answer:
            title += string[0].upper()
    if answer:
        temp = title.lower()
        i = 0
        while i < len(temp):
            if i >= 1 and temp[i]==temp[i-1]:
                i+=1
                continue
            if counts[ord(temp[i])-97]:
                counts[ord(temp[i])-97]-=1
            else:
                answer = False
                break
            i+=1
        if answer:
            print(title)
        else:
            print(-1)
    else:
        print(-1)
cs

문제링크:

www.acmicpc.net/problem/19948

 

19948번: 음유시인 영재

감수성이 뛰어난 음유시인 영재는 일상생활 중에 번뜩 시상이 떠오르곤 한다. 하지만 기억력이 좋지 못한 영재는 시상이 떠오르면 그 순간 컴퓨터로 기록해야만 안 까먹는다! 시는 대문자, 소��

www.acmicpc.net

 

'Algorithm > Python' 카테고리의 다른 글

[BOJ]10775. 공항  (0) 2020.10.29
[BOJ]1786. 찾기  (0) 2020.10.27
[BOJ]1644. 소수의 연속합  (0) 2020.10.13
[BOJ]12100. 2048(Easy)  (0) 2020.09.24
[BOJ]1806 부분합  (0) 2020.09.22

+ Recent posts