ye0nn
영차영차
ye0nn
전체 방문자
오늘
어제
  • 분류 전체보기 (61)
    • CS (0)
      • 운영체제 (0)
      • 네트워크 (0)
      • 알고리즘 & 자료구조 (0)
    • 코딩테스트 (48)
      • 프로그래머스 (40)
      • 백준 (8)
    • 프로그래밍 (11)
      • 프론트엔드 (3)
      • 자바스크립트 (0)
      • 스위프트 (7)
      • 파이썬 (1)
    • 취준기록 (1)

인기 글

블로그 메뉴

  • 홈
  • 태그
  • 방명록

티스토리

hELLO · Designed By 정상우.
ye0nn

영차영차

[백준] 21608번: 상어 초등학교 (Python)
코딩테스트/백준

[백준] 21608번: 상어 초등학교 (Python)

2023. 4. 5. 22:54

 

 

 

 

 

https://www.acmicpc.net/problem/21608

 

21608번: 상어 초등학교

상어 초등학교에는 교실이 하나 있고, 교실은 N×N 크기의 격자로 나타낼 수 있다. 학교에 다니는 학생의 수는 N2명이다. 오늘은 모든 학생의 자리를 정하는 날이다. 학생은 1번부터 N2번까지 번호

www.acmicpc.net

 

 

 

 

 

✅  Solution

  • 문제에 나온 대로 구현하면 된다!
  • students 배열을 돌면서 각 학생이 앉을 수 있는 자리를 모두 구해 정렬한 뒤, 학생의 자리를 정한다.
    • 먼저 모든 자리를 돌면서 빈자리가 있는지 확인한다.
    • 만약 빈자리가 있다면, 그 자리에서 거리가 1인 방향을 모두 확인하여 주위에 학생이 좋아하는 학생이 있는지 확인한 후, prefer 변수에 더해준다.
    • 그리고 주위에 빈자리가 있다면 empty 변수에 더해준다.
    • 주위 네 방향을 모두 확인한 후, (행, 열, 좋아하는 학생의 수, 빈자리의 수)를 배열에 담아준다.
    • 빈자리 모두 확인하고 나서 정렬한 뒤, 제일 먼저 오는 자리에 학생을 넣어준다.
  • 모든 자리에 학생이 있다면 점수를 계산한다.
    • 주위 돌면서 좋아하는 학생의 수를 세서 answer에 더해준다.

 

 

 

 

 

✅  Code

n = int(input())
data = [[0] * n for _ in range(n)]
students = [list(map(int, input().split())) for _ in range(n**2)]

dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]

for student in students:
    available = []

    for i in range(n):
        for j in range(n):
            # 빈자리가 있다면
            if data[i][j] == 0:
                prefer, empty = 0, 0
                
                # 동서남북 방향 확인하여 
                for k in range(4):
                    nx = i + dx[k]
                    ny = j + dy[k]
                     
                    # 범위내에 있을 때
                    if 0 <= nx < n and 0 <= ny < n:
                        # 좋아하는 학생이 주위에 있다면 더해준다.
                        if data[nx][ny] in student[1:]:
                            prefer += 1
                            
                        # 빈자리가 있다면 더해준다.
                        if data[nx][ny] == 0:
                            empty += 1

                available.append((i, j, prefer, empty))
    # 정렬
    available.sort(key= lambda x: (-x[2], -x[3], x[0], x[1]))
    data[available[0][0]][available[0][1]] = student[0]

answer = 0
score = [0, 1, 10, 100, 1000]
students.sort()

for i in range(n):
    for j in range(n):
        count = 0

        for k in range(4):
            nx = i + dx[k]
            ny = j + dy[k]

            if 0 <= nx < n and 0 <= ny < n:
                if data[nx][ny] in students[data[i][j] - 1]:
                    count += 1

        answer += score[count]

print(answer)
저작자표시 (새창열림)

'코딩테스트 > 백준' 카테고리의 다른 글

[백준] 20056번 : 마법사 상어와 파이어볼 (Python)  (0) 2023.04.05
[백준] 14499번: 주사위 굴리기 (Python)  (0) 2023.04.03
[백준] 17144번: 미세먼지 안녕! (Python)  (0) 2023.03.28
[백준] 15685번: 드래곤 커브 (Python)  (0) 2023.03.27
[백준] 14891번: 톱니바퀴 (Python)  (0) 2023.03.27
    '코딩테스트/백준' 카테고리의 다른 글
    • [백준] 20056번 : 마법사 상어와 파이어볼 (Python)
    • [백준] 14499번: 주사위 굴리기 (Python)
    • [백준] 17144번: 미세먼지 안녕! (Python)
    • [백준] 15685번: 드래곤 커브 (Python)
    ye0nn
    ye0nn
    프론트엔드 개발자의 개발기록

    티스토리툴바