-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[전현수] - 케빈 베이컨의 6단계 법칙, 함께 블록 쌓기, 전구와 스위치, CCW #171
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,62 @@ | ||
package hyunsoo.`44week` | ||
|
||
/** | ||
* | ||
* <문제> | ||
* [CCW](https://www.acmicpc.net/problem/11758) | ||
* | ||
* - 아이디어 | ||
* | ||
* [참고](https://velog.io/@jini_eun/%EB%B0%B1%EC%A4%80-11758%EB%B2%88-CCW-Java-Python) | ||
* | ||
* x1 x2 x3 x4 | ||
* y1 y2 y3 y4 | ||
* - 트러블 슈팅 | ||
* | ||
*/ | ||
class `전현수_CCW` { | ||
|
||
private data class Point(val x: Int, val y: Int) | ||
|
||
fun solution() { | ||
val p = Array(3) { | ||
readln().split(" ") | ||
.map { it.toInt() } | ||
.run { | ||
Point(first(), last()) | ||
} | ||
} | ||
|
||
val first = (0..2).run { | ||
var triangle = 0 | ||
this.forEach { index -> | ||
triangle += p[index % 3].x * p[(index + 1) % 3].y | ||
} | ||
triangle | ||
} | ||
|
||
val second = (1..3).run { | ||
var triangle = 0 | ||
this.forEach { index -> | ||
triangle += p[index % 3].y * p[(index + 1) % 3].x | ||
} | ||
triangle | ||
} | ||
Comment on lines
+30
to
+44
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 직접 공식을 로직으로 짜신게 대단합니다👍 |
||
|
||
val answer = first - second | ||
println( | ||
if (0 < answer) { | ||
1 | ||
} else if (answer < 0) { | ||
-1 | ||
} else { | ||
0 | ||
} | ||
) | ||
|
||
} | ||
} | ||
|
||
fun main() { | ||
전현수_CCW().solution() | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,94 @@ | ||
package hyunsoo.`44week` | ||
|
||
import kotlin.math.min | ||
|
||
/** | ||
* | ||
* <문제> | ||
* [전구와 스위치](https://www.acmicpc.net/problem/2138) | ||
* | ||
* - 아이디어 | ||
* | ||
* - 트러블 슈팅 | ||
* | ||
*/ | ||
class `전현수_전구와_스위치` { | ||
|
||
private var bulbCnt = 0 | ||
|
||
fun solution() { | ||
|
||
bulbCnt = readln().toInt() | ||
|
||
val currentState = readln().chunked(1) | ||
.toTypedArray() | ||
|
||
val targetState = readln().chunked(1) | ||
.toTypedArray() | ||
|
||
|
||
var firstCaseCnt = 0 | ||
val firstCase = currentState.toList().toTypedArray() | ||
var secondCaseCnt = 1 | ||
val secondCase = currentState.toList().toTypedArray().apply { | ||
this.singleSwitch(0) | ||
this.singleSwitch(1) | ||
} | ||
|
||
for (index in 1 until bulbCnt) { | ||
if (firstCase[index - 1] != targetState[index - 1]) { | ||
firstCase.switch(index) | ||
firstCaseCnt++ | ||
} | ||
if (secondCase[index - 1] != targetState[index - 1]) { | ||
secondCase.switch(index) | ||
secondCaseCnt++ | ||
} | ||
} | ||
|
||
when { | ||
firstCase.contentEquals(targetState) -> { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Any의 equals 때문에 머리가 아프네요.....아무리 공부해도 어렵다 코틀린.. |
||
if (firstCase.contentEquals(secondCase)) { | ||
println(min(firstCaseCnt, secondCaseCnt)) | ||
} else { | ||
println(firstCaseCnt) | ||
} | ||
} | ||
|
||
secondCase.contentEquals(targetState) -> { | ||
if (firstCase.contentEquals(secondCase)) { | ||
println(min(firstCaseCnt, secondCaseCnt)) | ||
} else { | ||
println(secondCaseCnt) | ||
} | ||
} | ||
|
||
else -> println(-1) | ||
} | ||
|
||
|
||
} | ||
|
||
private fun Array<String>.switch(pos: Int) { | ||
when (pos) { | ||
bulbCnt - 1 -> { | ||
this.singleSwitch(pos - 1) | ||
this.singleSwitch(pos) | ||
} | ||
|
||
else -> { | ||
this.singleSwitch(pos - 1) | ||
this.singleSwitch(pos) | ||
this.singleSwitch(pos + 1) | ||
} | ||
} | ||
} | ||
Comment on lines
+72
to
+85
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 이 문제 풀이보고 코드가 너무 예뻐서 감탄했습니다
Comment on lines
+72
to
+85
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 👍👍👍
Comment on lines
+72
to
+85
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. switch 함수 만드니까 깔끔하니 좋네요! |
||
|
||
private fun Array<String>.singleSwitch(pos: Int) { | ||
if (this[pos] == "0") this[pos] = "1" else this[pos] = "0" | ||
} | ||
} | ||
|
||
fun main() { | ||
전현수_전구와_스위치().solution() | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,86 @@ | ||
package hyunsoo.`44week` | ||
|
||
import java.util.LinkedList | ||
import java.util.Queue | ||
|
||
/** | ||
* | ||
* <문제> | ||
* [케빈 베이컨의 6단계 법칙](https://www.acmicpc.net/problem/1389) | ||
* | ||
* - 아이디어 | ||
* | ||
* - 트러블 슈팅 | ||
* | ||
*/ | ||
class `전현수_케빈_베이컨의_6단계_법칙` { | ||
|
||
private lateinit var friendshipInfo: Array<BooleanArray> | ||
|
||
fun solution() { | ||
|
||
val (userCnt, relationCnt) = readln().split(" ").map { it.toInt() } | ||
|
||
var minSum = Int.MAX_VALUE | ||
var answer = 9999 | ||
|
||
friendshipInfo = Array(userCnt + 1) { | ||
BooleanArray(userCnt + 1) | ||
} | ||
|
||
repeat(relationCnt) { | ||
val (first, second) = readln().split(" ").map { it.toInt() } | ||
friendshipInfo[first][second] = true | ||
friendshipInfo[second][first] = true | ||
} | ||
|
||
for (i in 1..userCnt) { | ||
|
||
val checkList = IntArray(userCnt + 1).apply { | ||
this[0] = -1 | ||
this[i] = -1 | ||
} | ||
|
||
val queue: Queue<Pair<Int, Int>> = LinkedList() | ||
|
||
val initFriends = friendshipInfo[i] | ||
.mapIndexed { index, isFriend -> | ||
if (isFriend) index else -1 | ||
}.filter { it != -1 } | ||
|
||
initFriends.forEach { friendIndex -> | ||
queue.add(friendIndex to 1) | ||
checkList[friendIndex] = 1 | ||
} | ||
|
||
while (queue.isNotEmpty()) { | ||
val (friendIndex, distance) = queue.poll() | ||
|
||
val friends = friendshipInfo[friendIndex] | ||
.mapIndexed { index, isFriend -> | ||
if (isFriend && index != i) index else -1 | ||
}.filter { it != -1 } | ||
|
||
friends.forEach { friendIndex -> | ||
if (checkList[friendIndex] == -1 || | ||
checkList[friendIndex] != 0 | ||
) return@forEach | ||
queue.add(friendIndex to distance + 1) | ||
checkList[friendIndex] = distance + 1 | ||
} | ||
|
||
} | ||
val currentBaconNumSum = checkList.sumOf { it } + 2 | ||
if (currentBaconNumSum < minSum) { | ||
answer = i | ||
minSum = currentBaconNumSum | ||
} | ||
} | ||
|
||
println(answer) | ||
} | ||
} | ||
|
||
fun main() { | ||
전현수_케빈_베이컨의_6단계_법칙().solution() | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,57 @@ | ||
package hyunsoo.`44week` | ||
|
||
/** | ||
* | ||
* <문제> | ||
* [함께 블록 쌓기](https://www.acmicpc.net/problem/18427) | ||
* | ||
* - 아이디어 | ||
* | ||
* - 트러블 슈팅 | ||
* | ||
*/ | ||
class `전현수_함께_블록_쌓기` { | ||
|
||
fun solution() { | ||
|
||
val (studentCnt, maxBlock, targetHeight) = readln().split(" ").map { it.toInt() } | ||
|
||
val studentInfo = Array(studentCnt + 1) { | ||
mutableListOf<Int>() | ||
} | ||
|
||
repeat(studentCnt) { index -> | ||
readln().split(" ") | ||
.map { it.toInt() } | ||
.forEach { height -> | ||
studentInfo[index + 1].add(height) | ||
} | ||
} | ||
|
||
val dp = Array(studentCnt + 1) { | ||
IntArray(targetHeight + 1).apply { | ||
this[0] = 1 | ||
} | ||
} | ||
|
||
for (i in 1..studentCnt) { | ||
for (j in 1..targetHeight) { | ||
dp[i][j] += dp[i - 1][j] | ||
dp[i][j] %= 10007 | ||
|
||
studentInfo[i].forEach { blockHeight -> | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. studentInfo 에 미리 입력을 저장하고 하니 보기 좋네요!! |
||
val target = j - blockHeight | ||
if (target < 0) return@forEach | ||
dp[i][j] += dp[i - 1][target] | ||
dp[i][j] %= 10007 | ||
} | ||
} | ||
} | ||
Comment on lines
+37
to
+49
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 이중 for문 깔꼼하네요!! dp가 원래 이렇게 깔끔한 문젠데 왜 매번 지저분하게 풀어질까요..ㅋㅋㅋㅋㅋ |
||
|
||
println(dp[studentCnt][targetHeight] % 10007) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 한번 더 나눠줄 필요가 있나용?.? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 없는 것 같아요... |
||
} | ||
} | ||
|
||
fun main() { | ||
전현수_함께_블록_쌓기().solution() | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
입력과 초기화 동시에! 저도 담부턴 사용해 보겠습니다👍