본문 바로가기
알고리즘 공부/Python

SW expert 2382. [모의 SW 역량테스트] 미생물 격리

by 킴워니 2020. 2. 14.

한마디
미생물 격리에는 성공했지만 메모리도 시간도 다 잃었다. 언제쯤 깔끔한 코딩이 가능할까

아직까지는 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))

그리고 얼마전에도 생각한 나의 문제점인데 개 복잡한 시뮬레이션 문제처럼 생겼지만 실은 단순한 것을 묻는 문제(가능/불가능의 여부라던지, 한 변수의 카운트라든지) 에서 갈피를 못잡고 일단 어마어마한 메모리와 시간을 써서 구현을 하는 것도 하나의 문제 같다. 물론 알고리즘 연습할 때는 이 방향이 좋은 것 같지만 시험볼 때 이러면 그냥 망해버린다구...

댓글