[백준] 1474 밑줄 Python 풀이 (Greedy)

2022. 11. 28. 20:12·Algorithm (PS)
728x90

https://www.acmicpc.net/problem/1474

 

1474번: 밑 줄

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

www.acmicpc.net

 

그리디 문제이다 
규칙을 찾는데 좀 오래 걸렸는데, 문제에서 핵심이 되는 것은 바로 사전순 정렬이다. 

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

라고 문제에서 주어졌다. 

즉, 대문자로 시작하는 단어의 경우 대문자의 우선순위가 '_' 의 우선순위 보다 높으니까, _가 뒤에 등장해야하고, 
소문자로 시작하는 단어의 경우 소문자의 우선순위보다 '_' 의 우선순위가 더 높으므로, _가 앞에 등장해야 이득이다. 

이를 코드화해보자 !

우선, 지금 체크하는 문자열의 길이를 확인하여, 단어의 사이마다 _의 개수를 몇개로 할것인지를 구해준다. 

k = (m-length)//(n-1)

 

그리고 (n-1)로 떨어지지 않는 우리가 greedy 규칙을 이용해서 붙여주어야 하는 남는 '_' 의 개수를 구한다. 

left = (m - length) % (n - 1) # 더해주어야 하는 _ 남은 개수

result는 만들 문자열의 결과값을 담는 리스트이다. 

우선 소문자로 시작하는 단어들의 케이스를 확인한다.
단어를 담아둔 array 라는 배열에서 처음부터 끝까지 순회하며, 소문자로 시작하는 단어가 등장하면 앞에 _를 하나 더 붙여주고, left개수를 1개 빼준다 

for i in range(n):
    if i == 0:
        result.append(array[i])
        continue
    if 97 <= ord(array[i][0]) <= 122:
        if left > 0:
            result.append(interval+"_")
            left -= 1
            result.append(array[i])
        else:
            result.append(interval)
            result.append(array[i])
    else: # 대문자
        result.append(interval)
        result.append(array[i])

소문자로 시작하는 단어들을 다 체크한 이후에도 남은 '_' 개수가 있다면 (left >0 인 경우), 
대문자로 시작하는 단어들을 체크한다.
대문자로 시작하는 단어들은 맨 마지막 인덱스부터 확인하여 '_'를 붙여준다. 

if left > 0: # 아직 더해주어야 하는 _ 의 개수가 남았다면 대문자로 시작하는 단어를 확인한다.
    for i in range(len(result)-1, -1, -1):
        if 65 <= ord(result[i][0]) <= 90: # 대문자인 경우
            if left > 0:
                result[i] = '_'+result[i]
                left -= 1

 

확인이 다 끝나면 result 를 join()함수를 이용해 문자열로 출력한다. 

print("".join(result))

 

[ 전체 코드 ]


n, m = map(int, input().split())

array = []
length = 0
result = []

for i in range(n):
    data = input()
    array.append(data)
    length += len(data)

k = (m-length)//(n-1)
left = (m - length) % (n - 1) # 더해주어야 하는 _ 남은 개수
interval = "_"*k
#소문자 먼저 확인하고, 소문자 등장하면 _ 넣기

for i in range(n):
    if i == 0:
        result.append(array[i])
        continue
    if 97 <= ord(array[i][0]) <= 122:
        if left > 0:
            result.append(interval+"_")
            left -= 1
            result.append(array[i])
        else:
            result.append(interval)
            result.append(array[i])
    else: # 대문자
        result.append(interval)
        result.append(array[i])

if left > 0: # 아직 더해주어야 하는 _ 의 개수가 남았다면 대문자로 시작하는 단어를 확인한다.
    for i in range(len(result)-1, -1, -1):
        if 65 <= ord(result[i][0]) <= 90: # 대문자인 경우
            if left > 0:
                result[i] = '_'+result[i]
                left -= 1
print("".join(result))

# 대문자
# print(ord('A')) 65
# print(ord('Z')) 90
# print(ord('a')) 97
# print(ord('z')) 122
# print(ord('_')) 95
728x90

'Algorithm (PS)' 카테고리의 다른 글

[백준] 18430 무기공학 파이썬/Python  (0) 2022.12.03
[백준] 6443 애너그램 (Python 파이썬 풀이)  (0) 2022.12.02
백준 2638 치즈 Python (BFS 풀이)  (0) 2022.11.28
백준 5547 일루미네이션 Python - BFS풀이  (0) 2022.11.27
백준 9465 스티커 Python  (0) 2022.11.25
'Algorithm (PS)' 카테고리의 다른 글
  • [백준] 18430 무기공학 파이썬/Python
  • [백준] 6443 애너그램 (Python 파이썬 풀이)
  • 백준 2638 치즈 Python (BFS 풀이)
  • 백준 5547 일루미네이션 Python - BFS풀이
minjiwoo
minjiwoo
Data Engineering과 Cloud Native 기술에 대해 Dive Deep 하는 플랫폼 엔지니어가 되는 것을 목표로 하고 있습니다. 경험과 공부한 내용을 기록하며 지속가능한 엔지니어가 되는 것이 꿈입니다.
minjiwoo
minji's engineering note
minjiwoo
전체
오늘
어제
  • 분류 전체보기 (613)
    • Data Engineering (42)
      • Apache Spark (11)
      • Databricks & Delta Lake (9)
      • Airflow (3)
      • SQL (6)
      • Trouble Shooting (2)
      • Hadoop (2)
      • MLOps (1)
    • Cloud Engineering (104)
      • AWS (23)
      • Linux 🐧 (29)
      • Docker 🐳 (21)
      • Kubernetes ⚙️ (20)
      • Ansible (10)
    • Computer Science (87)
      • 네트워크 (9)
      • 운영체제 (25)
      • 정보처리기사 (48)
      • CS 기술 면접 스터디 (3)
    • Programming Languages (27)
      • Python (17)
      • C와 C++ (10)
    • Backend (5)
      • Django (2)
    • 프로젝트 (2)
      • 테크포임팩트 (2)
    • iOS (11)
      • 레이블러리 (2)
    • Algorithm (PS) (275)
      • LeetCode (6)
    • 개발일기 (30)
      • 내돈내산 후기🎮 (3)
      • 개발자 취준생 (5)
      • Today I Learned (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • Hi there

인기 글

태그

  • Leetcode
  • docker
  • 운영체제
  • 프로그래머스
  • SPARK
  • 백트래킹
  • 쿠버네티스
  • 스파크
  • ansible
  • dfs
  • 백준
  • 클라우드
  • linux
  • 알고리즘
  • 데이터브릭스
  • 파이썬
  • BFS
  • Kubernetes
  • 리눅스
  • EC2
  • 데이터엔지니어링
  • 코딩테스트
  • python
  • Swift
  • AWS
  • 카카오코딩테스트
  • 데이터엔지니어
  • 빅데이터
  • dp
  • Databricks

최근 댓글

최근 글

hELLO· Designed By정상우.v4.5.2
minjiwoo
[백준] 1474 밑줄 Python 풀이 (Greedy)
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.