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

2025. 1. 26. 22:57· Koala - 17기/코딩테스트 심화 스터디
목차
  1. 문제
  2. Algorithm
  3. Code
  4. 느낀 점

문제

 

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

 


Algorithm

일반적인 구현 문제, 다만 요구 사항이 조금 까다로울 수 있다.
요구에 맞춰 자리를 배치 후, 만족도 총합을 구하여 하므로 크게 2파트로 나누어 생각해서 구현하였다.

 


 

 

Code

from collections import deque
input = __import__('sys').stdin.readline

N = int(input().rstrip())
N_list = [list(map(int, input().rstrip().split())) for i in range(N ** 2)]
N_map = [[0] * N for i in range(N)]
cntN_map = [[0] * N for i in range(N)]

def find_seat(nowNum) :
    tmpXYs = deque()
    # 1. 인접 좋아하는 학생 카운트
    for i in range(N) :
        for j in range(N) :
            tmpCnt = 0 
            if cntN_map[i][j] != -1 :
                if i > 0 :
                    if N_map[i - 1][j] in N_list[nowNum] :
                        tmpCnt += 1
                if i < N - 1 :
                    if N_map[i + 1][j] in N_list[nowNum] :
                        tmpCnt += 1
                if j > 0 :
                    if N_map[i][j - 1] in N_list[nowNum] :
                        tmpCnt += 1
                if j <  N - 1 :
                    if N_map[i][j + 1] in N_list[nowNum] :
                        tmpCnt += 1

            if tmpCnt > 0 :
                if len(tmpXYs) > 0 :
                    if tmpXYs[0][0] == tmpCnt :
                        tmpXYs.append([tmpCnt, i, j])
                    elif tmpXYs[0][0] < tmpCnt :
                        tmpXYs = [[tmpCnt, i, j]]
                else :
                    tmpXYs.append([tmpCnt, i, j])

    # 2. 비어있는 인접 칸 카운트
    if tmpXYs :
        for i in tmpXYs :
            i[0] = cntN_map[i[1]][i[2]]
    else :
        for i in range(N) :
            for j in range(N) :
                if cntN_map[i][j] != -1 :
                    tmpXYs.append([cntN_map[i][j], i, j])
    tmpXYs = list(tmpXYs)
    tmpXYs.sort(key = lambda x : (-x[0], x[1], x[2]))
    return [tmpXYs[0][1], tmpXYs[0][2]]


for i in range(N) :
    for j in range(N) :
        if (i == 0 and (j == 0 or j == N -1)) or (i == N - 1 and (j == 0 or j == N - 1)) :
            cntN_map[i][j] = 2
        elif i == 0 or i == N - 1 or j == 0 or j == N - 1 :
            cntN_map[i][j] = 3
        else :
            cntN_map[i][j] = 4
            
for i in range(N ** 2) : # 자리 배치
    seatYX = find_seat(i)
    N_map[seatYX[0]][seatYX[1]] = N_list[i][0]
    cntN_map[seatYX[0]][seatYX[1]] = -1
    if seatYX[0] > 0 and cntN_map[seatYX[0]-1][seatYX[1]] > 0:
        cntN_map[seatYX[0]-1][seatYX[1]] -= 1
    if seatYX[0] < N - 1 and cntN_map[seatYX[0]+1][seatYX[1]] > 0:
        cntN_map[seatYX[0]+1][seatYX[1]] -= 1
    if seatYX[1] > 0 and cntN_map[seatYX[0]][seatYX[1]-1] > 0:
        cntN_map[seatYX[0]][seatYX[1]-1] -= 1
    if seatYX[1] < N - 1 and cntN_map[seatYX[0]][seatYX[1]+1] > 0:
        cntN_map[seatYX[0]][seatYX[1]+1] -= 1

ans = 0
N_list.sort()
for i in range(N) : #만족도 조사
    for j in range(N) :
        tmpCnt = 0
        if i > 0 :
            if N_map[i-1][j] in N_list[N_map[i][j]-1] :
                tmpCnt += 1
        if i < N - 1 :
            if N_map[i+1][j] in N_list[N_map[i][j]-1] :
                tmpCnt += 1
        if j > 0 :
            if N_map[i][j-1] in N_list[N_map[i][j]-1] :
                tmpCnt += 1
        if j < N - 1 :
            if N_map[i][j+1] in N_list[N_map[i][j]-1] :
                tmpCnt += 1
        
        if tmpCnt == 0 :
            continue
        else :
            ans += (10 ** (tmpCnt - 1))
print(ans)

 

느낀 점

