-
[BOJ]백준 21776번: 가희와 읽기 쓰기 놀이(Python)Problem Solving/BOJ(백준) 2021. 6. 13. 01:17
https://www.acmicpc.net/problem/21776
요즘은 순열 어렵게 구하기가 유행인가.....??^^ 이 문제 또한 순열을 이용한 문자열 문제이다
요즘은 시뮬레이션 없는 순열은 파이썬으로 하는게 편해서 ... 이 문제 또한 파이썬
각각의 사람마다 수행할 카드들의 순서가 정해져 있고, 해당 카드에는 여러 연산이 쓰여있을 수 있다
또한 본인의 카드 순서가 섞이지 않는 선에서 다른 사람과 교차 시행이 가능하다
A가 수행할 카드의 번호가 [1,2]이고 B가 수행할 카드 번호가 [3]이라면 (1,2,3), (1,3,2), (3,1,2) 이러한 순으로 게임이 가능하다는 뜻이었다
그래서 와... 이 순열을 어떻게 구하지? 라고 생각했는데 알고보니 고등학교 때 확률과통계에서 풀었던 유형이었다~~^^
순열을 [A, A, B], [A, B, A], [B, A, A]이러한 식으로 중복 순열을 만든 뒤에 해당 사람의 번호에 카드들을 순서대로 넣어주면 되는 거였다
이젠 알고리즘 문제 풀기 위해 확통 복습도 해야한다 🚬
어쨌든 순열만 구해주고 나면 이후에는 문자열 시뮬레이션해서 set에 넣어준 뒤 list로 변환해서 sort하고 출력하면 끝
근데 맞왜틀이라 디버깅 계속했는데 알고보니 'EMPTY'출력해야 하는 걸 'ERROR'라고 써놨다
ㅠㅠ
from itertools import permutations import sys n,c=map(int,sys.stdin.readline().split()) cards=[[]] for i in range(n): cards.append(list(map(int,sys.stdin.readline().split()))[1:]) pmt=[] for i in range(1,n+1): for _ in range(len(cards[i])): pmt.append(i) pmt=list(permutations(pmt)) perm=[] for p in pmt: li=[] dic=dict() for i in range(1,n+1):dic[i]=0 for i in p: li.append(cards[i][dic[i]]) dic[i]+=1 perm.append(li) op=[[]] for _ in range(c): op.append(list(map(str,sys.stdin.readline().split(',')))) def game(op, string): if op[:3]=='ADD': return string+op[4] else: if not op[4].isdigit() or int(op[4])<0 or int(op[4])>=len(string): return "ERROR" idx=int(op[4]) return string[:idx]+string[idx+1:] ans=set() for p in perm: string='' for act in p: for a in op[act]: if string=='ERROR': break string=game(a, string) if len(string)==0:ans.add('EMPTY') else: ans.add(string) for s in sorted(list(ans)): print(s)
'Problem Solving > BOJ(백준)' 카테고리의 다른 글
[BOJ]백준 21609번: 상어 중학교(C++)/Simulation (0) 2021.06.14 [BOJ]백준 7682번: 틱택토(C++)/BackTracking (0) 2021.06.13 [BOJ]백준 1043번: 거짓말(C++)/DisjointSet (466) 2021.06.10 [BOJ]백준 21772번: 가희의 고구마 먹방(C++)/BackTracking (798) 2021.06.08 [BOJ]백준 21738번: 얼음깨기 펭귄(C++)/BFS (863) 2021.06.07