Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
Tags
- C++ 공백 입력
- cuDNN
- 혁펜하임강의후기
- 백준C++
- 혁펜하임
- C++ 백준
- 비교연산자
- 혁펜하임강의
- precision
- 반복문
- 패스트캠퍼스
- tensorflow
- AI강의
- 백준
- C++
- c++ 기초
- 1463
- CUDA
- pytorch
- 패스트캠퍼스혁펜하임
- 백준9095
- AIDEEPDIVE
- 조건문
- 백준1026
- for문
- C++ 함수
- 9095
- 백준1463
- 혁펜하임AI
- 1로만들기
Archives
- Today
- Total
코딩하는 덕구 🐶
142. [삼성기출38]Python 백준 21608 상어 초등학교 본문
728x90
안녕하세요 코딩하는 덕구입니다.
파이썬 백준 21608 상어 초등학교 입니다.
https://www.acmicpc.net/problem/21608
21608번: 상어 초등학교
상어 초등학교에는 교실이 하나 있고, 교실은 N×N 크기의 격자로 나타낼 수 있다. 학교에 다니는 학생의 수는 N2명이다. 오늘은 모든 학생의 자리를 정하는 날이다. 학생은 1번부터 N2번까지 번호
www.acmicpc.net
문제 접근
모든 자리를 순회하며 만약 빈 자리라면 해당 자리 좌표, 인접한 위치에 좋아하는 친구의 수, 빈 자리의 수 를 후보 리스트에 추가했습니다.
순회가 끝나면 후보 리스트를 인접한 위치의 좋아하는 친구의 수, 인접한 위치의 빈자리의 수, 행, 열 우선순위로 정렬한 후
리스트의 0번 자료를 뽑아 자리를 배정했습니다.
Python 정답 코드
백준 21608 상어 초등학교 코드입니다. 설명은 아래에 있습니다.
N = int(input())
student = [list(map(int, input().split())) for _ in range(N**2)]
board = [[0 for _ in range(N)] for _ in range(N)]
student_fav = [[] for _ in range(N**2 + 1)]
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
ans = 0
def find_adjacent_fav_and_empty_num(i, j, fav_friend):
fav_num = 0
empty_num = 0
for d in range(4):
nx, ny = i + dx[d], j + dy[d]
if 0 <= nx < N and 0 <= ny < N:
if board[nx][ny] in fav_friend:
fav_num += 1
if board[nx][ny] == 0:
empty_num += 1
return fav_num, empty_num
def solve():
global ans
for s in student:
candidate = []
for i in range(N):
for j in range(N):
if board[i][j] == 0:
adjacent_fav_num, adjacent_empty_num = find_adjacent_fav_and_empty_num(i, j, s[1:])
candidate.append([i, j, adjacent_empty_num, adjacent_fav_num])
candidate.sort(key=lambda x:[-x[3], -x[2], x[0], x[1]])
x, y, _, _ = candidate[0]
board[x][y] = s[0]
student_fav[s[0]] = s[1:]
for i in range(N):
for j in range(N):
adjacent_fav_num, _ = find_adjacent_fav_and_empty_num(i, j, student_fav[board[i][j]])
ans += 10**adjacent_fav_num//10
return ans
print(solve())
Python 코드 설명
1. 먼저 student for 문은 자리 배정 학생 순서대로 접근하여 자리를 배정합니다.
먼저 후보 리스트를 만들고 모든 자리를 순회합니다.
빈자리라면, 자리 결정에 필요한 요소들과 함께 해당 자리의 좌표까지 후보 리스트에 추가합니다.
이후 자리 결정 기준에 맞게 정렬 후 맨 앞 데이터만 뽑아 자리를 배정합니다.
2. 하단의 2중 for문은 학생의 점수를 계산해서 ans에 더합니다.
def solve():
global ans
for s in student:
candidate = []
for i in range(N):
for j in range(N):
if board[i][j] == 0:
adjacent_fav_num, adjacent_empty_num = find_adjacent_fav_and_empty_num(i, j, s[1:])
candidate.append([i, j, adjacent_empty_num, adjacent_fav_num])
candidate.sort(key=lambda x:[-x[3], -x[2], x[0], x[1]])
x, y, _, _ = candidate[0]
board[x][y] = s[0]
student_fav[s[0]] = s[1:]
for i in range(N):
for j in range(N):
adjacent_fav_num, _ = find_adjacent_fav_and_empty_num(i, j, student_fav[board[i][j]])
ans += 10**adjacent_fav_num//10
return ans
print(solve())
이 함수는 좌표 주변의 좋아하는 친구의 수와, 빈 자리의 수를 출력합니다.
def find_adjacent_fav_and_empty_num(i, j, fav_friend):
fav_num = 0
empty_num = 0
for d in range(4):
nx, ny = i + dx[d], j + dy[d]
if 0 <= nx < N and 0 <= ny < N:
if board[nx][ny] in fav_friend:
fav_num += 1
if board[nx][ny] == 0:
empty_num += 1
return fav_num, empty_num
백준 21608 상어 초등학교 Python 코드였습니다.
감사합니다.
728x90
'알고리즘 문제 풀이' 카테고리의 다른 글
144. [삼성기출40]Python 백준 21610 마법사 상어와 비바라기 시간초과 관련 (0) | 2023.09.06 |
---|---|
143. [삼성기출39]Python 백준 21609 상어 중학교 (0) | 2023.09.06 |
141. [삼성기출37]Python 백준 20058 마법사 상어와 파이어스톰 (1) | 2023.09.02 |
140. [삼성기출36]Python 백준 20057 마법사 상어와 토네이도 (0) | 2023.08.16 |
139. [삼성기출35]Python 백준 20056 마법사 상어와 파이어볼 (0) | 2023.08.14 |