티스토리 뷰
문제
https://www.acmicpc.net/problem/21608
풀이
구현만 하면 되는 문제였다.
학생별로 모든 칸을 탐색하며 빈 칸인 경우엔 상하좌우 칸을 확인해서 좋아하는 친구의 수, 비어있는 칸 수를 기록하여 (x,y,좋아하는 수, 빈 칸 수)의 형태로 리스트에 담아주었다.
이후에 정렬을 통해 문제의 조건대로 정렬해주었고, 맨 앞의 자리에 학생을 앉게 하였다.
정렬할 때, filter의 형식이 스위프트와 좀 달라서 헷갈렸다. lambda를 이용해보니 신세계..
import sys
input = sys.stdin.readline
d = [(1,0),(-1,0),(0,1),(0,-1)]
n = int(input())
seats = [[0 for _ in range(n)] for _ in range(n)]
students = {}
for _ in range(n * n):
temp = list(map(int,input().split()))
student = temp[0]; likeList = temp[1:]
students[student] = likeList
available = [] # (x,y,좋아하는수,빈칸수)
for i in range(n):
for j in range(n):
if seats[i][j] == 0:
#비어있는 칸이므로 주변에 비어있는칸과 좋아하는 수 확인후에 available에 넣기
emptyCount = 0; likeCount = 0
for k in range(4):
newX = i + d[k][0]; newY = j + d[k][1]
if newX < 0 or newY < 0 or newX >= n or newY >= n:
continue
if seats[newX][newY] == 0:
emptyCount += 1
elif seats[newX][newY] in likeList:
likeCount += 1
available.append((i,j,likeCount,emptyCount))
available.sort(key=lambda n: (n[2],n[3],-n[0],-n[1]),reverse=True)
seats[available[0][0]][available[0][1]] = student
sum = 0
for i in range(n):
for j in range(n):
count = 0
for k in range(4):
newX = i + d[k][0]; newY = j + d[k][1]
if newX < 0 or newY < 0 or newX >= n or newY >= n:
continue
if seats[newX][newY] in students[seats[i][j]]:
count += 1
if count == 1:
sum += 1
elif count == 2:
sum += 10
elif count == 3:
sum += 100
elif count == 4:
sum += 1000
print(sum)
_____________________________________________________________________________________________________
파이썬 문법에 조금씩 적응된다고 생각했는데 아직 한참남은듯.. filter가 엄청 간편한데 헷갈림.
'PS' 카테고리의 다른 글
[Python] 백준_주사위 굴리기(14499) (0) | 2023.03.17 |
---|---|
[Python] 백준_테트로미노(14500) (0) | 2023.03.16 |
[Python] 백준_마법사 상어와 비바라기(21610) (0) | 2023.03.16 |
[Swift/Python] 백준_톱니바퀴(14891) (0) | 2023.03.13 |
[Swift/Python] 백준_음식물 피하기(1743) (1) | 2023.03.11 |
댓글
최근에 올라온 글
- Total
- Today
- Yesterday