– 삼성의 이전 이슈는 대부분 구현 이슈이고 코드가 길기 때문에 헷갈리지 않도록 주석이나 메모로 이어가는 것이 좋습니다.
– |r하나 -아르 자형2| + |c하나 -씨2| = 1 => 인접 셀(위, 아래, 왼쪽, 오른쪽)
– 받아쓰기에서 자신의 수험번호(키)와 좋아하는 수험번호(값)를 받아 정리하세요.
※ Python 3.6 버전부터 dict에 순서가 있습니다.
대부분의 코딩 테스트는 파이썬 버전 3.6 이상을 사용하기 때문에 사용해도 상관없지만 만일을 대비해 버전을 확인하고 사용하는 것이 좋을 것이다.
– 각 학생의 형식(좋아하는 사람 수, 무료 사각형, 행, 열)의 모든 사각형을 검토하고 구성합니다.
– 조건 1, 2, 3의 우선 순위에 따라 정렬하여 인덱스 0에 위치를 지정합니다.
(가장 많은 기준을 충족하는 좌석)
– 모두 착석 후 만족도 체크
import sys
input = sys.stdin.readline
N = int(input())
students = dict() # 학생의 번호 : (좋아하는 학생의 번호)
for _ in range(N**2):
temp = list(map(int, input().split()))
students(temp(0)) = temp(1:)
classroom = ((0)*N for _ in range(N)) # 교실
dy = (-1, 1, 0, 0)
dx = (0, 0, -1, 1)
for num in students:
possible = () # 현재 학생(num)이 앉을 수 있는 좌석
for i in range(N):
for j in range(N):
if classroom(i)(j) !
= 0: # 자리가 비어있지 않으면 pass
continue
fav = 0 # 인접한 칸에 좋아하는 학생이 있는 수
emp = 0 # 인접한 칸이 비어있는 수
for k in range(4): # 인접한 칸 확인
y, x = i + dy(k), j + dx(k),
if 0 <= y < N and 0 <= x < N: # 교실 좌석 범위 내에 체크
if classroom(y)(x) in students(num): # 좋아하는 학생 목록에 존재하는 경우
fav += 1
elif classroom(y)(x) == 0: # 비어있는 경우
emp += 1
possible.append((fav, emp, i, j)) # possible에 추가
possible.sort(key=lambda x: (-x(0), -x(1), x(2), x(3))) # 조건 1,2,3을 만족하는 순서대로 정렬
classroom(possible(0)(2))(possible(0)(3)) = num # 조건을 가장 만족하는 위치에 자리하기
answer = 0
satisfaction = {0: 0, 1: 1, 2: 10, 3: 100, 4: 1000} # 인접한 칸에 좋아하는 학생의 수에 따른 만족도
for i in range(N):
for j in range(N):
cnt = 0
for k in range(4):
y, x = i + dy(k), j + dx(k),
if 0 <= y < N and 0 <= x < N:
if classroom(y)(x) in students(classroom(i)(j)):
cnt += 1 # 인접한 칸에 좋아하는 학생이 존재한다면 카운트
answer += satisfaction(cnt) # answer에 만족도 누적
print(answer)