Skip to content

Commit 5d62445

Browse files
authored
Merge pull request #21 from kogorithm/week4_acw
[Week4] 안찬우: 근손실, 회의실 배정, 트리의 부모 찾기, 주차 요금 계산, 지름길
2 parents 7269762 + 908096e commit 5d62445

6 files changed

+399
-0
lines changed

src/4week/acw/근손실.kt

+50
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package `4week`.acw
2+
3+
class `acw근손실` {
4+
lateinit var exerciseKits: List<Int>
5+
lateinit var visit: Array<Boolean>
6+
var cnt = 0
7+
8+
9+
fun makePermutation(arr: MutableList<Int>, power: Int, day: Int, N: Int, K: Int) {
10+
//순열구성하기
11+
val powerNow = power + (arr.takeIf { it.isNotEmpty() }?.let { it.last() - K } ?: 0)
12+
13+
if (powerNow < 500) {
14+
return
15+
}
16+
17+
if (day == N) {
18+
cnt++
19+
return
20+
}
21+
22+
for (i in 0 until N) {
23+
if (visit[i]) {
24+
continue
25+
}
26+
27+
arr.add(exerciseKits[i])
28+
visit[i] = true
29+
makePermutation(arr, powerNow, day + 1, N, K)
30+
arr.remove(exerciseKits[i])
31+
visit[i] = false
32+
}
33+
}
34+
35+
36+
fun solution() {
37+
val (N, K) = readln().split(" ").map { it.toInt() }
38+
exerciseKits = readln().split(" ").map { it.toInt() }
39+
visit = Array(N) { false }
40+
makePermutation(mutableListOf(), 500, 0, N, K)
41+
42+
println(cnt)
43+
44+
}
45+
}
46+
47+
fun main() {
48+
val sol = `acw근손실`()
49+
sol.solution()
50+
}

src/4week/acw/주차요금계산.kt

+85
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
import java.util.LinkedList
2+
3+
class Solution {
4+
5+
val recordsArr = Array(10000) { LinkedList<String>() }
6+
val feeArr = Array(10000) { 0 }
7+
8+
data class Time(var hour: Int, var min: Int) {
9+
10+
constructor(hourAndMin: List<Int>) : this(hourAndMin[0], hourAndMin[1]) {
11+
this.hour = hourAndMin[0]
12+
this.min = hourAndMin[1]
13+
}
14+
15+
companion object {
16+
fun calcUsingTime(inTime: Time, outTime: Time): Int {
17+
return (outTime.hour * 60 + outTime.min - inTime.hour * 60 - inTime.min)
18+
}
19+
}
20+
}
21+
22+
fun String.timeSplit() = split(":").map { it.toInt() }
23+
24+
fun solution(fees: IntArray, records: Array<String>): IntArray {
25+
var answer: IntArray = intArrayOf()
26+
27+
for (i in records) {
28+
val (time, num, inout) = i.split(" ")
29+
if (inout == "IN") {
30+
recordsArr[num.toInt()].add(time)
31+
} else {
32+
//out이 나올경우에는 바로 해당번호에 대해 처리를 해준다.
33+
val inTime = Time((recordsArr[num.toInt()].removeLast().timeSplit()))
34+
val outTime = Time(time.timeSplit())
35+
36+
val usingTime = Time.calcUsingTime(inTime, outTime)
37+
feeArr[num.toInt()] += usingTime
38+
}
39+
}
40+
41+
for (i in 0 until 10000) {
42+
while (recordsArr[i].isNotEmpty()) {
43+
val now = Time(recordsArr[i].removeFirst().timeSplit())
44+
val usingTime = Time.calcUsingTime(Time(23, 59), now)
45+
feeArr[i] += usingTime
46+
}
47+
}//In은 했는데 Out은 안한경우 위에서 처리가 안되므로 처음부터 돌면서 23:59에서 빼준다.
48+
49+
50+
//요금 계산하기
51+
val arr = mutableListOf<Int>()
52+
for (i in 0 until 10000) {
53+
54+
if (feeArr[i] == 0) {
55+
continue
56+
} else {
57+
58+
if (feeArr[i] <= fees[0]) {
59+
arr.add(fees[1])
60+
//기본요금 부과
61+
} else {
62+
val ceilCheck = (feeArr[i] - fees[0]) % fees[2] != 0//
63+
//올림하라했으므로 올림해야하는지 check해주기
64+
65+
var remain = if (ceilCheck) {
66+
(feeArr[i] - fees[0]) / fees[2] + 1
67+
} else {
68+
(feeArr[i] - fees[0]) / fees[2]
69+
}
70+
71+
72+
arr.add(fees[1] + remain * fees[3])
73+
74+
}
75+
}
76+
77+
}
78+
answer = arr.toIntArray()
79+
80+
81+
return answer
82+
}
83+
84+
85+
}

