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)
반응형
'알고리즘 > 백준 문제풀이' 카테고리의 다른 글
[삼성SW역량][Python/BOJ] 백준 19238 스타트택시(BFS+구현) (0) | 2022.07.28 |
---|---|
[삼성SW역량][Python/BOJ] 백준 21610 마법사 상어와 비바라기(구현) (0) | 2022.07.28 |
[삼성SW역량][Python/BOJ] 백준 16236 마법사 상어와 파이어볼(구현) (0) | 2022.07.22 |
[삼성SW역량][Python/BOJ] 백준 16236 아기상어(BFS,구현) (0) | 2022.07.21 |
[삼성SW역량][Python/BOJ] 백준 16235 나무재테크(구현) (0) | 2022.07.21 |