[백준] 14725번 개미굴 _ Python

2024. 2. 9. 12:58·Algorithms/Data Structure

[초기 접근 방법]

1) 개미굴 입구를 중심으로, 자식 노드들을 top [] 에 저장한다.

2) 자식노드들의 각 행에 중복되지 않는 노드들을 result[] 에 저장하도록 한다.

 

 

 

[생각]

각 행에 중복되지 않는 노드들을 result[]에 저장하도록 구현했는데,

부모 노드가 다를 때에는 각각 저장해주어야 한다.

아래와 같은 test case 를 적어보았다.

 

Input Output Answer
2
3 APPLE APPLE ORANGE
3 APPLE BANANA ORANGE
APPLE
--APPLE
----ORANGE
--BANANA
APPLE
--APPLE
----ORANGE
--BANANA

----ORANGE

 

 

 

올바른 접근 풀이는 다음과 같다.

 

 

1. 동굴 깊이 간선 정보를 정렬을 한다.

→ 사전 순서가 앞서는 정보가 먼저 나오기 때문

 

2. 첫번째 깊이 간선은 result 에 깊이에 따라 바로 추가한다.

 

3. i(>=2)번째 간선부터는 cave[i][j] 와 cave[i-1][j] 값을 비교하며, 새로운 값이 등장할 시 result에 추가한다.

- 한 가지 유의할 점이 cave[i]의 길이가 cave[i-1]보다 길어질 경우 "len(cave[i-1]) <= j" 길이 체크를 반드시 해주어야 한다.

그렇지 않을 경우 IndexError: list index out of range 가 발생한다.

 

 

 

 

[코드]

- 틀린 코드

import sys
input = sys.stdin.readline

N = int(input().strip())

cave = []
depth = 0
for _ in range(N):
    lst = list(map(str, input().strip().split()))
    depth = max(depth, int(lst[0]))
    cave.append(lst[1:]) # cave 정렬을 위해서 삭제해야 함

cave.sort() # 같은 층에 여러 개의 방이 있을 때에는 사전 순서가 앞서는 먹이 정보가 먼저 나와야 한다.

top = [] # 루트 자식노드 리스트
result = [] # 결과

for i in range(N):# 중복 제거
    if cave[i][0] not in top: # top 아니라면 추가
        top.append(cave[i][0])
        result.append(cave[i][0])
        idx = len(result) # 첫번째 노드 인덱스 관리

    for j in range(1, len(cave[i])):
        if ("--" * j) + cave[i][j] not in result[idx:]: # 첫번째 노드를 추가하고, 이후 자식 노드들 사이에서의 중복 노드 관리
            result.append(("--" * j) + cave[i][j])

for r in result:
    print(r)

 

 

 

- 정답 코드

# 시간 복잡도 : O(Nlog(N) + N * K)
    # Nlog(N) : 정렬 시간 복잡도
    # N*K : 현재 동굴 정보와 이전 동굴 정보가 일치하는지 체크(K)하면서 N개의 동굴 탐색
# 공간 복잡도 : O(N)

# 참고 : https://velog.io/@kimdukbae/BOJ-14725-%EA%B0%9C%EB%AF%B8%EA%B5%B4-Python

import sys
input = sys.stdin.readline

N = int(input().strip())

cave = []
depth = 0
for _ in range(N):
    lst = list(map(str, input().strip().split()))
    depth = max(depth, int(lst[0]))
    cave.append(lst[1:]) # cave 정렬을 위해서 삭제해야 함

cave.sort()

result = [] # 결과
top = [] # 루트 자식노드 리스트

for i in range(N):
    # 초기 동굴 구성
    if i == 0:
        for j in range(len(cave[i])):
            result.append(("--" * j) + cave[i][j])

    else:
        idx = 0
        for j in range(len(cave[i])):
            # 이전 정보와 겹치지 않거나, 겹치다가 현재 동굴의 길이가 더 깊어 표현할 수가 없을 때
            if cave[i-1][j] != cave[i][j] or len(cave[i-1]) <= j: # j → len(cave[i]) X
                break
            else:
                idx = j + 1

        # 겹치지 않는 시점부터, "-- + 하위 노드"를 추가한다.
        for j in range(idx, len(cave[i])):
            result.append("--" * j + cave[i][j])

for r in result:
    print(r)
저작자표시 (새창열림)

'Algorithm > Data Structure' 카테고리의 다른 글

[백준] 5052번 전화번호 목록 _ Java, Python  (0) 2024.03.02
[백준] 14426번 접두사 찾기 _ JAVA  (0) 2024.02.21
[백준] 1043번 거짓말 _ Python  (0) 2024.02.20
'Algorithms/Data Structure' 카테고리의 다른 글
  • [백준] 5052번 전화번호 목록 _ Java, Python
  • [백준] 14426번 접두사 찾기 _ JAVA
  • [백준] 1043번 거짓말 _ Python
wch_t
wch_t
  • wch_t
    끄적끄적(TIL)
    wch_t
  • 글쓰기 관리
  • 전체
    오늘
    어제
    • 분류 전체보기 (170)
      • Architecture (0)
      • Algorithm (67)
        • Math (5)
        • Simulation (1)
        • Data Structure (4)
        • DP (7)
        • Brute Fource (10)
        • Binary Search (6)
        • Greedy (2)
        • Graph (11)
        • Mst (1)
        • Shortest path (10)
        • Two Pointer (1)
        • Tsp (3)
        • Union Find (2)
        • Mitm (1)
      • CS (2)
        • 데이터베이스 (5)
        • 네트워크 (5)
      • DB (6)
      • DevOps (17)
        • AWS (9)
        • Docker (1)
        • CI-CD (5)
      • Error (1)
      • Project (0)
        • kotrip (0)
      • Spring (59)
        • 끄적끄적 (5)
        • 기본 (9)
        • MVC 1 (7)
        • MVC 2 (11)
        • ORM (8)
        • JPA 1 (7)
        • JPA 2 (5)
        • Spring Data Jpa (7)
      • Test (2)
      • TIL (5)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    response_mode
    docker
    scope
    view algorithm
    Sxssf
    apache poi
    spring-cloud-starter-aws-secrets-manager-config
    aws secrets manager
    Jenkins
    TempTable
    애플
    spring-cloud-starter-bootstrap
    백준 17299 파이썬
    Merge
    백준 17289 파이썬
    docker: not found
    form_post
    백준 3015 파이썬
  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.3
wch_t
[백준] 14725번 개미굴 _ Python
상단으로

티스토리툴바