src/4week/acw/지름길.kt

+58
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package `4week`.acw
2+
3+
4+
import java.util.*
5+
6+
class `acw지름길` {
7+
lateinit var distance: Array<Int>
8+
var roads = PriorityQueue(Comparator<Triple<Int, Int, Int>> { a, b ->
9+
a.first - b.first
10+
})
11+
12+
13+
fun solution() {
14+
val (K, D) = readln().split(" ").map { it.toInt() }
15+
distance = Array(10001) { it }
16+
17+
18+
for (i in 1..K) {
19+
val (s, e, c) = readln().split(" ").map { it.toInt() }
20+
21+
if (e > D) {
22+
continue
23+
}
24+
//목표보다 높은 지점을 향하는 지름길은 받지 않기
25+
26+
if (c >= (e - s)) {
27+
continue
28+
}
29+
//지름길이 cost가 더 클경우도 받지 않기
30+
31+
roads.add(Triple(s, e, c))
32+
}
33+
34+
while (roads.isNotEmpty()) {
35+
val (s, e, c) = roads.poll()
36+
if (distance[e] - distance[s] > c) {
37+
distance[e] = distance[s] + c
38+
for (j in e + 1..D) {
39+
if (distance[j - 1] + 1 < distance[j]) {
40+
distance[j] = distance[j - 1] + 1
41+
}
42+
}
43+
// 지름길을 순회하며 더 최소값일 경우 그 뒤의 node들에 대해서 값 갱신
44+
}
45+
}
46+
47+
48+
49+
println(distance[D])
50+
51+
52+
}
53+
}
54+
55+
fun main() {
56+
val sol = `acw지름길`()
57+
sol.solution()
58+
}

src/4week/acw/톱니바퀴.kt

