알고리즘/백준 문제풀이

[삼성SW역량][Python/BOJ] 백준 21608 상어초등학교(구현)

개발자 덕구🐾 2022. 7. 22. 15:47
728x90

 

 

 

내 힘으로 풀었다..!!

확실히 구현 문제만 풀다보니 조금씩 실력이 늘고있다. 

 

 

1-index로 했다가 계속 틀려서 0-index로 변경했더니 풀렸다.

 

정말 그냥 구현해주면 된다. 

딕셔너리를 이용해 좋아하는 친구의 리스트를 만들어주었다. 

 

 


 

 

 

문제 풀이 : 

 

 

1. 딕셔너리를 돌면서 앉을 수 있는 자리를 찾는다. 

2. 좋아하는 친구와 인접한 개수, 비어있는 자리의 개수를 정렬한다.

3. 가장 적절한 자리를 찾아 해당 상어를 놓는다.

4. 인접한 곳에 친한 친구의 수를 구해 만족도를 구한다. 

 

 

 

 

코드 : 

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

    
if __name__=="__main__" :
    n = int(input())
    dic = {}
    for i in range(n**2) :
        a,b,c,d,e = map(int,input().split())
        dic[a] = [b,c,d,e]
    mp = [[0]*(n) for i in range(n)]   
    
    for k in dic.keys() :
        tmp_list = []
        for x in range(n) :
            for y in range(n) :
                # 좋아하는 친구와 빈칸의 수를 저장할 변수 
                like,empty = 0,0
                if mp[x][y] == 0 : # 비어있는 칸 중 
                    for dir in range(4) :  # 인접한 칸에 
                        nx,ny = x + dx[dir], y + dy[dir]
                        if  0<=nx<n and 0<=ny<n  :
                            if mp[nx][ny] in dic[k] : # 좋아하는 학생이 있거나
                                like +=1 
                            elif mp[nx][ny] == 0: # 비어있다면 
                                empty+=1 
                    tmp_list.append([like,empty,x,y])
        
        # 좋아하는 학생이 많고, 빈칸이 많고, 행번호가 작고, 열번호가 작은 순으로 정렬 
        tmp_list.sort(key = lambda x : (-x[0],-x[1],x[2],x[3]))
        
        val = tmp_list.pop(0)
        mp[val[2]][val[3]] = k

    
    # 만족도 구하기 
    ans =0
    for x in range(n) :
        for y in range(n) :
            cnt = 0
            for dir in range(4) :
                nx,ny = x+dx[dir], y + dy[dir]
                # 인접한 칸에 친한 친구가 있다면 
                if 0<=nx<n and 0<=ny<n  :
                    if mp[nx][ny] in dic[mp[x][y]] :
                        cnt+=1 
            if cnt ==0 : continue
            else :
                ans+= 10**(cnt-1)
    print(ans)

 

 

 

 

반응형