Notice
Recent Posts
Recent Comments
Link
코딩 공부
[Python](시뮬) 백준 21608번 : 상어 초등학교 본문
728x90
<접근 방법>
- 우선, 표에 주어진 정보를 가지고 있어야 하므로, info라는 큰 dictionary 안에 "해당학생번호-set(좋아하는 학생들)"의 정보를 담는다.
또한, 학생들은 순서대로 배치할 것이므로 sequence라는 list에 학생을 순서대로 담아놓는다. - 위의 sequence에 담은 학생들 순서대로,
각 칸에 배치했을 경우, 좋아하는 학생들의 수, 빈칸의 수를 세어 temp라는 하나의 임시 리스트에 정보를 저장해둔다. - temp를 본문에 쓰여 있는 기준 순서대로, 좋아하는 학생들 수, 빈칸 수, 행, 열을 기준으로 정렬한다.
- 가장 부합하는 자리(temp[0][0], temp[0][1])에 학생을 배치한다. (모든 학생 과정 동일)
- 모두 배치가 끝났다면 만족도를 계산하기 위해 각 칸을 돌며 좋아하는 학생들 수를 세어 더한다.
N = int(input())
arr = [[0]*N for _ in range(N)]
info = dict() # "해당 학생 - 좋아하는 학생 그룹" 저장
sequence = [] # 학생들 순서
for _ in range(N*N):
num, st1, st2, st3, st4 = map(int, input().split())
info[num] = {st1, st2, st3, st4}
sequence.append(num)
for num in sequence: # 학생들 순서대로 배치
temp = [] # (행, 열, 좋아하는 친구 수, 빈칸 수)를 담을 임의의 리스트
for i in range(N):
for j in range(N):
if arr[i][j]: continue
friend, blank = 0, 0
for di, dj in ((-1, 0), (0, 1), (1, 0), (0, -1)):
ni = i + di
nj = j + dj
if 0<=ni<N and 0<=nj<N:
if arr[ni][nj] in info[num]: # 주변이 친한 친구라면
friend += 1
elif not arr[ni][nj]: # 주변이 빈 칸이라면
blank += 1
temp.append((i, j, friend, blank))
# 본문의 기준대로 정렬 후 배치
temp.sort(key=lambda x: (-x[2], -x[3], x[0], x[1]))
arr[temp[0][0]][temp[0][1]] = num
satisfaction = 0
score = {0: 0, 1: 1, 2: 10, 3: 100, 4: 1000} # 점수표
for i in range(N):
for j in range(N):
count = 0
for di, dj in ((-1, 0), (0, 1), (1, 0), (0, -1)):
ni = i + di
nj = j + dj
if 0<=ni<N and 0<=nj<N and arr[ni][nj] in info[arr[i][j]]:
count += 1
satisfaction += score[count]
print(satisfaction)
이해가 되지 않는 부분이 있으면 질문 주세요. 감사합니다.
728x90
'삼성 SW 역량 테스트 기출 문제' 카테고리의 다른 글
[Python](시뮬) 백준 3190번 : 뱀 (2) | 2024.01.30 |
---|---|
[Python](시뮬) 백준 21610번 : 마법사 상어와 비바라기 (2) | 2024.01.29 |
[Python] 백준 20055번 : 컨베이어 벨트 위의 로봇 (0) | 2024.01.28 |
[Python](구현, 조합) 백준 15685번 : 치킨 배달 (0) | 2024.01.18 |
[Python](구현) 백준 14891번 : 톱니바퀴 (0) | 2024.01.18 |