Skip to content

Commit 40f2cad

Browse files
committed
[Feat] 마법사..
노력했으나 ... 안됐다...
1 parent 3198008 commit 40f2cad

File tree

1 file changed

+170
-0
lines changed

1 file changed

+170
-0
lines changed

Diff for: src/3week/jaewon/마법사 상어와 복제.kt

+170
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,170 @@
1+
/**
2+
*
3+
* 0. 현재 물고기 정보 저장.
4+
* 1. 물고기가 이동할 수 있는 경우
5+
* 모든 물고기는 한칸씩 이동
6+
* 상어가 있는 칸 ( shark 로 확인 ) , 물고기의 냄새가 있는 칸 ( smell로 확인 ) , 격자의 범위는 x
7+
* -> 안되면 45도씩 이동해서 갈 수 있는지 확인
8+
*
9+
*
10+
* 2. 상어가 움직이는 경우
11+
* 1,2,3,4 중에 3개를 뽑고 중복순열을 만들어서 오름차순으로 정렬하기
12+
* 해당 값을 반복하면서
13+
* 좌표를 이동
14+
* 불가능하면 -> 이동x
15+
* 물고기가 있다면 -> 물고기 제외 count 추가
16+
* 물고기 제외 count max()
17+
* max인 값의 좌표로 이동후 물고기 냄새 표시하기.
18+
*
19+
*
20+
* 3. smell에서 time이 2인 얘들 삭제
21+
* 4. 기존의 fishse 그대로 적용... 오마갓...
22+
*
23+
*
24+
*/
25+
26+
data class FISH (val x : Int, val y : Int, val arrow : Int)
27+
data class SMELL (val x : Int, val y : Int, var time : Int)
28+
29+
val fishPos = mapOf<Int, Pair<Int,Int>>(
30+
0 to Pair(0,0),
31+
1 to Pair(0,-1),
32+
2 to Pair(-1,-1),
33+
3 to Pair(-1,0),
34+
4 to Pair(-1,1),
35+
5 to Pair(0,1),
36+
6 to Pair(1,1),
37+
7 to Pair(1,0),
38+
8 to Pair(1,-1)
39+
)
40+
41+
val sharkPos = mapOf(
42+
1 to Pair(-1,0),
43+
3 to Pair(1,0),
44+
2 to Pair(0,-1),
45+
4 to Pair(0,1)
46+
)
47+
48+
var sharkX = 0
49+
var sharkY = 0
50+
var fishes = mutableListOf<FISH>()
51+
val smell = mutableListOf<SMELL>()
52+
val temp = mutableListOf<FISH>()
53+
val moveSharkList = mutableListOf<String>()
54+
55+
56+
fun main(){
57+
val (m,s) = readln().split(" ").map { it.toInt() }
58+
repeat(m){
59+
val fi = readln().split(" ").map { it.toInt() }
60+
fishes.add( FISH(fi[0],fi[1],fi[2]))
61+
}
62+
63+
val shark = readln().split(" ").map { it.toInt() }
64+
sharkX = shark[0]
65+
sharkY = shark[1]
66+
makeMoveShark(arrayOf(1,2,3,4), Array(3){0},0,3)
67+
moveSharkList.sortDescending()
68+
69+
repeat(s){
70+
smell.forEach{ smell -> smell.time ++}
71+
temp.clear()
72+
temp.addAll(fishes)
73+
74+
//물고기 이동
75+
fishes.forEachIndexed { idx, fish ->
76+
var (x,y,arrow) = fish
77+
if (checkFish(x,y,arrow)){
78+
x += fishPos[arrow]!!.first
79+
y += fishPos[arrow]!!.second
80+
fishes[idx] = FISH(x,y,arrow)
81+
}else if(!checkFish(x,y,arrow)){
82+
// 이동할 수 없는 경우
83+
var i = 0
84+
while (i < 8){
85+
arrow = if( arrow == 1) 8 else { arrow-1 } // 45도 반시계로 돌리기
86+
if(checkFish(x,y,arrow)){
87+
x += fishPos[arrow]!!.first
88+
y += fishPos[arrow]!!.second
89+
fishes[idx] = (FISH(x,y,arrow))
90+
break
91+
}else {
92+
i++
93+
}
94+
}
95+
}
96+
}
97+
98+
//상어의 우선순위 이동pos 찾기
99+
var removeMax = 0
100+
var removePos = "444"
101+
moveSharkList.forEach sharkRepeat@{ pos ->
102+
var count = 0
103+
var tempMax = 0
104+
var tempSharkX = sharkX
105+
var tempSharkY = sharkY
106+
val tempFishList = mutableListOf<FISH>()
107+
tempFishList.clear()
108+
tempFishList.addAll(fishes)
109+
repeat(3){
110+
tempSharkX += sharkPos[(pos[it]).digitToInt()]!!.first
111+
tempSharkY += sharkPos[(pos[it]).digitToInt()]!!.second
112+
if (tempSharkX <= 4 && tempSharkY <=4){
113+
count++
114+
tempFishList.forEachIndexed {idx , fish ->
115+
if (tempSharkX == fish.x && tempSharkY == fish.y){
116+
// 상어자리에 물고기가 있다면
117+
tempFishList[idx] = FISH(0,0,0)
118+
tempMax++
119+
}
120+
}
121+
}
122+
}
123+
124+
if (count == 3 && tempMax >= removeMax){
125+
removeMax = tempMax
126+
removePos = pos
127+
if (removeMax == 3){ return@sharkRepeat }
128+
}
129+
}
130+
131+
removeFish(removePos) // 3번 이동( 물고기 제외 & 상어 좌표 이동 )
132+
smell.filter { it.time == 2 }.forEach { smell.remove(it) } // 두번 전에 생긴 물고기 냄새 지우기
133+
temp.forEach { fishes.add(it) }
134+
}
135+
136+
println(fishes.size)
137+
}
138+
139+
fun checkFish(x : Int, y : Int, arrow : Int) : Boolean{
140+
val newX = x + fishPos[arrow]!!.first
141+
val newY = y + fishPos[arrow]!!.second
142+
return !((newX == sharkX && newY == sharkY) || (smell.any{ smell -> smell.x == newX && smell.y == newY}) || newX >4 || newY >4)
143+
}
144+
145+
fun makeMoveShark(arr : Array<Int>, output : Array<Int>, depth : Int, r : Int){
146+
if(depth == r){
147+
moveSharkList.add(output.joinToString(""))
148+
println()
149+
return
150+
}
151+
for (i in arr.indices){
152+
output[depth] = arr[i]
153+
makeMoveShark(arr,output,depth+1, r)
154+
}
155+
}
156+
157+
fun removeFish(moveShark : String){
158+
moveShark.forEach {
159+
sharkX += sharkPos[it.digitToInt()]!!.first
160+
sharkY += sharkPos[it.digitToInt()]!!.second
161+
fishes.forEachIndexed {idx, fish ->
162+
if (sharkX == fish.x && sharkY == fish.y){
163+
// 상어자리에 물고기가 있다면
164+
fishes[idx] = FISH(0,0,0)
165+
smell.add(SMELL(fish.x,fish.y,0))
166+
}
167+
}
168+
}
169+
fishes = fishes.filterNot { it.x == 0 && it.y ==0 && it.arrow == 0 }.toMutableList()
170+
}

0 commit comments

Comments
 (0)