[BOJ 25240] 백준 25240번 - 가희와 파일 탐색기 2
가희와 함께 하는 코딩테스트 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
권한이 있는지 확인하기 위해서는 다음과 같은 과정이 필요하다.
USER_NAME
의 유저가FILE_NAME
의 파일의OWNER
라면,FILE_PERMISSION
의 첫 숫자와 해당되는 권한이 있다.USER_NAME
의 유저가FILE_NAME
의 파일의OWNED_GROUP
에 속하는 유저라면,FILE_PERMISSION
의 두 번째 숫자와 해당되는 권한이 있다.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_PERMISSION
이 245
라면, 실제 권한은 아래와 같은 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. 채점 결과
4. 회고
많은 조건에 맞추어 정확하게 구현하는 능력이 중요한 문제여서 상당히 까다로웠다. OWNED_GROUP
이 USER_NAME
인 경우를 FILE_PERMISSION
의 두 번째 권한이 아닌 첫 번째 권한으로 잘못 설정해버려서 WA를 받았다.
댓글남기기