본문 바로가기

PS/백준

[백준 21608번] 상어 초등학교 (파이썬/python)

728x90

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

 

21608번: 상어 초등학교

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

www.acmicpc.net

 

샘숭 기출은 은근 구현이 길게 나오는 문제가 많은거 같다 

이 문제도 딱 그 케이스

 

조건에 맞게 식을 구성해서 구현해주면 된다..

 

난 진짜 두서없이 코드 쓰다보니까

충분히 리팩토링 할 수 있는 부분들이 보인다.

끝나고 고쳐봤자 의미없으니까!

다음부터는 꼭 코드짤때 리팩토링 잘 해서 깔끔하게 쓸 수 있도록 해야겠다!

 

 

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
import sys
 
input = sys.stdin.readline
= int(input())
students_list = []
table_list = [[0 for j in range(n)] for i in range(n)]
dic = {}
dx = [1-100]
dy = [001-1]
 
for i in range(n ** 2):
    students_list.append(list(map(int, input().split(" "))))
 
 
def cnt(f_list, i, j):
    count = 0
    f_count = 0
    for k in range(4):
        ny = i + dy[k]
        nx = j + dx[k]
        if nx >= 0 and nx < n and ny >= 0 and ny < n:
            if table_list[ny][nx] == 0:
                count += 1
            if f_list:
                if table_list[ny][nx] in f_list:
                    f_count += 1
    return count, f_count
 
 
for s in students_list:
 
    friend = []
    # table_list안에 내가 좋아하는 칭구가 있는지 확인해야함
    for i in range(15):
        if s[i] in dic:
            friend.append(s[i])
 
    # 좋아하는 친구가 이미 자리를 잡았을때
    if friend:
        # 모든 자리를 탐색하자
        # 주변에 친한친구 수, 근처 비어있는곳의 갯수, i좌표, j좌표
        max_cnt = []
        for i in range(n):
            for j in range(n):
                if table_list[i][j] == 0:
                    result, f_cnt = cnt(friend, i, j)
                    if not max_cnt:
                        max_cnt = [f_cnt, result, i, j]
                    if f_cnt > max_cnt[0]:
                        max_cnt = [f_cnt, result, i, j]
                    elif f_cnt == max_cnt[0and result > max_cnt[1]:
                        max_cnt = [f_cnt, result, i, j]
 
        # 자리를 찾았으면 앉히자
        table_list[max_cnt[2]][max_cnt[3]] = s[0]
        dic[s[0]] = s[1:]
 
 
    # 친구가 아직 자리를 잡기 전일때
    else:
        # 비어있는 곳의 갯수, i좌표, j좌표
        max_cnt = []
        for i in range(n):
            for j in range(n):
                if table_list[i][j] == 0:
                    result, f_cnt = cnt(friend, i, j)
                    if not max_cnt:
                        max_cnt = [result, i, j]
                    elif result > max_cnt[0]:
                        max_cnt = [result, i, j]
 
 
        # 자리를 찾았으면 앉히자
        table_list[max_cnt[1]][max_cnt[2]] = s[0]
        dic[s[0]] = s[1:]
 
# 다 앉힌 후에 점수를 계산하자
# 0:0 / 1:1 / 2:10 / 3:100 / 4:1000
point = 0
for i in range(n):
    for j in range(n):
        f_list = dic[table_list[i][j]]
        empty_val, f_cnt = cnt(f_list, i, j)
        if f_cnt == 0:
            point += 0
        elif f_cnt == 1:
            point += 1
        elif f_cnt == 2:
            point += 10
        elif f_cnt == 3:
            point += 100
        else:
            point += 1000
 
print(point)
 
cs
728x90