[백준] 백준 python 14725번 문제 및 소스코드

2024. 10. 7. 09:28Coding/백준-Python

1. 문제 링크

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

2. 문제

3. 해설 및 소스코드

1) 전체 코드

import sys

input = sys.stdin.readline
N = int(input())
food_info = []
for i in range(N):
    data = list(input().split())
    food_info.append(data[1:])
    
food_info.sort()

dash = '--'
answer = []
for i in range(N):
    if i == 0:
        for j in range(len(food_info[i])):
            answer.append(dash * j + food_info[i][j])
            
    else:
        idx = 0
        for j in range(len(food_info[i])):
            if food_info[i - 1][j] != food_info[i][j] or len(food_info[i - 1]) <= j:
                break
            else:
                idx = j + 1
        for j in range(idx, len(food_info[i])):
            answer.append(dash * j + food_info[i][j])
            
for ans in answer:
    print(ans)

 
2) 입력 받기(sys.stdin.readline)

input = sys.stdin.readline
N = int(input())
food_info = []

- input = sys.stdin.readline : sys.stdin.readlin() 을 사용하여 빠르게 입력을 받는다. 일반적인 input() 함수보다 빠른 입력을 처리할 때 유용함
- N = int(input()) : 첫 번째 입력은 정수 N으로, 입력되는 리스트의 개수를 나타낸다.
- food_info = [] : 이후 저장할 음식 정보를 위한 리스트 food_info를 생성
 
3) 음식 정보 저장

for i in range(N):
    data = list(input().split())
    food_info.append(data[1:])

- for i in range(N) : N개의 라인을 입력받기 위해 루프를 돌린다.
- data = list(input().split()) : 각 줄의 입력을 공백을 기준으로 나누어 리스트로 변환. 각 줄은 여러 개의 단어로 이루어져 있으며, 첫 번째 단어는 음식의 이름이 아닌 상위 항목이므로 제거함.
- food_info.append(data[1:]) : 음식 정보는 첫 번째 단어를 제외한 나머지를 food_info 리스트에 저장한다.
 
4) 음식 정보 정렬

food_info.sort()

- food_info.sort() : 저장된 음식 정보를 알파벳 순서대로 정렬. -> 자연스러운 계층 구조 생성
 
5) 정답 리스트 생성 및 계층 구조 구분

dash = '--'
answer = []
for i in range(N):
    if i == 0:
        for j in range(len(food_info[i])):
            answer.append(dash * j + food_info[i][j])
    else:
        idx = 0
        for j in range(len(food_info[i])):
            if food_info[i - 1][j] != food_info[i][j] or len(food_info[i - 1]) <= j:
                break
            else:
                idx = j + 1
        for j in range(idx, len(food_info[i])):
            answer.append(dash * j + food_info[i][j])

- dash = '--' : 계층을 표현할 때 사용할 문자열 --를 정의
- answer = [] : 최종 출력될 문자열을 저장할 리스트를 정의
- for i in range(N) : 정렬된 food_info 리스트를 차례로 순회

  • 첫 번째 음식 정보(i == 0):
    • for j in range(len(food_info[i])) : 첫 번째 음식 리스트의 길이만틈 순회하며, 각 항목을 dash로 구분하여 answer 리스트에 추가. 이때 계층의 깊이는 j에 따라 dash * j로 구분한다.
  • 두 번재 이후 음식 정보:
    • idx = 0 : 두 리스트 간에 동일한 부분의 끝을 기록할 인덱스 idx를 0으로 초기화
    • for j in range(len(food_info[i])) : 현재 음식 리스트를 순회하며 이전 리스트(fodd_info[i - 1])와 비교
    • if food_info[i - 1][j] != food_info[i][j] or len(food_info[i - 1=) <= j:이전 음식 리스트와 현재 리스트의 j번째 요소가 다르거나 이전 리스트가 짧으면 반복 멈춤
    • else: idx = j + 1 : 만약 동일한 부분이 계속되면 idx를 업데이트하여 마지막으로 동일했던 항목 기록
    • for j in range(idx, len(food_info[i])) : 동일한 부분 이후에 남은 항목을 dash * j로  계층 구분을 하여 answer 리스트에 추가

5)

for ans in answer:
    print(ans)

- for ans in answer : 최종적으로 answer 리스트에 저장된 계층별 음식을 출력한다.