어느덧 8단계네용~
재미있는 수학 시간입니다.
진법 문제는 많이 나오는 편이죠
진법의 개념을 잘 알고 계시면 쉽게 풀 수 있습니다.
import java.io.BufferedReader
import java.io.InputStreamReader
import kotlin.math.pow
//https://www.acmicpc.net/problem/2745
fun main() {
val br = BufferedReader(InputStreamReader(System.`in`))
val (n,b) = br.readLine().split(" ")
var sum = 0
val max = n.length
val alphabetList = (65..65+27).map { it.toChar() }
for (i in 0 until max) {
val idx = max - i - 1
val findNum = n[i]
if (findNum == '0') {
continue
}
val convertNum = if (findNum in alphabetList) {
findNum.code - 55
} else {
findNum.toString().toInt()
}
val multiple = b.toDouble().pow(idx.toDouble()).toInt()
sum += multiple * convertNum
}
println(sum)
}
역으로 변환하는 겁니다.
항상 말씀드리지만 A = 65 a=97을 기억하십시요
import java.io.BufferedReader
import java.io.InputStreamReader
import kotlin.math.pow
//https://www.acmicpc.net/problem/11005
fun main() {
val br = BufferedReader(InputStreamReader(System.`in`))
var (n, b) = br.readLine().split(" ").map { it.toInt() }
val result :ArrayList<Int> = arrayListOf()
while (n > 0) {
result.add(n % b)
n /= b
}
println(result.reversed().map { num -> if (num >= 10) (num+55).toChar() else num }.joinToString(""))
}
항상 갯수를 구할때는 큰수부터 몫을 구해줄것
import java.io.BufferedReader
import java.io.InputStreamReader
import kotlin.math.pow
//https://www.acmicpc.net/problem/2720
fun main() {
val br = BufferedReader(InputStreamReader(System.`in`))
var t = br.readLine().toInt()
while (t > 0) {
t--
var money = br.readLine().toInt()
val result = IntArray(4) { 0 }
result[0] = money / 25
money %= 25
result[1] = money / 10
money %= 10
result[2] = money / 5
money %= 5
result[3] = money
println(result.joinToString(" "))
}
}
살짝 어려울 수도있는데 잘생각 해보시면 n번째 단계에서 한 모서리의 점의 갯수는 이전 단계 *2 -1 을 하면 구할수 있습니다.
그리고 그만큼 줄이 있죠.
import java.io.BufferedReader
import java.io.InputStreamReader
import kotlin.math.pow
//https://www.acmicpc.net/problem/2903
fun main() {
val br = BufferedReader(InputStreamReader(System.`in`))
val n = br.readLine().toInt()
val result = IntArray(n+1)
result[0] = 2
for (i in 1..n) {
result[i] = result[i-1] *2 -1
}
println(result[n]*result[n])
}
둘러싸는 라인이 바뀌는 1,7,19,37의 규칙을 생각해보면 됩니다.
import java.io.BufferedReader
import java.io.InputStreamReader
//https://www.acmicpc.net/problem/2292
fun main() {
val br = BufferedReader(InputStreamReader(System.`in`))
val n = br.readLine().toInt()
var sum = 1
var cnt = 1
while (true) {
if (sum >= n) {
println(cnt)
break
}
sum += 6 * cnt
cnt += 1
}
}
점점 머리가 아파지는 수학~
import java.io.BufferedReader
import java.io.InputStreamReader
//https://www.acmicpc.net/problem/1193
fun main() {
val br = BufferedReader(InputStreamReader(System.`in`))
val n = br.readLine().toInt()
//처음 0,0 으로시작
var sum = 0
var idx = 0
//sum이 n보다 작을때까지만 계산시작
while (sum < n) {
idx += 1
sum += idx
}
// 위치는 총합 -n 이 idx열에서으 위치
val count = sum - n
var a = 0
var b = 0
//나누어 떨어지는 여부로 방향 결정
if (idx % 2 == 0) {
a = idx - count
b = 1 + count
} else {
b = idx - count
a = 1 + count
}
println(String.format("%d/%d", a, b))
}
무작정 반복문으로 풀면 시간초과가 납니다!
하루에 올라가는 양을 a-b
목표를 v-b 라 했을때
몫을 구해주면 되겠지용 (나머지가 있다면 +1)
package com.wonddak.backjoon_kt.chapter8
import java.io.BufferedReader
import java.io.InputStreamReader
//https://www.acmicpc.net/problem/2869
fun main() {
val br = BufferedReader(InputStreamReader(System.`in`))
val (a, b, v) = br.readLine().split(" ").map { it.toInt() }
val total = v - b
val day = a - b
val result = total / day
if (total % day == 0) {
println(result)
} else {
println(result + 1)
}
}
파이썬이였다면 그냥 더하면되지만..
애는 범위가 작아서 직접 구현을 해야합니다.
import java.io.BufferedReader
import java.io.InputStreamReader
import java.lang.Integer.max
import java.lang.Integer.min
//https://www.acmicpc.net/problem/10757
fun main() {
val br = BufferedReader(InputStreamReader(System.`in`))
//반대로 돌려주자 우선..
val (a, b) = br.readLine().split(" ").map { it.reversed() }
val minLength = min(a.length, b.length)
val maxLength = max(a.length, b.length)
// 짧은 길이 만큼 0 배열로 만들어줌.. 하나더 크게 하는 이유는 더해져서 크기가 커질수가 있기떄문에..
val answer = IntArray(maxLength + 1) { 0 }
for (i in 0 until minLength) {
// 원래 있는 값과
var sum = answer[i]
//a와 b의 i번째 값을 더해줌
sum += a[i].digitToInt()
sum += b[i].digitToInt()
//10보다 크다면 다음위치에 1을 넣어주고 10을 뺴줌
if (sum >= 10) {
answer[i + 1] = 1
sum -= 10
}
answer[i] = sum
}
// 나머지 길이에 대하여 계산시작
for (i in minLength until maxLength) {
var sum = answer[i]
if (i < a.length) {
sum += a[i].digitToInt()
}
if (i < b.length) {
sum += b[i].digitToInt()
}
if (sum >= 10) {
answer[i + 1] = 1
sum -= 10
}
answer[i] = sum
}
val result = answer.reversed().joinToString("")
//처음이 0이면 제거해줌...
if (result[0] == '0') {
println(result.slice(1 until result.length))
} else {
println(result)
}
}
이상입니다.
모든 문제풀이는 GIt에서 확인하세용~~