Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
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
Archives
Today
Total
관리 메뉴

잡동사니 블로그

[백준] 1474 - 밑 줄 (python) 본문

Python/백준

[백준] 1474 - 밑 줄 (python)

코딩부대찌개 2023. 1. 23. 21:46
 

1474번: 밑 줄

세준이는 N개의 영어 단어를 이용해 길이가 M인 새로운 단어를 만들려고 한다. 새로운 단어는 N개의 단어를 순서대로 이어 붙이고, 각 단어의 사이에 _을 넣어서 만든다. 이렇게 만든 새로운 단어

www.acmicpc.net

문제

세준이는 N개의 영어 단어를 이용해 길이가 M인 새로운 단어를 만들려고 한다. 새로운 단어는 N개의 단어를 순서대로 이어 붙이고, 각 단어의 사이에 _을 넣어서 만든다. 이렇게 만든 새로운 단어의 길이가 M이 아닌 경우 _를 추가해서 길이가 M이 되게 만들어야 한다.

  • _는 단어와 단어 사이에만 추가할 수 있다. 따라서, 새로운 단어는 _으로 시작하거나, _로 끝날 수 없다.
  • 단어와 단어 사이에 있는 _의 개수는 모두 같아야 한다.
    • 모두 같게 만드는 것이 불가능한 경우 단어와 단어 사이에 있는 _의 개수의 최댓값과 최솟값의 차이는 1이 되어야 한다.

새로운 단어 중 사전 순으로 가장 앞서는 단어를 구해보자.

입력

첫째 줄에 N과 M이 주어진다. 둘째 줄부터 N개의 줄에 단어가 한 줄에 하나씩 주어진다.

출력

첫째 줄에 사전 순으로 가장 앞서는 단어를 출력한다.

알파벳 대문자, 소문자, 밑 줄의 순서는 'A' < 'B' < 'C' < ... < 'Z' < '_' < 'a' < 'b' < 'c' < ... < 'z' 이다.

제한

  • 2 ≤ N ≤ 10
  • 3 ≤ M ≤ 200
  • 단어는 알파벳 소문자, 대문자로만 이루어져 있다.
  • 1 ≤ 단어의 길이 ≤ 10
  • 단어 N개 길이의 합을 len이라고 했을 때, len+N-1 ≤ M을 만족한다.

예제 입력 1 

9 50
A
quick
brown
fox
jumps
over
the
lazy
dog

예제 출력 1 

A___quick__brown__fox__jumps__over__the__lazy__dog

예제 입력 2 

5 32
Alpha
Beta
Gamma
Delta
Epsilon

예제 출력 2 

Alpha_Beta_Gamma__Delta__Epsilon

예제 입력 3 

4 29
Hello
world
John
said

예제 출력 3 

Hello____world___John____said

풀이

a, b = map(int, input().split())
total = []
cnt = 0
flag = 0
so = []
da = []
for i in range(a):
    c = input()
    cnt += len(c)
    total.append(c)
    if i != 0:
        if c[0].isupper() == True:
            da.append(c)
        else : 
            so.append(c)
q = da+so
length = b-cnt
oo = length % len(q)
nn = length // len(q)
ans=''
flag = 0
for i in total[1:]:
    if i in so and oo != 0:
        oo -= 1
        ans += ('_'*(nn+1))+i
        flag += 1
    elif len(total[1:]) - flag == oo :
        ans += ('_'*(nn+1))+i
    else :
        ans += ('_'*nn)+i
        flag += 1
print(total[0]+ans)

'A' < 'B' < 'C' < ... < 'Z' < '_' < 'a' < 'b' < 'c' < ... < 'z'

부분이 정말 헷갈려서 힘들었던 문제.

대문자와 소문자 리스트를 따로 만들었고, (만들어야 하는 단어의 길의 - 원래 단어의 길이)하여 밑줄의 개수를 구한 뒤, 첫 단어를 제외한 다음 단어의 시작이 소문자 일 경우엔 _를 하나 더 추가 하거나, 전부 대문자인 경우 마지막에서 추가하도록 하며, 중간에 대문자가 있을 경우 생략하여 되도록 소문자 앞에 _를 추가하는 식으로 함.