728x90
반응형
https://www.acmicpc.net/problem/21608
21608번: 상어 초등학교
상어 초등학교에는 교실이 하나 있고, 교실은 N×N 크기의 격자로 나타낼 수 있다. 학교에 다니는 학생의 수는 N2명이다. 오늘은 모든 학생의 자리를 정하는 날이다. 학생은 1번부터 N2번까지 번호
www.acmicpc.net
난이도
골드5
문제 설명
- n*n크기의 교실에 n^2 명의 학생이 있다.
- 학생들을 일정한 조건에 따라 교실에 배치해야한다.
조건
- 비어있는 칸 중에서 좋아하는 학생이 인접한 칸에 가장 많은 칸으로 자리를 정한다.
- 1을 만족하는 칸이 여러 개이면, 인접한 칸 중에서 비어있는 칸이 가장 많은 칸으로 자리를 정한다.
- 2를 만족하는 칸도 여러 개인 경우에는 행의 번호가 가장 작은 칸으로, 그러한 칸도 여러 개이면 열의 번호가 가장 작은 칸으로 자리를 정한다.
- 모든 학생의 만족도 합을 구해 출력 한다.
- ㄴ 만족도는 옆에 앉은 학생이 좋아하는 학생 수 에 따라 결정된다 0인경우 0 , 1명인경우 1 ,2명인경우 10, 3 : 100, 4 : 1000이다.
접근법
- 직접 조건에 따라 구현하면서 교실을 완전 탐색해야한다.
- 크게는 학생 수만큼 반복문을 돌리고 그 안에서 모든 교실의 좌석을 탐색하여 조건에 부합한지를 확인해야한다.
- 해당 교실 자리의 주변에 좋아하는 학생 수(like) , 비어 있는 칸(blank) 을 세어 임시 배열(arr)에 해당 자리 좌표와 함께 저장해준다.
- 임시배열 arr를 조건에 맞춰 like, blank순으로 내림차순 정렬해주고, 좌표값은 최소가 되도록 오름차순으로 정렬해준다.
- 초기화된 좌석 배열 (temp)에 정렬된 arr중 가장 앞의 값이 조건에 가장 부합하는 좌석임으로 학생을 해당 좌표 좌석배열에 저장해준다.
- 학생들의 교실 좌석 배정이 끝나면 점수를 계산하기 위해 학생 입력순서를 학생번호 순으로 정렬해준다.
- 교실 좌석을 모두 확인하면서 해당 학생 주변에 좋아하는 학생의 수를 센 후 만족도 점수를 더해준다.
- 모든 학생의 점수가 더해지면 총 만족도 점수를 출력해준다.
코드
room = int(input())
temp = [[0]*room for _ in range(room)] #좌석 표 초기화
students = []
dx = [-1, 1, 0, 0]
dy = [0, 0 ,-1, 1]
for _ in range(room*room):
a = list(map(int, input().split()))
students.append(a)
for s in range(room**2): #학생 수 만큼 탐색
student = students[s]
arr = []
for x in range(room): #모든 좌석 탐색
for y in range(room):
if temp[x][y] == 0:
like = 0
blank = 0
for r in range(4): # 주변 칸 탐색
nx = dx[r] + x
ny = dy[r] + y
if 0<=nx<room and 0<=ny<room:
if temp[nx][ny] in student[1:]: #좋아하는 사람이 인접한 경우 카운팅
like += 1
if temp[nx][ny] == 0: #빈칸이 있는 경우 카운팅
blank += 1
arr.append([like, blank, x, y])
arr.sort(key=lambda x:(-x[0], -x[1], x[2],x[3])) # 조건에 따라 정렬
temp[arr[0][2]][arr[0][3]] = student[0]
result = 0
students.sort()
for i in range(room):
for j in range(room):
grade = 0
for r in range(4):
nx = dx[r] + i
ny = dy[r] + j
if 0<=nx<room and 0<=ny<room:
if temp[nx][ny] in students[temp[i][j]-1]: #sort해주어 해당 좌표값-1이 학생 번호와 동일
grade += 1
if grade != 0:
result += 10**(grade-1)
print(result)
구현 ?
[구현] 알고리즘 - 구현 (Implementation)
구현 문제에 대한 알고리즘을 소스코드로 만드는 과정이 구현이다. Ex) 완전 탐색 시뮬레이션 구현 문제 풀이시 생각해야 될 점 메모리 제약 사항 채점 환경 접근 방법 파이썬의 경우 1초에 2*10^7(
h-castle.tistory.com
728x90
반응형
'알고리즘 > 백준[baekjoon]' 카테고리의 다른 글
백준 9663번 : N-Queen (by python) - DFS(백트래킹) (1) | 2024.09.09 |
---|---|
백준 1743번 : 음식물 피하기 (by python) - BFS (0) | 2024.08.22 |
[쉽게 배우는 운영체제] 제 3장 프로세스와 스레드 연습문제 풀이 정답 (심화문제) (0) | 2022.10.14 |
[baekjoon] 백준 9465번 : 스티커 (by python 파이썬) (0) | 2022.09.18 |
[baekjoon] 백준 5639번 : 이진 검색 트리 (by python 파이썬) 재귀 (0) | 2022.09.12 |