8.일반 수학 1단계

WonDDak·2023년 4월 11일
0

BAEKJOON

목록 보기
8/10

어느덧 8단계네용~

재미있는 수학 시간입니다.


2745 진법 변환

진법 문제는 많이 나오는 편이죠
진법의 개념을 잘 알고 계시면 쉽게 풀 수 있습니다.

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

11005 진법 변환2

역으로 변환하는 겁니다.
항상 말씀드리지만 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(""))

}

2720 세탁소 사장 동혁

항상 갯수를 구할때는 큰수부터 몫을 구해줄것

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(" "))
    }
}

2903 중앙 이동 알고리즘

살짝 어려울 수도있는데 잘생각 해보시면 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])
}

2292 벌집

둘러싸는 라인이 바뀌는 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
    }
}

1193 분수찾기

점점 머리가 아파지는 수학~

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))

}

2869 달팽이는 올라가고싶다

무작정 반복문으로 풀면 시간초과가 납니다!

하루에 올라가는 양을 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)
    }

}

10757 큰 수 A+B

파이썬이였다면 그냥 더하면되지만..
애는 범위가 작아서 직접 구현을 해야합니다.

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에서 확인하세용~~

profile
안녕하세요. 원딱입니다.

0개의 댓글