연산을 조금이라도 줄여보고자 인접한 비어있는 자리를 따로 관리하였는데, 다시 생각해보니 어차피 나중에 인접한 자리에 대해서 접근하여야 함으로 큰 차이는 없었을 것 같다는 생각이 들었다. 또한 많이 쓰이는 방향 벡터 리스트를 사용하면 코드 길이를 조금 더 줄일 수 있으나, 개인적으로 코드 읽기에 불편하여 그리하지 않았다.

 

저작자표시

'Koala - 17기 > 코딩테스트 심화 스터디' 카테고리의 다른 글

[백준/C++] 2352번: 반도체 설계  (0) 2025.01.31
[BOJ/Python3] 11658번 : 구간합 구하기 3  (0) 2025.01.31
[백준/Python] #30648 트릭플라워  (0) 2025.01.26
[백준/Python] 2003번: 수들의 합 2  (0) 2025.01.26
[BOJ/Python3] 2842번 : 집배원 한상덕  (0) 2025.01.26
  1. 문제
  2. Algorithm
  3. Code
  4. 느낀 점
'Koala - 17기/코딩테스트 심화 스터디' 카테고리의 다른 글
  • [백준/C++] 2352번: 반도체 설계
  • [BOJ/Python3] 11658번 : 구간합 구하기 3
  • [백준/Python] #30648 트릭플라워
  • [백준/Python] 2003번: 수들의 합 2
KauKoala
KauKoala
항공대 알고리즘 동아리 Koala 🥰
KauKoala
Koala
KauKoala
전체
오늘
어제
  • 분류 전체보기 (1833) N
    • 공지 게시판 (10)
    • 정보 게시판 (8)
    • Codeforce (15)
    • acm-icpc (6)
    • Koala - 1기 (16)
    • Koala - 2기 (111)
      • Programming Contest (1)
      • A반 (20)
      • B반 (39)
      • C반 (22)
      • 기초 강의 (18)
    • Koala - 3기 (10)
      • 기초 스터디 (7)
    • Koala - 4기 (67)
    • Koala - 5기 (144)
      • 기초 알고리즘 스터디 (75)
      • 코딩테스트 준비 스터디 (68)
    • Koala - 6기 (102)
      • 기초 알고리즘 스터디 (75)
      • 코딩테스트 준비 스터디 (25)
      • 모의 테스트 스터디 (1)
    • Koala - 7기 (167)
      • 기초 알고리즘 스터디 (97)
      • 코딩테스트 준비 스터디 (68)
      • 모의 테스트 스터디 (1)
    • Koala - 8기 (44)
      • 기초 알고리즘 스터디 (32)
      • 코딩테스트 준비 스터디 (10)
      • 코드포스 버츄얼 스터디 (0)
      • 프로그래머스 LV2 스터디 (0)
    • Koala - 9기 (205)
      • 기초 알고리즘 스터디 (138)
      • 코딩테스트 준비 스터디 (64)
      • 모의테스트 준비 스터디 (1)
    • Koala - 10기 (117)
      • 기초 알고리즘 스터디 (30)
      • 코딩테스트 준비 스터디 (86)
      • 모의테스트 준비 스터디 (1)
    • Koala - 11기 (151)
      • 기초 알고리즘 스터디 (46)
      • 코딩테스트 준비 스터디 (104)
      • 모의테스트 준비 스터디 (1)
    • Koala - 12기 (86)
      • 기초 알고리즘 스터디 (31)
      • 코딩테스트 준비 스터디 (55)
    • Koala - 13기 (119)
      • 기초 알고리즘 스터디 (52)
      • 코딩테스트 준비 스터디 (67)
    • Koala - 14기 (116)
      • 기초 알고리즘 스터디 (39)
      • 코딩테스트 준비 스터디 (77)
    • Koala - 15기 (138)
      • 기초 알고리즘 스터디 (73)
      • 코딩테스트 준비 스터디 (65)
    • Koala - 16기 (47)
      • 코딩테스트 기초 스터디 (16)
      • 코딩테스트 심화 스터디 (31)
    • Koala - 17기 (62)
      • 코딩테스트 기초 스터디 (15)
      • 코딩테스트 심화 스터디 (47)
    • Koala - 18기 (22) N
      • 코딩테스트 기초 스터디 (9) N
      • 코딩테스트 심화 스터디 (13) N

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • 🐨항공대 알고리즘 학회 Koala 3기 모집
  • 🐨항공대 알고리즘 학회 Koala 2기 모집
  • 소모임 소개

인기 글

태그

  • 백준
  • BOJ
  • dfs
  • C++
  • BFS
  • 백트래킹
  • dp
  • 파이썬

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.3.0
KauKoala
[백준/Python] 21608번: 상어 초등학교
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.