백준 문제풀이 19948 음유시인 영재

Kim. K.S·2022년 1월 20일
0

boj 19948 : 음유시인 영재

문제 주소: https://www.acmicpc.net/problem/19948

난이도: silver 3

1.문제설명

  • 가난한 시인 영재가 있다.
  • 시를 쓰고 제목은 시를 이루는 단어들의 첫 글자를 대문자로 따서 네이밍한다.
  • 하지만 키보드가 좋지못해 알파벳 별로 누를수 있는 횟수가 정해졌다, 스페이스바도.
  • 운이 좋게 연속된 알파벳이나(HELLO 에서 L이 연속으로 2번나오는데 이건 L을 꾹 누르면 두번 써진단다..)
  • 띄어쓰기도 연속으로 주어지면 꾹 누르고 있으면된다.
  • 위와같은 조건에서, 시의 내용, 누를수 있는 스페이스바, 알파벳 키의 횟수가 주어질때
  • '제목과, 내용'을 모두 입력할수 있으면 제목을 출력하고 불가능하면 -1을 출력해라

2.문제해결 아이디어.

  • 구현문제같다.
  • 시 내용을 문자열로 받아 인덱스 기반으로 순회하면서
  • 알파벳이나 띄어쓰기를 만날시에 이용할수 있는 횟수에서 -시켜주면 된다.

3.문제접근법

  • 먼저 제목을 정해준다. 그리고 검증을 하고 아무 문제가 없다면 제목을 출력시킨다.
  • 문제가 있으면 검증을 통해 -1을 return하고 종료하면된다.
pre = poem[0] #pre에 첫글자를 넣어준다.
if keyboard[ord(pre.upper()) - 65] - 1 < 0: 
    #이부분이 나름 키포인트라고 느껴지는데.
    #대문자 A의 유니코드가 65이다, 그리고 주어진 입력에서 A를 누를수 있는 횟수는 인덱스 0번이다.
    #따라서 pre를 대문자화 시켜주고 -> 유니코드로 바꿔주고 -65를 함으로써 -> 입력받은 리스트와 매칭시킬수 있다.
    return print(-1)
else:
    keyboard[ord(pre.upper()) - 65] -= 1

for letter in poem[1:]: #1번 인덱스부터는
    if pre == letter: #이전 알파벳(or 스페이스바)이 연속되면 넘어가고
        continue
    elif letter == ' ': # 연속되지 않는 경우 공백을 만날때
        space -= 1
        if space < 0:
            return print(-1)
        else:
            pre = letter
    else: #연속되지 않는 경우 알파벳을 때
        if keyboard[ord(letter.upper()) - 65] - 1 < 0:
            return print(-1)
        else:
            pre = letter
            keyboard[ord(letter.upper()) - 65] -= 1

위의 과정을 내용에 대해 한번 수행하고, 미리 만들어놓은 제목에 대해 한번 수행하면된다. 참고로 제목엔 공백이 없다.

4.특별히 참고할 사항

  • 문자열과, 유니코드를 알면 풀기 쉬웠을 것 같다.
  • 문제를 잘 읽자.
  • 반복되는 부분이 많아서 함수화 시키면 더 보기 좋을것 같지만 다른 할게 많다.

5.코드구현

poem = input()
space = int(input())
keyboard = list(map(int,input().split()))

def check_validity(poem, space):
    ans = ("".join(word[0].upper() for word in poem.split()))
    pre = poem[0]
    if keyboard[ord(pre.upper()) - 65] - 1 < 0:
        return print(-1)
    else:
        keyboard[ord(pre.upper()) - 65] -= 1

    for letter in poem[1:]:
        if pre == letter:
            continue
        elif letter == ' ':
            space -= 1
            if space < 0:
                return print(-1)
            else:
                pre = letter
        else:
            if keyboard[ord(letter.upper()) - 65] - 1 < 0:
                return print(-1)
            else:
                pre = letter
                keyboard[ord(letter.upper()) - 65] -= 1

    pre = ans[0]
    if keyboard[ord(pre.upper()) - 65] - 1 < 0:
        return print(-1)
    else:
        keyboard[ord(pre.upper()) - 65] -= 1
    for letter in ans[1:]:
        if pre == letter:
            continue
        elif letter == ' ':
            space -= 1
            if space < 0:
                return print(-1)
            else:
                pre = letter
        else:
            if keyboard[ord(letter.upper()) - 65] - 1 < 0:
                return print(-1)
            else:
                pre = letter
                keyboard[ord(letter.upper()) - 65] -= 1
    return print(ans)

check_validity(poem, space)
profile
시원한 맥주, 음악, 야구, 사진찍기를 좋아합니다.

0개의 댓글

관련 채용 정보