백준(BOJ) 25240 가희와 파일 탐색기 2 파이썬(Python)

문제 링크

파일 권한 파싱하는 문제.
요구 사항이 많은데 그대로만 지키면 어려울 것은 없는 문제다.
쓰인 그대로만 구현하면 되고 시간 제한도 넉넉해서 괜히 무리하지만 않으면 딱히 간과할만한 것도 없다.
주의할 점이라면 모든 유저는 자동으로 자기 이름으로 된 그룹에 속한다는 것과, 파일의 소유자와 소유 그룹은 하위 유저들의 권한을 전부 가진다는 것 정도.
수정 권한이 있으면 읽기 권한은 자동으로 가져간다는데, 이건 딱히 예외처리를 안 해도 통과하는 것을 보니 그냥 그런 사례를 가진 문제 자체가 주어지지 않는 것 같다.
권한을 확인하기 위해 permission_map 리스트를 통해 권한 번호를 문자열로 변환했고, 하위 유저의 권한을 가져오기 위해 그냥 무식하게 문자열을 연결했다.
그러면 중복되는 문자가 저장될 수도 있지만, 그래봤자 최장 문자열은 'RXWRXWRXW'로 길이가 9밖에 안 되므로 그냥 진행했다.
이후엔 각 쿼리에 대해 수행 작업이 권한 문자열에 포함된 작업인지만 확인하면 된다.

#!python

from sys import stdin
from collections import defaultdict
input = stdin.readline

u, f = map(int, input().split())
# groups: 그룹과 그 그룹에 속한 유저
# files: 파일과 그 파일의 권한, 소유자, 소유 그룹
# permission_map: 권한 번호에 대한 권한 문자열
groups = defaultdict(list)
files = {}
permission_map = ['', 'X', 'W', 'XW', 'R', 'RX', 'RW', 'RXW']

# 유저 정보 읽어들이기
for _ in range(u):
    # user_groups는 없다면 빈 리스트, 있다면 ,로 구분되기 이전의 그룹 문자열을 가진 리스트
    user_name, *user_groups = input().split()
    # 만약 그룹이 있다면 ,로 구분하여 저장
    if user_groups:
        user_groups = user_groups[0].split(',')
    # 유저 이름 그룹에 유저 추가
    groups[user_name].append(user_name)
    # 유저가 속한 그룹에 유저 추가
    for g in user_groups:
        groups[g].append(user_name)

# 파일 정보 읽어들이기
for _ in range(f):
    file_name, file_permission, owner, owned_group = input().split()
    # 추후에 권한을 문자열로 수정할 거라서 리스트로 저장함
    files[file_name] = [file_permission, owner, owned_group]

# 권한 정보를 정수에서 문자열로 변환
# 소유자는 소유 그룹과 그 외 유저의 권한을 모두 획득
# 소유 그룹은 그 외 유저의 권한을 획득
# 귀찮아서 그냥 중복되는 문자열을 제거하지 않음
# 성능을 높일 거면 제거하면 될 듯
for key, val in files.items():
    val[0] = (permission_map[int(val[0][0])] + permission_map[int(val[0][1])] + permission_map[int(val[0][2])],
              permission_map[int(val[0][1])] + permission_map[int(val[0][2])],
              permission_map[int(val[0][2])])

# 쿼리 읽어들이기
q = int(input())
for _ in range(q):
    user_name, file_name, operation = input().split()
    # 쿼리 유저가 소유자라면 권한은 소유자 권한
    if files[file_name][1] == user_name:
        permission = files[file_name][0][0]
    # 쿼리 유저가 소유 그룹 소속이라면 소유 그룹 권한
    elif user_name in groups[files[file_name][2]]:
        permission = files[file_name][0][1]
    # 그 외의 경우 그 외 권한
    else:
        permission = files[file_name][0][2]

    # 수행 작업이 권한에 포함되면 1, 아니면 0
    if operation in permission:
        print(1)
    else:
        print(0)

2024

맨 위로 이동 ↑

2023

세그먼트 트리

개요 선형적인 자료구조에서는 값에 접근하는 데에 \(O(1)\)이면 충분하지만, 대신 부분합을 구하는 데에는 \(O(N)\)이 필요하다. 그렇다면 이 자료구조를 이진 트리로 구성하면 어떨까? 값에 접근하는 데에 걸리는 시간이 \(O(\lg N)\)으로 늘어나지만 대신 부분합을 구하...

벨만-포드 알고리즘

개요 다익스트라 알고리즘과 함께 Single Sourse Shortest Path(SSSP) 문제를 푸는 알고리즘이다. 즉, 한 노드에서 다른 모든 노드로 가는 최단 경로를 구하는 알고리즘이다. 다익스트라 알고리즘보다 느리지만, 음수 가중치 간선이 있어도 작동하며, 음수 가중치 사...

다익스트라 알고리즘

개요 다익스트라 알고리즘은 Single Sourse Shortest Path(SSSP) 문제를 푸는 알고리즘 중 하나이다. 즉, 한 노드에서 다른 모든 노드로 가는 최단 경로를 구하는 알고리즘이다. 단, 다익스트라 알고리즘은 음수 가중치 엣지를 허용하지 않는다. 이 경우에는 벨만-...

맨 위로 이동 ↑