Skip to content

Commit ec599bf

Browse files
committed
1 parent ea71981 commit ec599bf

File tree

1 file changed

+150
-0
lines changed

1 file changed

+150
-0
lines changed
Lines changed: 150 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,150 @@
1+
"""
2+
#2024삼성 상반기 오전1번 문제 / 고대문명유적탐사
3+
#링크 : https://www.codetree.ai/ko/frequent-problems/problems/ancient-ruin-exploration/description?introductionSetId=&bookmarkId=
4+
5+
6+
"""
7+
"""
8+
# 유형 : 걍 구현
9+
- . 5x5위 7가지 유물(1-7)
10+
1. 탐사 진행 - 지정된 3x3회전 시계방향으로 [90,180 , 270] 중 하나의 각도로 회전
11+
=> 각 회전시 "각도| 획득가치 | 중심좌표" 저장
12+
- (1) 유물 1차 획득 가치 최대화
13+
- (2) 회전 각도 최소화
14+
- (3) 회전 중심 좌표 열(row)이 최소 -> 행 최소
15+
16+
17+
2. 유물 획득
18+
- 3개 같은 종류 이웃하면 -> 사라지는 조각 개수 = 유물 가지 => 필트에 빔
19+
- 생성 순서는 유적 벽면 순서 -> 열이 작은 쪽 -> & 행 큰것 순서 up
20+
- 조각 고갈 문제는 없음, 단 사용한 조각은 재활용 x >
21+
22+
3. 탐사 반복 (출력조건)
23+
- K번 (1번 : 탐사진행 -> 유물획득) => 획득 유물 가치 출력
24+
- 중간 획득 유물 방법 존재 x -> 종료 (출력 : x )
25+
26+
"""
27+
28+
"""
29+
<전체 flow>
30+
# 0. 변수 입력 : 탐사 회수 K , 유물 스페어 개수 M
31+
### K 번 반복
32+
# 중심좌표 후보군 9개 / 각도 후보군 3개 -> 27번 반복
33+
#1. def 회전(중심좌표, 각도)
34+
35+
#2. 유물 획득 -> 유물 가치 저장
36+
#-> 27번 반복
37+
#3. 해당 턴에서 Best choice 인 상황 결정
38+
# 3.유물 업데이트
39+
###
40+
"""
41+
"""
42+
input : 중심 좌표, angle , field
43+
ouptut : 변환된 field
44+
45+
위치 idx :
46+
[[i-1 , j-1], [i-1, j],[i-1,j+1],[i+1,j-1] , [i,j] [ i,j+1], [i+1,j-1],[i+1,j],[i+1,j+1]]
47+
90 = [7,5,1,8,5,2,9,6,3]
48+
80 = [7,8,9,4,5,6,1,2,3]
49+
270 = [1,4,7,2,5,8,3,6,9]
50+
"""
51+
"""
52+
# 유물 획득 함수 : BFS
53+
# 현 field 상황에서 얻을 수 있는 경우의 수
54+
def get_old (field):
55+
"""
56+
57+
# 중심 좌표 후보군 +
58+
# 0. 입력 변수 입력 받기
59+
K , M = map(int, input().split())
60+
# 0-1. 초기 필드 값 받기
61+
62+
sfield = [list(map(int,input().split())) for _ in range(5) ]
63+
wall = list(map(int, input().split()))
64+
# 상하좌우
65+
dy = [-1,1,0,0]
66+
dx = [0,0,-1,1]
67+
68+
69+
# (1) 90/180/270 회전 함수
70+
def rotate(i,j, angle ,field) :
71+
old_33=[[i-1 , j-1], [i-1, j],[i-1,j+1],[i+1,j-1] , [i,j] ,[ i,j+1], [i+1,j-1],[i+1,j],[i+1,j+1]]
72+
ro_pos =[]
73+
if angle == "90":
74+
ro_pos = [6,4,0,7,4,1,8,5,2]
75+
elif angle == "180":
76+
ro_pos = [6,7,8,3,4,5,0,1,2]
77+
else:
78+
ro_pos = [0,3,6,1,4,7,2,5,8]
79+
new_field = [row[:] for row in field]
80+
for p in range(0,9):
81+
82+
old = field[old_33[p][0]][old_33[p][1]]
83+
new_field[old_33[ro_pos.index(p)][0]][old_33[ro_pos.index(p)][1]] = old
84+
return field
85+
86+
# 현 field 상황에서 가치 업데이트
87+
def get_old (field):
88+
del_pos = []
89+
visited = [] # 방문 여부
90+
oldest = [] # 각 start point에서 연결된 유물 위치
91+
for i in range(5):
92+
for j in range(5):
93+
if [i,j] not in visited :
94+
# start point와 같은 종류의 유물만 획득 가능
95+
q = []
96+
q.append([i,j])
97+
visited.append([i,j])
98+
while q :
99+
cy,cx = q.pop()
100+
for d in range(4) :
101+
ny , nx = cy + dy[d] , cx + dx[d]
102+
if 0 <= ny < 5 and 0 <= nx < 5 :
103+
if [ny,nx] not in visited and field[ny][nx] == field[cy][cx]:
104+
q.append([ny,nx])
105+
visited.append([ny,nx])
106+
oldest.append([ny,nx])
107+
108+
# 획득 있으면 -> 유물 개수 + 위치 누적
109+
if len(oldest) >= 3 : # 3개 이상 연결시 획득 가능
110+
del_pos.extend(oldest)
111+
# print(del_pos)
112+
oldest.clear()
113+
114+
return len(del_pos) , del_pos
115+
# best 상황 선택
116+
def cur_best(current_case):
117+
arr = sorted(current_case , key=lambda x : (-x[0] , x[1] , x[2], x[3]))
118+
return arr[0]
119+
120+
121+
answer = []
122+
123+
for k in range(K):
124+
current_case = [] # 27경우 [유물가지, 각도 , 열, 행 ,삭제 위치 ]
125+
# 9개의 중심좌표 후보군
126+
ro_sub = [90,180,270]
127+
center_sub= [[1,1], [1,2],[1,3],[2,1] ,[2,2] ,[2,3],[3,1],[3,2],[3,3]]
128+
for center_y , center_x in center_sub :
129+
for ro_angle in ro_sub :
130+
sub_field = rotate(center_y,center_x, ro_angle ,sfield)
131+
value_sub , del_sub = get_old (sub_field)
132+
current_case.append([value_sub, ro_angle, center_y, center_x, sub_field ,del_sub])
133+
134+
#3. 해당 턴에서 베스트 상황 1개 선택
135+
# value 가 없는 경우 -> 끝
136+
if len(current_case) <= 0 :
137+
break
138+
best_sit=cur_best(current_case)
139+
answer.append(best_sit[0])
140+
#4. fiedl 상황 업데이트
141+
# 유물 매꾸기 - sort로 삭제된 위치 정렬 후 wall(유물벽면) 수행
142+
arr = sorted(best_sit[-1] , key = lambda x : (x[0] , -x[1])) # 사라진 유물 위치
143+
sfield = best_sit[-2]
144+
pointer = 0
145+
for y,x in arr :
146+
node = wall[pointer]
147+
sfield[y][x] = node
148+
pointer= (pointer+1)%len(wall)
149+
150+
print(answer)

0 commit comments

Comments
 (0)