728x90
https://www.acmicpc.net/problem/21608
샘숭 기출은 은근 구현이 길게 나오는 문제가 많은거 같다
이 문제도 딱 그 케이스
조건에 맞게 식을 구성해서 구현해주면 된다..
난 진짜 두서없이 코드 쓰다보니까
충분히 리팩토링 할 수 있는 부분들이 보인다.
끝나고 고쳐봤자 의미없으니까!
다음부터는 꼭 코드짤때 리팩토링 잘 해서 깔끔하게 쓸 수 있도록 해야겠다!
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
n = int(input())
students_list = []
table_list = [[0 for j in range(n)] for i in range(n)]
dic = {}
dx = [1, -1, 0, 0]
dy = [0, 0, 1, -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(1, 5):
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[0] and 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
'PS > 백준' 카테고리의 다른 글
[백준 14889번] 스타트와 링크 (파이썬/python) (0) | 2021.07.02 |
---|---|
[백준 20055번] 컨베이어 벨트 위의 로봇(파이썬/python) (0) | 2021.07.01 |
[백준 14888번] 연산자 끼워넣기 (파이썬/python) (0) | 2021.07.01 |
[백준 16472번] 고냥이 (파이썬/python) (0) | 2021.07.01 |
[백준 13460번] 구슬 탈출 2 (파이썬/python) (0) | 2021.06.24 |