+120
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
package `4week`.acw
2+
3+
4+
import kotlin.math.pow
5+
6+
//시계방향은 오른쪽shift 반시계는 왼쪽 shift
7+
const val RIGHT = 5
8+
const val LEFT = 1
9+
10+
class `acw톱니바퀴` {
11+
12+
var wheel = Array(4) { 0 }
13+
var visit = Array(4) { false }
14+
var turn = arrayListOf<Pair<Int, Int>>()
15+
16+
17+
private fun addTurn(w: Int, turnD: Int) {
18+
//dfs로 들어가면서 회전해야할 것들 turn에 추가해주기
19+
20+
21+
val wheelNowRight = if (wheel[w] and (1 shl RIGHT) != 0) 1 else 0
22+
val wheelNowLeft = if (wheel[w] and (1 shl LEFT) != 0) 1 else 0
23+
24+
if (w - 1 >= 0) {
25+
val leftWheelsRight = if (wheel[w - 1] and (1 shl RIGHT) != 0) 1 else 0
26+
if (wheelNowLeft != leftWheelsRight && !visit[w - 1]) {
27+
visit[w - 1] = true
28+
turn.add(Pair(w - 1, turnD * -1))
29+
addTurn(w - 1, turnD * -1)
30+
}
31+
}
32+
33+
if (w + 1 < 4) {
34+
val rightWheelsLeft = if (wheel[w + 1] and (1 shl LEFT) != 0) 1 else 0
35+
if (wheelNowRight != rightWheelsLeft && !visit[w + 1]) {
36+
visit[w + 1] = true
37+
turn.add(Pair(w + 1, turnD * -1))
38+
addTurn(w + 1, turnD * -1)
39+
}
40+
}
41+
42+
43+
}
44+
45+
private fun turnWheel() {
46+
47+
while (turn.isNotEmpty()) {
48+
val (w, d) = turn.removeFirst()
49+
50+
if (d == -1) {
51+
//반시계
52+
val last = wheel[w] and (1 shl 7)
53+
54+
wheel[w] = (wheel[w] shl 1) and 255
55+
if (last != 0) {
56+
wheel[w]++
57+
}
58+
59+
} else {
60+
//시계
61+
val first = wheel[w] and 1
62+
63+
wheel[w] = wheel[w] shr 1
64+
65+
if (first != 0) {
66+
wheel[w] += 1 shl 7
67+
}
68+
}
69+
70+
71+
}
72+
73+
}
74+
75+
76+
fun solution() {
77+
repeat(4) {
78+
var input = readln()
79+
var m = 128
80+
var num = 0
81+
for (i in input) {
82+
num += (i.digitToInt() * m)
83+
m /= 2
84+
}//숫자로 바꿔서 저장
85+
wheel[it] = num
86+
87+
}
88+
89+
val turnCnt = readln().toInt()
90+
repeat(turnCnt) {
91+
val (w, d) = readln().split(" ").map { it.toInt() }
92+
turn.add(Pair(w - 1, d))
93+
visit[w - 1] = true
94+
95+
96+
addTurn(w - 1, d)//회전해야할 것들 turn List에 추가해주기
97+
turnWheel()// turn List에서 빼서 회전시켜주기
98+
visit = Array(4) { false } // visit은 다시 사용해야함으로 다시 false로 초기화
99+
}
100+
101+
102+
val answer = wheel.withIndex().sumOf { (idx, value) ->
103+
if (value and (1 shl 7) != 0) {
104+
(2.0).pow(idx).toInt()
105+
} else {
106+
0
107+
}
108+
}
109+
110+
111+
println(answer)
112+
113+
114+
}
115+
}
116+
117+
fun main() {
118+
val sol = `acw톱니바퀴`()
119+
sol.solution()
120+
}
+40
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package `4week`.acw
2+
3+
class `acw트리의부모찾기` {
4+
lateinit var treeMap: Array<MutableSet<Int>>
5+
lateinit var parent: Array<Int>
6+
var N = 0
7+
8+
fun dfs(p: Int) {
9+
//p로 전달받은 노드는 부모란 뜻이니까 연결된 노드들은 자식으로 처리해주기
10+
//dfs로 이어가면서 같은 처리 해주기
11+
for (child in treeMap[p]) {
12+
parent[child] = p
13+
treeMap[child].remove(p)
14+
dfs(child)
15+
}
16+
}
17+
18+
19+
fun solution() {
20+
N = readln().toInt()
21+
treeMap = Array(N + 1) { mutableSetOf() }
22+
parent = Array(N + 1) { 0 }
23+
24+
for (i in 1 until N) {
25+
val (a, b) = readln().split(" ").map { it.toInt() }
26+
treeMap[a].add(b)
27+
treeMap[b].add(a)
28+
//일단 입력받을 경우 두 node에 대해 상호 연결하기
29+
}
30+
31+
dfs(1)
32+
println(parent.drop(2).joinToString("\n"))
33+
34+
}
35+
}
36+
37+
fun main() {
38+
val sol = `acw트리의부모찾기`()
39+
sol.solution()
40+
}

0 commit comments

Comments
 (0)