알고리즘/백준 문제풀이
[삼성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)
반응형