알고리즘/백준 문제풀이

[삼성SW역량][Python/BOJ] 백준 17144 미세먼지 안녕!(시뮬레이션)

개발자 덕구🐾 2022. 7. 15. 16:17
728x90

 

 

 

 

와 생각보다 정말 시뮬레이션이 생각해야할게 많고 어렵구나...!!!!

 

 

 

 

 

 

코드 : 

 

dx = [1,0,-1,0] 
dy = [0,-1,0,1]

            
if __name__=="__main__" :

    r,c,t = map(int,input().split())
    mp =[list(map(int,input().split())) for i in range(r)]
    
    for i in range(r) : # 공기청정기가 있는 행 알아내기 
        if mp[i][0] == -1 and mp[i+1][0] == -1 : 
            now = (i,i+1)
            break

    for _ in range(t) :
        
        # 확산 
        
        # 새롭게 확산된 값을 저장할 배열 
        new = [[0]*c for i in range(r)]
        
        for i in range(r) :
            for j in range(c) :
                if mp[i][j] >= 5 :   
                    each = mp[i][j] // 5 # 확산시킬 값 
                    cnt = 0 # 확산시킨 횟수 
                    for k in range(4) :
                        ndr,ndc  = i + dx[k], j +dy[k]
                        if 0<=ndr<r and 0<=ndc<c and mp[ndr][ndc]!= -1 :
                            new[ndr][ndc] += each
                            cnt+=1 
                    mp[i][j] = mp[i][j] - (each * cnt)
                    
        for i in range(r) :
            for j in range(c) :
                mp[i][j] += new[i][j]
                
            
        # 공기청정기 (순환)
        # 공기청정기의 위쪽 # 반시계 
        
        # 오른쪽으로 
        tmp = mp[now[0]][c-1] # 가장 오른쪽은 위로 올려야하므로 미리 빼준다
        for i in range(c-2,0,-1) : 
            mp[now[0]][i+1] = mp[now[0]][i]
        
        # 위로 
        tmp2 = mp[0][c-1]
        for i in range(now[0]-1) :
            mp[i][c-1] = mp[i+1][c-1]
        mp[now[0]-1][c-1] = tmp
        
        # 왼쪽으로 
        tmp = mp[0][0]
        for i in range(c-1) :
            mp[0][i] = mp[0][i+1]
        mp[0][c-2] = tmp2
        
        # 아래쪽으로 
        for i in range(now[0]-1, 1,-1) :
            mp[i][0] = mp[i-1][0]
        mp[now[0]][1] = 0
        mp[1][0] = tmp
        
        # 공기청정기의 아래쪽 
        
        # 오른쪽 
        tmp = mp[now[1]][c-1] # 가장 오른쪽은 위로 올려야하므로 미리 빼준다
        for i in range(c-2,0,-1) : 
            mp[now[1]][i+1] = mp[now[1]][i]
        
        # 아래로 
        tmp2 = mp[r-1][c-1]
        for i in range(r-1,now[1],-1) :
            mp[i][c-1] = mp[i-1][c-1]
        mp[now[1]+1][c-1] = tmp
        
        # 왼쪽으로 
        tmp = mp[r-1][0]
        for i in range(c-1) :
            mp[r-1][i] = mp[r-1][i+1]
        mp[r-1][c-2] = tmp2
        
        # 위로 
        for i in range(now[1]+1, r-1) :
            mp[i][0] = mp[i+1][0]
        mp[now[1]][1] = 0
        mp[r-2][0] = tmp
        
        
    ans= sum([sum(mp[i]) for i in range(r)])
    print(ans+2)

 

 

 

 

<공기청정기 >

 

1. tmp를 추출(?)한다.

2. 그 자리를 다른 값이 덮는다.

3. tmp는 다른 방향의 값을 덮는다. 

 

 

 

버젼 2 :

 

dx = [1,0,-1,0] 
dy = [0,-1,0,1]

if __name__=="__main__" :
    
    r,c,t = map(int,input().split())
    mp = [list(map(int,input().split())) for i in range(r)]
    

    
    for i in range(r) :
        if mp[i][0] == -1 :
            air = (i,i+1)
            break

    for _ in range(t) :
        new = [[0]*c for i in range(r)]
        
        for i in range(r) :
            for j in range(c) :
                if mp[i][j] >=5 :
                    each = mp[i][j]//5
                    cnt = 0
                    for k in range(4) :
                        x,y = i +dx[k], j +dy[k]
                        if 0<=x<r and 0<=y<c and mp[x][y] !=-1 :
                            new[x][y] += each 
                            cnt +=1 
                    mp[i][j] = mp[i][j] - (each*cnt)
        for i in range(r) :
            for j in range(c) :
                if new[i][j] :
                    mp[i][j] += new[i][j] 

        # 위쪽 
        tmp = mp[air[0]][c-1]
        for i in range(c-2,0,-1) :
            mp[air[0]][i+1] = mp[air[0]][i]
        mp[air[0]][1] = 0
        
        tmp2 = mp[0][c-1]
        for i in range(1,air[0]) :
            mp[i-1][c-1] = mp[i][c-1]
        mp[air[0]-1][c-1] = tmp
        
        tmp = mp[0][0]
        for i in range(1,c-1) :
            mp[0][i-1] = mp[0][i]
        mp[0][c-2] = tmp2
        
        for i in range(air[0]-2,0,-1) :
            mp[i+1][0] = mp[i][0]
        mp[1][0] = tmp
        
        # 아래쪽 
        tmp = mp[air[1]][c-1]
        for i in range(c-2,0,-1) :
            mp[air[1]][i+1] = mp[air[1]][i]
        mp[air[1]][1] = 0
        
        tmp2 = mp[r-1][c-1]
        for i in range(r-2,air[1],-1) :
            mp[i+1][c-1] = mp[i][c-1]
        mp[air[1]+1][c-1] = tmp
        
        tmp = mp[r-1][0]
        for i in range(1,c-1) :
            mp[r-1][i-1] = mp[r-1][i]
        mp[r-1][c-2] = tmp2
        
        for i in range(air[1]+2,r-1) :
            mp[i-1][0] = mp[i][0]
        mp[r-2][0] = tmp
        
    ans = sum([sum(mp[i]) for i in range(r)])
    print(ans+2)

 

 

 

 

참고블로그 :

 

https://yuuj.tistory.com/96

 

[Python] 백준 17144번: 미세먼지 안녕! - simulation (삼성 기출)

문제 17144번: 미세먼지 안녕! 미세먼지를 제거하기 위해 구사과는 공기청정기를 설치하려고 한다. 공기청정기의 성능을 테스트하기 위해 구사과는 집을 크기가 R×C인 격자판으로 나타냈고, 1×1

yuuj.tistory.com

 

반응형