본문 바로가기

Language/Python

[Python][백준 25240][해시, 문자열] 가희와 파일 탐색기2 - 컴도리돌이

728x90
 

25240번: 가희와 파일 탐색기 2

Q개의 질문에 대해, 연산이 성공하면 1을 실패하면 0을 출력해 주세요. 각 질문에 대한 답은 한 줄에 하나씩 출력해 주세요.

www.acmicpc.net


풀이 과정

이 문제는 정말 맞왜틀을 외치면서 풀었던 문제인 거 같다... 7번이나 틀렸던 문제😂😂 

문제를 제대로 읽지 않아서 중요한 부분을 놓쳤다.

" 유저가 속한 그룹들에 대한 정보에 USER_NAME이 주어지지 않더라도 그룹 이름이 USER_NAME인 그룹에 속함에 주의하세요."

유저에 대한 정보의 개수 U만큼 user_name과 user_group이 입력되는데, user_name이 동일한 이름을 가진 그룹에 속하다는 것을 놓쳐버렸다.. 🤦‍♂️🤦‍♂️

 

1. 필자는 그룹에 어떤 유저가 포함되어 있는지, 그룹 이름을 입력하면 그룹에 속한 유저의 이름이 배열로 출력하게끔 "group"에 빈 디렉터리로 초기화하였고, 파일에 대한 정보(파일의 권한, 파일의 소유자, 파일의 그룹)를 파일의 이름을 입력하면 해당 정보가 나오게끔 "file"에 빈 디렉터리로 초기화하였다.

2. U만큼 유저의 이름가 속한 그룹이 주어지는데, 입력받은 문자열을 공백으로 쪼개서 배열로 "user_info"에 담았다. 해당 배열의 크기가 1 이하이면 그룹이 주어진 것이 아니기 때문에 동일한 user_name이 그룹에 있는지 확인하고 없으면 그룹에 배열로 저장하였다.(있으면 append) 

그룹이 주어졌다면, 그룹이 여러 개로 있을 수 있기 때문에 ", "로 문자열을 쪼개서 그룹 이름에 유저를 append 해주었다.

3. F만큼 파일의 정보가 주어 지는데 1에서 만든 file 디렉터리에 key는 파일 이름, value는 권한, 소유자, 그룹으로 세팅해주었다.

4. 입력받은 Q만큼 유저 이름, 파일 이름, 접근 권한이 주어진다. 다음 fileAuth함수에서  3가지 경우로 나누어서 rwx 함수로 판정하였다.

  • 입력받은 유저 이름이 파일의 소유자인 경우 - 소유자 권한
  • 유저 이름이 파일의 그룹에 속한 경우 - 그룹 권한
  • 그 외 other인 경우 - other 권한

5. rwx 함수:  각각의 권한에 맞게 함수를 구현하였다. 권한 번호가 7이면 바로 1을 반환해주었고, 0이면 권한이 아예 없기 때문에 0으로 반환해주었다. 그 외에는 다음과 같이 구현하였다.

  • 읽기 권한(4 이상): 주어진 권한이 4 이상일 경우, 1로 반환
  • 수정 권한(1, 3, 5): 주어진 권한이 1,3,5에 포함될 경우, 1로 반환
  • 실행 권한(2, 3, 5): 주어진 권한이 2,3,5에 포함될 경우, 1로 반환
  • 그 외 조건은 모두 0으로 반환 

풀이 코드

import sys; input =sys.stdin.readline
U,F = map(int,input().split())

group,file = {},{}

for _ in range(U) :
  user_info = input().strip().split()
  if len(user_info) > 1 :
    user_,groups_ = user_info
    for user_group in groups_.split(',') :
      if user_group in group :
        group[user_group].append(user_)
      else :
        group[user_group] = [user_]
  if user_info[0] in group :
    group[user_info[0]].append(user_info[0])
  else :
    group[user_info[0]] = [user_info[0]]

for _ in range(F) :
  file_name,file_permission,owner,owner_group = input().strip().split()
  file[file_name] = (file_permission,owner,owner_group)

def rwx(op,num) :
  if num == 7 : return 1
  elif num == 0 : return 0
  elif op == "R" and num >= 4 : return 1
  elif op == "W" and num in [2,3,6] : return 1
  elif op == "X" and num in [1,3,5] : return 1
  else : return 0

def fileAuth(user_name, file_name, op) :
  file_permission,owner,owner_group = file[file_name]
  owner_auth,group_auth,other_auth = file_permission
  if user_name == owner : return rwx(op,int(owner_auth))
  elif user_name in group[owner_group] : return rwx(op,int(group_auth))
  else : return rwx(op,int(other_auth))

for _ in range(int(input())) :
  user_name, file_name, op = input().strip().split()
  print(fileAuth(user_name, file_name, op))