Skip to content

Commit 20ebd5a

Browse files
authored
Merge pull request #13 from kogorithm/week3_jaewon
[Week3] 김재원: 킹, 크로스워드, 단풍잎 이야기, 랜선 자르기
2 parents df8c2e3 + 40f2cad commit 20ebd5a

File tree

6 files changed

+391
-0
lines changed

6 files changed

+391
-0
lines changed

Diff for: src/3week/jaewon/과제.kt

+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
2+
import kotlin.math.max
3+
4+
data class HOMEWORK (val d : Int, val w : Int)
5+
var answer = 0
6+
7+
fun main(){
8+
val n = readln().toInt()
9+
var maxDay = 0
10+
val work : MutableList<HOMEWORK> = mutableListOf()
11+
repeat(n){
12+
val list = readln().split(" ").map { it.toInt() }
13+
work.add(HOMEWORK(list[0],list[1]))
14+
maxDay = max(maxDay,list[0])
15+
}
16+
17+
for (i in maxDay downTo 1){
18+
var temp = HOMEWORK(0,0)
19+
20+
work.filter { it.d >= i }.forEach {
21+
if(temp.w < it.w){
22+
temp = it
23+
}
24+
}
25+
answer += temp.w
26+
work.remove(temp)
27+
}
28+
29+
println(answer)
30+
}

Diff for: src/3week/jaewon/단풍잎 이야기.kt

+77
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
import kotlin.math.max
2+
import kotlin.system.exitProcess
3+
4+
/**
5+
* n개의 키가 비어있고 키마다 스킬을 셋팅해주어야 함.
6+
* 퀘스트 1개마다 k개의 스킬을 사용할 수 있어야 깰 수 있음.
7+
* 최대한 많이 퀘스트를 통과할 수 있도록 키에 스킬을 지정해 주어야 한다.
8+
*
9+
* 스킬의 갯수 최대 29개.
10+
* 아이디어 !
11+
* 1. 퀘스트마다 필요한 스킬들을 전부 모아서
12+
* 2. 그 중에 n 개를 뽑는 경우의 수를 구하기.
13+
* 3. 2에서 구한 경우의 수 중에 통과할 수 있는 퀘스트를 구하기
14+
* 4. 만약!! 통과할 수 있는 경우의 수가 퀘스트 갯수와 같다면 종료.
15+
*
16+
* 반례
17+
* 3 4 2
18+
* 1 2
19+
* 1 2
20+
* 1 2
21+
* 1 2
22+
*
23+
* 퀘스트마다 필요한 스킬들을 전부 모아서 조합할 때,
24+
* 만약 필요한 스킬의 종류가 n 보다 숫자가 작다면 조합이 불가능... 2개 중에 3개를 뽑는 것은 불가능 하기 때문!!
25+
* 이 부분에 대한 예외처리가 필요했음.
26+
*/
27+
28+
var can = 0
29+
lateinit var quest : Array<IntArray>
30+
31+
fun main(){
32+
val (n,m,k) = readln().split(" ").map { it.toInt() }
33+
quest = Array(m){IntArray(k)}
34+
35+
repeat(m){
36+
val want = readln().split(" ").map { it.toInt() }.toIntArray()
37+
quest[it] = want
38+
}
39+
40+
val skills = quest.flatMap { it.asIterable() }.distinct() // 퀘스트마다 필요한 스킬들
41+
if (skills.size <= n){
42+
can = m
43+
}else{
44+
val canSkill = mutableListOf<List<Int>>()
45+
combination(canSkill,skills, Array<Boolean>(skills.size){false},0,n)
46+
canSkill.forEach {com ->
47+
var count = 0
48+
quest.forEach { it ->
49+
// 지금 퀘스트를 꺨 수 있는 지 확인.
50+
val temp = it.count { com.contains(it) }
51+
if (temp == it.size){ // 두개 다 통과
52+
count++
53+
}
54+
}
55+
if (count == quest.size){
56+
println(quest.size)
57+
exitProcess(0)
58+
}else{
59+
can = max(can,count)
60+
}
61+
}
62+
}
63+
println(can)
64+
}
65+
66+
fun <T> combination(answer: MutableList<List<T>>, el: List<T>, ck: Array<Boolean>, start: Int, target: Int) {
67+
if(target == 0) {
68+
answer.addAll( listOf(el.filterIndexed { index, t -> ck[index] }) )
69+
} else {
70+
for(i in start until el.size) {
71+
ck[i] = true
72+
combination(answer, el, ck, i + 1, target - 1)
73+
ck[i] = false
74+
}
75+
}
76+
}
77+

Diff for: src/3week/jaewon/랜선 자르기.kt

+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
/**
2+
* 어떻게 풀어야 할지 감이 안잡힘...
3+
* ㅇㅏ이디어 : 이분탐색
4+
*
5+
*/
6+
7+
fun main(){
8+
val (k,n) = readln().split(" ").map { it.toInt() }
9+
val size = IntArray(k)
10+
repeat(k){ size[it] = readln().toInt()}
11+
12+
var answer : Long = 0
13+
var high : Long = size.maxOf { it }+1.toLong()
14+
var row : Long = 1
15+
while (row <= high){
16+
val mid : Long = (high+row)/2
17+
var temp : Long = 0
18+
size.forEach {
19+
temp += it/mid
20+
}
21+
if (temp >= n){
22+
row = mid+1
23+
answer = mid
24+
}else{
25+
high = mid-1
26+
}
27+
}
28+
println(answer)
29+
}

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+
}

Diff for: src/3week/jaewon/크로스워드.kt

+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
/**
2+
* 가로 : split 를 사용해서 값을 추가해주기
3+
* 세로 : 배열에 저장 후 for문을 사용하여 문자를 만들어서 값 추가해주시
4+
* 리턴 값 : 정렬해서 첫번째 인덱스
5+
*/
6+
7+
fun main(){
8+
val (r,c) = readln().split(" ").map { it.toInt() }
9+
val list = mutableListOf<List<String>>()
10+
val answer = mutableListOf<String>()
11+
repeat(r){
12+
val input = readln()
13+
answer.addAll(input.split("#").filterNot { it.isEmpty() || it.length<2})
14+
val temp = input.chunked(1).map { it }
15+
list.add(temp)
16+
}
17+
18+
var temp = ""
19+
for (i in 0 until c) {
20+
for( j in 0 until r){
21+
temp += list[j][i]
22+
}
23+
answer.addAll(temp.split("#").filterNot { it.isEmpty() || it.length <2})
24+
temp=""
25+
}
26+
27+
println(answer.filter { it.length >= 2 }.sorted()[0])
28+
}

0 commit comments

Comments
 (0)