Skip to content

Commit d0f913e

Browse files
committed
지름길 해결
1 parent fd3477f commit d0f913e

File tree

4 files changed

+128
-143
lines changed

4 files changed

+128
-143
lines changed

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

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,52 +1,52 @@
11
package `4week`.acw
22

3-
class `acw근손실`{
4-
lateinit var exerciseKits:List<Int>
5-
lateinit var visit:Array<Boolean>
6-
var cnt=0
3+
class `acw근손실` {
4+
lateinit var exerciseKits: List<Int>
5+
lateinit var visit: Array<Boolean>
6+
var cnt = 0
77

88

9-
10-
fun makeComb(arr:MutableList<Int>,power:Int,day:Int,N:Int,K:Int){
11-
var powerNow=power
12-
if(arr.isNotEmpty()){
13-
powerNow=power+arr.last()-K
9+
fun makePermutation(arr: MutableList<Int>, power: Int, day: Int, N: Int, K: Int) {
10+
//순열구성하기
11+
var powerNow = power
12+
if (arr.isNotEmpty()) {
13+
powerNow = power + arr.last() - K
1414
}
1515

16-
if(powerNow<500)
17-
{
16+
if (powerNow < 500) {
1817
return
1918
}
2019

21-
if(day==N){
20+
if (day == N) {
2221
cnt++
2322
return
2423
}
2524

26-
for(i in 0 until N){
27-
if(visit[i]){
25+
for (i in 0 until N) {
26+
if (visit[i]) {
2827
continue
2928
}
3029

3130
arr.add(exerciseKits[i])
32-
visit[i]=true
33-
makeComb(arr,powerNow,day+1,N,K)
31+
visit[i] = true
32+
makePermutation(arr, powerNow, day + 1, N, K)
3433
arr.remove(exerciseKits[i])
35-
visit[i]=false
34+
visit[i] = false
3635
}
3736
}
3837

3938

40-
fun solution(){
41-
val (N,K)=readln().split(" ").map { it.toInt() }
42-
exerciseKits=readln().split(" ").map { it.toInt() }
43-
visit=Array(N){false}
44-
makeComb(mutableListOf(),500,0,N,K)
39+
fun solution() {
40+
val (N, K) = readln().split(" ").map { it.toInt() }
41+
exerciseKits = readln().split(" ").map { it.toInt() }
42+
visit = Array(N) { false }
43+
makePermutation(mutableListOf(), 500, 0, N, K)
4544

4645
println(cnt)
4746

4847
}
4948
}
49+
5050
fun main() {
5151
val sol = `acw근손실`()
5252
sol.solution()

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

Lines changed: 28 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -3,74 +3,56 @@ package `4week`.acw
33

44
import java.util.*
55

6-
class `acw지름길`{
7-
lateinit var distance:Array<Int>
8-
var roads= arrayListOf<Triple<Int,Int,Int>>()
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+
})
911

10-
fun solution(){
11-
val (K,D)=readln().split(" ").map{it.toInt()}
12-
distance=Array(10001){it}
1312

14-
var now=0
15-
var nowCost=0
13+
fun solution() {
14+
val (K, D) = readln().split(" ").map { it.toInt() }
15+
distance = Array(10001) { it }
1616

17-
for(i in 1..K){
18-
val (s,e,c)=readln().split(" ").map{it.toInt()}
1917

20-
if(e>D){
18+
for (i in 1..K) {
19+
val (s, e, c) = readln().split(" ").map { it.toInt() }
20+
21+
if (e > D) {
2122
continue
2223
}
24+
//목표보다 높은 지점을 향하는 지름길은 받지 않기
2325

24-
if(c>=(e-s)){
26+
if (c >= (e - s)) {
2527
continue
2628
}
29+
//지름길이 cost가 더 클경우도 받지 않기
2730

28-
roads.add(Triple(s,e,c))
31+
roads.add(Triple(s, e, c))
2932
}
3033

31-
while(roads.isNotEmpty()){
32-
var now=roads.first()
33-
var cost=now.second-now.first-now.third
34-
var nowRange=now.first..now.second
35-
val arr= LinkedList<Triple<Int,Int,Int>>()
36-
37-
for(i in 1 until roads.size){
38-
val (s,e,c)=roads[i]
39-
if(s in nowRange || e in nowRange){
40-
arr.add(Triple(s,e,c))
41-
}
42-
}
43-
arr.add(now)
44-
for(i in 0 until arr.size){
45-
var costNow=arr[i].second-arr[i].first-arr[i].third
46-
for(j in i+1 until arr.size){
47-
48-
if(arr[i].second<=arr[j].first || arr[i].first>=arr[j].second){
49-
costNow+=(arr[j].second-arr[j].first-arr[j].third)
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
5041
}
5142
}
52-
if(costNow>cost){
53-
cost=costNow
54-
}
55-
56-
}//겹치는 것들 중 구성할 수 있는 최대 값 구성
57-
distance[D]-=cost
58-
59-
60-
roads.removeAll(arr)
61-
62-
43+
// 지름길을 순회하며 더 최소값일 경우 그 뒤의 node들에 대해서 값 갱신
44+
}
6345
}
6446

6547

6648

67-
6849
println(distance[D])
6950

7051

7152
}
7253
}
73-
fun main(){
74-
val sol =`acw지름길`()
54+
55+
fun main() {
56+
val sol = `acw지름길`()
7557
sol.solution()
7658
}

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

Lines changed: 58 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -4,65 +4,65 @@ package `4week`.acw
44
import kotlin.math.pow
55

66
//시계방향은 오른쪽shift 반시계는 왼쪽 shift
7-
const val RIGHT=5
8-
const val LEFT=1
7+
const val RIGHT = 5
8+
const val LEFT = 1
99

10-
class `acw톱니바퀴`{
11-
var wheel=Array(4){0}
12-
var visit=Array(4){false}
13-
var turn= arrayListOf<Pair<Int,Int>>()
10+
class `acw톱니바퀴` {
11+
var wheel = Array(4) { 0 }
12+
var visit = Array(4) { false }
13+
var turn = arrayListOf<Pair<Int, Int>>()
1414

1515

16-
fun addTurn(w:Int,turnD:Int){
16+
fun addTurn(w: Int, turnD: Int) {
1717

1818

19-
20-
var wheelNowRight=if(wheel[w] and (1 shl RIGHT)!=0) 1 else 0
21-
var wheelNowLeft=if(wheel[w] and (1 shl LEFT) !=0) 1 else 0
19+
var wheelNowRight = if (wheel[w] and (1 shl RIGHT) != 0) 1 else 0
20+
var wheelNowLeft = if (wheel[w] and (1 shl LEFT) != 0) 1 else 0
2221
println("$w $wheelNowLeft $wheelNowRight")
2322

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)
23+
if (w - 1 > 0) {
24+
val leftWheelsRight = if (wheel[w - 1] and (1 shl RIGHT) != 0) 1 else 0
25+
if (wheelNowLeft != leftWheelsRight && !visit[w - 1]) {
26+
visit[w - 1] = true
27+
turn.add(Pair(w - 1, turnD * -1))
28+
addTurn(w - 1, turnD * -1)
3029
}
3130
}
3231

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)
32+
if (w + 1 < 4) {
33+
val rightWheelsLeft = if (wheel[w - 1] and (1 shl LEFT) != 0) 1 else 0
34+
if (wheelNowRight != rightWheelsLeft && !visit[w + 1]) {
35+
visit[w + 1] = true
36+
turn.add(Pair(w + 1, turnD * -1))
37+
addTurn(w + 1, turnD * -1)
3938
}
4039
}
4140

4241

4342
}
44-
fun turnWheel(){
4543

46-
while(turn.isNotEmpty()){
47-
val (w,d)=turn.removeFirst()
44+
fun turnWheel() {
45+
46+
while (turn.isNotEmpty()) {
47+
val (w, d) = turn.removeFirst()
4848

49-
if(d==-1){
49+
if (d == -1) {
5050
//반시계
51-
val last=wheel[w] and (1 shl 7)
51+
val last = wheel[w] and (1 shl 7)
5252

53-
wheel[w]=wheel[w] shl 1
54-
if(last!=0){
53+
wheel[w] = wheel[w] shl 1
54+
if (last != 0) {
5555
wheel[w]++
5656
}
5757

58-
}else{
58+
} else {
5959
//시계
60-
val first=wheel[w] and 1
60+
val first = wheel[w] and 1
6161

62-
wheel[w]=wheel[w] shr 1
62+
wheel[w] = wheel[w] shr 1
6363

64-
if(first!=0){
65-
wheel[w]+=1 shl 7
64+
if (first != 0) {
65+
wheel[w] += 1 shl 7
6666
}
6767
}
6868

@@ -72,51 +72,51 @@ class `acw톱니바퀴`{
7272
}
7373

7474

75-
fun solution(){
76-
repeat(4){
77-
var input=readln()
78-
var m=128
79-
var num=0
80-
for(i in input){
81-
num+=(i.digitToInt()*m)
82-
m/=2
75+
fun solution() {
76+
repeat(4) {
77+
var input = readln()
78+
var m = 128
79+
var num = 0
80+
for (i in input) {
81+
num += (i.digitToInt() * m)
82+
m /= 2
8383
}
84-
wheel[it]=num
84+
wheel[it] = num
8585

8686
}
8787

88-
val turnCnt=readln().toInt()
89-
repeat(turnCnt){
90-
val (w,d)=readln().split(" ").map{it.toInt()}
91-
turn.add(Pair(w,d))
92-
visit[w]=true
88+
val turnCnt = readln().toInt()
89+
repeat(turnCnt) {
90+
val (w, d) = readln().split(" ").map { it.toInt() }
91+
turn.add(Pair(w, d))
92+
visit[w] = true
9393

9494

95-
addTurn(w,d)
95+
addTurn(w, d)
9696
println(turn)
9797
turnWheel()
98-
for( i in wheel){
98+
for (i in wheel) {
9999
println(i)
100100
}
101-
visit=Array(4){false}
101+
visit = Array(4) { false }
102102
}
103103

104104

105-
var answer=0
106-
for(i in 0 until 4){
107-
if((wheel[i] and (1 shr 7))==0){
108-
answer+=(2.0).pow(i).toInt()
105+
var answer = 0
106+
for (i in 0 until 4) {
107+
if ((wheel[i] and (1 shr 7)) == 0) {
108+
answer += (2.0).pow(i).toInt()
109109
}
110110
}
111111

112112

113113
println(answer)
114114

115115

116-
117116
}
118117
}
119-
fun main(){
120-
val sol=`acw톱니바퀴`()
118+
119+
fun main() {
120+
val sol = `acw톱니바퀴`()
121121
sol.solution()
122122
}

0 commit comments

Comments
 (0)