1283번 - 단축키 지정

1. 단축키 지정

A. 📜 문제

위 백준 사이트에 접속하여 문제를 확인해주세요.

B. 💡 내 답안

a. 😊 1차 시도 (성공)

"""
Date    : 2021.12.02
Update  : 2021.12.03
Source  : 1283.py
Purpose : 단축키 지정 - 문자열을 이용한 구현문제.
Author  : 김학진 (mildsalmon)
Email   : mildsalmon@gamil.com
"""

n = int(input())

# 단축키로 지정될 단어의 알파벳 대문자 저장
keys = []
# 출력에서 원하는 방식으로 변경한 문자열 저장
answer = []

for i in range(n):
    # 나중에 이 문자열만 사용해야해서, 문자열(옵션)을 있는 그대로 받았다.
    temp = input()
    # 문자열에서 공백(띄어쓰기)를 기준으로 split했다.
    temp_split = temp.split()

    # 최종 문자열(옵션)을 저장함. -> New => [N]ew
    word_concat = ''
    # 현재 옵션에 대해 단어의 첫 글자가 단축키로 지정되어 있지 않으면 True로 변경하고 단축키를 지정한다.
    set_word = False

    # 옵션을 단어별로 구분해서 첫 글자가 단축키로 지정되어 있는지 확인해야한다.
    # 그래서 split된 문자열을 사용한다.
    for t in temp_split:
        # 알파벳의 대소문자를 구분하지 않는다고 했다.
        # 그래서 모든 알파벳은 대문자로 치환하여 비교하였다.
        # 단어의 첫 글자의 대문자가 keys(단축키 저장 리스트)에 없고 set_word(단축키 지정 여부)가 False라면 단축키를 지정한다.
        if t[0].upper() not in keys and set_word == False:
            # keys에 저장되는 알파벳도 전부 대문자이다.
            keys.append(t[0].upper())
            # 지정한 단축키 앞, 뒤에 괄호([ ])를 삽입하고 최종 문자열에 더한다(concat).
            word_concat += "[" + t[0] + "]" + t[1:]
            # 이 옵션에서 단축키를 지정했기 때문에 set_word를 True로 변경한다.
            set_word = True
        else:
            # 단어의 첫 글자의 대문자가 keys에 저장되어 있거나 이미 이 옵션에서 단축키를 지정했다면(set_word == True)
            # 그냥 word_concat에 현재 단어를 더한다(concat).
            word_concat += t
        # 옵션의 단어 사이에는 띄어쓰기가 있기 때문에 for문의 마지막 위치에 띄어쓰기를 추가한다.
        word_concat += " "

    # 첫 글자의 대문자가 keys에 저장되어 있고, 단축키가 지정되지 않은 옵션은 아래 조건문에 들어간다.
    if not set_word:
        # range로 index를 처리하기 번거로울거 같아서 enumerate를 사용했다.
        # 여기서는 split하지 않은 문자열을 사용한다.
        # 옵션을 단어별로 첫 글자가 keys에 저장되지 않은 값을 찾는것이 아닌,
        #   단축키로 지정되지 않은 문자 중 가장 앞에 있는 문자를 선택해서 단축키로 지정해야 하기 때문.
        for j, t in enumerate(temp):
            # 문자의 대문자가 keys에 없고 문자가 공백이 아니라면 if문을 실행한다.
            if t.upper() not in keys and t != " ":
                # 문자열 인덱싱을 이용하여 출력해야하는 형식으로 변경한다.
                word_concat = temp[:j] + "[" + temp[j] + "]" + temp[j+1:]
                # 여기서 찾은 단축키를 keys에 저장하낟.
                keys.append(t.upper())
                break

    # 문자열 마지막에 공백이 추가되었을 수 있으므로 strip()으로 정리해준다.
    answer.append(word_concat.strip())

print(*answer, sep='\n')

b. 🙄 회고

내 풀이

  • 조건을 잘 보고 구현했다.

반성

계속된 버릇인지, 습관인지. 테스트케이스를 머릿속에만 두고 검증해나간다. 그래서 마지막 for문에서 " " 조건을 빼먹는 실수를 했다.

C. 🧐 문제 해설

이해한 내용을 바탕으로 작성했습니다.

  • 구현 문제는 문제 이해를 먼저하고 푸는게 좋다. (다른 문제도 마찬가지지만, 구현 문제는 중간에 틀린걸 인지하면 처음부터 다시해야한다.)

조건들을 분리해보자.

1. 하나의 옵션에 대해 왼쪽에서부터 오른쪽 순서로 단어의 첫 글자가 단축키로 지정되었는지 확인한다.
    1. 지정되지 않았다면.
        - 그 알파벳을 단축키로 지정한다. (단어의 첫 글자를 단축키로 지정한다.)
2. 모든 단어의 첫 글자가 이미 지정되었다면,
    - 옵션의 왼쪽부터 차례대로 알파벳을 확인하면서 지정되지 않은 알파벳을 단축키로 지정한다.
3. 어떤 단어도 단축키로 지정할 수 없다면 (모든 알파벳이 단축키로 지정되었을 경우)
    - 그대로 놔둔다.
3. 단축키의 대소문자는 구분하지 않는다.
    - 따라서, 단축키는 대문자 or 소문자로 일관되게 저장한다.

이 조건들을 통해 필요한 것들은 생각해보면 다음과 같다.

  1. 단축키 리스트
  2. 옵션
    1. 단어별로 구분된 옵션
    2. 단어별로 구분되지 않은 옵션
  3. 출력 형식에 맞춰 저장할 리스트

처음에는 1번 조건을 해결해야한다.
단어별로 첫 글자가 단축키로 지정되었는지 확인하고, 단축키를 지정했다면 flag 활성화시키자.
이를 통해 하나의 옵션에 하나의 단축키만 지정하는 조건을 줄 수 있다.
if t[0].upper() not in keys and set_word == False:

만약, 모든 단어의 첫글자가 단축키로 지정되었을 경우 2번 조건으로 내려가서 옵션의 모든 글자 중에 단축키로 등록되지 않은 경우를 찾아야한다.
1번 조건에서 단축키를 찾았다면, 2번 조건은 실행되면 안되기 때문에 위에서 지정한 flag로 이번 옵션에서 단축키를 지정했는지 확인한다.

참고문헌

baekjoon. 1283번: 단축키 지정 (acmicpc.net). Baekjoon. (accessed Dec 3, 2021)

이 글이 도움이 되었나요?

신고하기
0분 전
작성된 댓글이 없습니다. 첫 댓글을 달아보세요!
    댓글을 작성하려면 로그인이 필요합니다.