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