한마디
미생물 격리에는 성공했지만 메모리도 시간도 다 잃었다. 언제쯤 깔끔한 코딩이 가능할까
아직까지는 DFS/BFS 구현에만 급급해서(루프 안 돌면 너무 행복하다) 메모리랑 시간이랑 최적화 따위는 신경쓰지 않는다. 내가 시간을 신경썼으면 C++했겠죠!!!(못하면서 말이 많다.)
사실 BFS 가 아니고 시뮬레이션 문제인데 요즘 너무 DFS/BFS 에 중독돼서 둘 중 뭔지부터 죽어라 생각해준다. ( 얼마 전에 종이 붙이기 dfs로 3시간동안 풀어놨더니 점화식 문제라서 거의 ㅎ실성해서 웃어서 모두의 걱정을 샀다.) 요즘 그래도 bfs/dfs // DP // 단순 시뮬레이션
중에 어떤 거인지 알면 그 쪽으로 사고의 방향이 한번 잡히니까 구현은 할 수 있는데 특히 DP 문제는 감을 못잡겠다ㅠㅠ
여튼 BFS인줄 알고 나는 함수를 세 가지 만들어 주었다.
1) 이동함수
2) 부딪혔을 때 함수
3) 이동을 먼저 하고 부딪혔을 때 동작을 해주는 1시간 의 일련의 동작 순서 관련 함수(이게 BFS일줄 알았다. 누가 봐도BFS를 모르는 사람이다)
4) 메인함수
뭐하나 깔끔하게 한 게 없다! 놀랍다!
#2382. [모의 SW 역량테스트] 미생물 격리
def move(arr): # 이동함수
if arr[3] == 1: #방향에 따라서 이동해야 할 방향을 구해주고 만약에 약물에 닿았을 경우
#수를 조절해주었다.
arr[0] = arr[0]-1
if arr[0] == 0:
arr[3] = 2
arr[2] = arr[2]//2
elif arr[3] == 2:
arr[0] = arr[0]+1
if arr[0] == N-1:
arr[3] = 1
arr[2] = arr[2]//2
elif arr[3] == 3:
arr[1] = arr[1]-1
if arr[1] == 0:
arr[3] = 4
arr[2] = arr[2]//2
elif arr[3] == 4:
arr[1] = arr[1]+1
if arr[1] == N-1:
arr[3] = 3
arr[2] = arr[2]//2
return arr
def collide(x,y): #충돌함수(부제: 모든 것의 원흉)
collision = []
delete = []
for idx, micky in enumerate(micro):
if micky[0] == x and micky[1] == y:
collision.append(micky) #카운트가 여러개인 것의 미생물의 인덱스값을 뽑아주었다.
delete.append(idx) #사실 딜리트 안하고 그냥 팝..하면 런타임 에러가 뜬다.
new_m = [x,y,0,0] #걔네들 다 없애줄거다. 그리고 새로운 거 만들기
max_con = 0
for c in collision:
new_m[2]+= c[2] # 수 제일 많은 아이의 방향을 틀어줘야 하기 때문에 이 방법이 최선
#이라고 생각했다.
if c[2]> max_con:
max_con = c[2]
new_m[3] = c[3]
for d in range(len(delete)-1, -1, -1):
del micro[delete[d]]
micro.append(new_m)
def observation(time):
if time>0:
quantity = [[0 for _ in range(N)] for _ in range(N)]
for m in micro: #움직이면서 양의 리스트(count 리스트라고 보아도 무방)에 넣어줌
m = move(m)
quantity[m[0]][m[1]] +=1
for i in range(N):
for j in range(N): #하나 이상인 것에 대해서 충돌함수 진행해주었다.
if quantity[i][j] > 1:
collide(i,j)
observation(time-1) #그러니까 이걸 굳이 while 써도 될 걸 왜 함수를 만들었을까
T = int(input())
for test_case in range(1, T+1):
N, M, K = map(int, input().split())
micro = [list(map(int, input().split())) for _ in range(K)]
observation(M)
counter = 0
for mi in micro:
counter += mi[2]
print('#{} {}'.format(test_case, counter))
그리고 얼마전에도 생각한 나의 문제점인데 개 복잡한 시뮬레이션 문제처럼 생겼지만 실은 단순한 것을 묻는 문제(가능/불가능의 여부라던지, 한 변수의 카운트라든지) 에서 갈피를 못잡고 일단 어마어마한 메모리와 시간을 써서 구현을 하는 것도 하나의 문제 같다. 물론 알고리즘 연습할 때는 이 방향이 좋은 것 같지만 시험볼 때 이러면 그냥 망해버린다구...
'알고리즘 공부 > Python' 카테고리의 다른 글
SWEA 4111. 무선 단속 카메라 (Python) (0) | 2020.03.04 |
---|---|
Sw Expert 1952. 수영장 (python) (0) | 2020.02.29 |
프로그래머스 N으로 표현 Python (0) | 2020.02.22 |
SW Expert Academy 4881. 배열 최소 합 (0) | 2020.02.18 |
백준 14503 로봇 청소기 (0) | 2020.02.17 |
댓글