728x90
https://www.acmicpc.net/problem/21608
- 생각
- 코드
# 교실 크기 N*N
N = int(input())
# 좋아하는 학생 리스트
# idx(0)은 idx(1~4) 좋아해
like = [list(map(int,input().split())) for _ in range(N**2)]
# 교실
seat = [[0]*N for _ in range(N)]
# 나의 자리는?
for me in range(N**2):
# 내가 앉을 자리
me_r,me_c = 0,0
# 인접한 자리에 좋아하는 학생 수, 비어 있는 자리 수
me_likepeoplecnt, me_emptycnt = -1,-1
# 모두 돌아보자
for r in range(N):
for c in range(N):
# 빈자리인지부터 확인
if not seat[r][c]:
# r,c의 인접한 자리에 좋아하는 학생 수
likepeoplecnt = 0
# r,c의 인접 빈 자리
emptycnt = 0
# 인접 자리 확인 해보자
for dr,dc in [(0,1),(1,0),(0,-1),(-1,0)]:
nr = r + dr
nc = c + dc
# 교실 내의 자리
if 0 <= nr < N and 0 <= nc < N:
# 이 자리에 내가 좋아하는 사람이 앉았나?
if seat[nr][nc] in like[me]:
likepeoplecnt += 1
# 빈자리?
if seat[nr][nc] == 0:
emptycnt += 1
# 현 위치가 최상의 자리인가?
# 최상의 자리 :인접자리에 좋아하는 사람수가 가장 많으면서 인접에 빈자리가 많음
if likepeoplecnt > me_likepeoplecnt or (likepeoplecnt == me_likepeoplecnt and emptycnt > me_emptycnt):
# 갱신
me_r,me_c = r,c
me_likepeoplecnt, me_emptycnt = likepeoplecnt, emptycnt
# 내자리 앉기
seat[me_r][me_c] = like[me][0]
# 다 앉았으면 만족도 조사
good = 0
for r in range(N):
for c in range(N):
# 나의 만족도
likecnt = 0
for dr,dc in [(0,1),(1,0),(0,-1),(-1,0)]:
nr = r + dr
nc = c + dc
# 교실 내의 자리
if 0 <= nr < N and 0 <= nc < N:
# 이 자리에 내가 좋아하는 사람이 앉았나?
if seat[nr][nc] in [x for x in like if x[0]==seat[r][c]][0]:
likecnt += 1
# 만족도 점수 더하기 (10의 거듭제곱)
if likecnt:
good += 10**(likecnt-1)
print(good)
- 이 문제를 통해 배운 코드
# for문과 if문을 함께 한 줄로
x for x in [1,2,3] if x==1
728x90
반응형
'TIL - 프로그래밍 > Python 알고리즘' 카테고리의 다른 글
[백준] 2841. 외계인의 기타 연주 - Python (0) | 2022.06.01 |
---|---|
[백준] 2644. 촌수계산 - Python (0) | 2022.06.01 |
[백준] 2178. 미로탐색 -Python (0) | 2022.05.30 |
[프로그래머스] Lv.1 신고 결과 받기 - Python (0) | 2022.05.29 |
[프로그래머스] Lv.1 신규 아이디 추천 - Python (0) | 2022.05.27 |
댓글