가희와 함께 하는 코딩테스트 4회 풀이
A   [BOJ 25238] 가희와 방어율 무시
B   [BOJ 25239] 가희와 카오스 파풀라투스
C   [BOJ 25240] 가희와 파일 탐색기 2
D   [BOJ 25243] 가희와 중부내륙선

1. 문제

$25240$. 가희와 파일 탐색기 2 (가희와 함께 하는 코딩테스트 4회 C번)

백준 25240번 - 가희와 파일 탐색기 2 (https://www.acmicpc.net/problem/25240)

2. 풀이

FILE_NAME FILE_PERMISSION OWNER OWNED_GROUP 정보를 받아서 USER_NAME의 유저가 FILE_NAME에 대해 OPERATION 권한이 있는지 확인하기 위해서는 다음과 같은 과정이 필요하다.

  1. USER_NAME의 유저가 FILE_NAME의 파일의 OWNER라면, FILE_PERMISSION의 첫 숫자와 해당되는 권한이 있다.
  2. USER_NAME의 유저가 FILE_NAME의 파일의 OWNED_GROUP에 속하는 유저라면, FILE_PERMISSION의 두 번째 숫자와 해당되는 권한이 있다.
  3. USER_NAME의 유저가 FILE_NAME의 파일의 OWNER도 아니고 OWNED_GROUP에도 속하지 않는다면(앞의 1과 2가 아니라면), FILE_PERMISSION의 세 번째 숫자와 해당되는 권한이 있다.

각 file에 대해 USER_NAME의 유저가 OWNER, OWNED_GROUP, OTHER중 어디에 속하는지를 구분하여 FILE_PERMISSION을 할당해야 하므로, FILE_NAME을 key로 하고 나머지 정보를 value로 하는 map을 선언한다.

struct NODE {
    string perm;
    string owner;
    string group;
};

map<string, NODE> file_mp;

또한, 2의 작업에서 USER_NAME의 유저가 OWNED_GROUP에 속하는 유저인지 판단해야 하므로, 특정 그룹에 어떤 유저들이 속해있는지의 정보를 담는 map을 선언한다. (key: group, value: group에 속하는 유저들)

map<string, set<string>> group_mp;

$U$개의 줄에 주어지는 유저에 대한 정보에서 정보의 길이가 특정되어 있지 않으므로, getline(cin, str)을 통해 한 줄씩 입력을 받아 공백과 ‘,’를 기준으로 분리하여 데이터를 뽑아낸다. 이 과정에서 group_mp의 해당되는 그룹에 유저를 집어넣는다.

이때, USER_NAME의 유저는 자동으로 이름이 USER_NAME인 그룹에 속한다. 그러나 이를 하나의 그룹으로 만들어 group_mp에 집어넣으면 오버헤드가 크다. 따라서, 직접 자료구조에 집어넣지 않고, 위에서 서술한 2 과정에 이를 확인하는 작업을 추가한다.

변경 전

2. `USER_NAME`의 유저가 `FILE_NAME`의 파일의 `OWNED_GROUP`에 속하는 유저라면, `FILE_PERMISSION`의 두 번째 숫자와 해당되는 권한이 있다.


변경 후

2. `USER_NAME`의 유저가 `FILE_NAME`의 파일의 `OWNED_GROUP`에 속하거나 `OWNED_GROUP` 그 자체인 경우, `FILE_PERMISSION`의 두 번째 숫자와 해당되는 권한이 있다.

문제의 조건에 따라 파일에 대해 수정 권한($W$)이 있다면, 읽기 권한($R$)도 있다. 이 정보를 포함하여 숫자와 해당되는 권한을 각각 $R$, $W$, $X$로 나누어 bit로 표현하면 아래 표와 같다.

숫자 R W X
0 0 0 0
1 0 0 1
2 1 1 0
3 1 1 1
4 1 0 0
5 1 0 1
6 1 1 0
7 1 1 1

OWNER 권한을 가진 유저는 GROUP 권한을 가진 유저들이 할 수 있는 모든 연산을, GROUP 권한을 가진 유저는 OTHER 권한을 가진 유저들이 할 수 있는 모든 연산을 할 수 있다. 따라서 만약에 FILE_PERMISSION245라면, 실제 권한은 아래와 같은 bitwise OR 계산에 의해 755가 된다.

  • OTHER의 권한 $\rightarrow$ 5 $\rightarrow$ (1, 0, 1) (5)

  • GROUP의 권한 $\rightarrow$ 4 OR 5 $\rightarrow$ (1, 0, 0) OR (1, 0, 1) = (1, 0, 1) (5)

  • OWNER의 권한 $\rightarrow$ 2 OR 4 OR 5 $\rightarrow$ (1, 1, 0) OR (1, 0, 0) OR (1, 0, 1) = (1, 1, 1) (7)

3. 채점 결과

boj-25240

4. 회고

많은 조건에 맞추어 정확하게 구현하는 능력이 중요한 문제여서 상당히 까다로웠다. OWNED_GROUPUSER_NAME인 경우를 FILE_PERMISSION의 두 번째 권한이 아닌 첫 번째 권한으로 잘못 설정해버려서 WA를 받았다.

5. 코드

댓글남기기