2024. 10. 7. 09:28ㆍCoding/백준-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 리스트에 저장된 계층별 음식을 출력한다.
'Coding > 백준-Python' 카테고리의 다른 글
[백준] 백준 python3 1978번 문제 및 소스코드 (0) | 2024.10.08 |
---|---|
[백준] 백준 Python3 2166번 문제 및 소스코드 (0) | 2024.10.08 |
[백준] 백준 python 2293번 문제 및 소스코드 (1) | 2024.10.06 |
[백준] 백준 python 1759번 문제 및 소스코드 (0) | 2024.10.05 |
[백준] 백준 python 2110번 문제 및 소스코드 (0) | 2024.10.05 |