티스토리 뷰

코트카타

 

직사각형 별찍기

 

문제

 

 

정답

fun main(args: Array<String>) {
    val (n, m) = readLine()!!.split(' ').map(String::toInt)
    for(i in 1..m){
        for(j in 1..n){
            print('*')
        }
        println()
    }
}

2중 for문을 활용해서 풀 수 있는 문제이다.

 

n(가로 길이)만큼 반복해서 별을 출력한 뒤 반복문이 끝나면

개행을 하는것을 m(세로 길이)만큼 반복하면 된다.

 

 

다른 풀이

fun main(args: Array<String>) {
    val (n, m) = readln().split(' ').map { it.toInt() }
    repeat(m) {
        repeat(n) {
            print('*')
        }
        println()
    }
}

readLine()!!은 readln()으로

map(String::toInt)는 map { it.toInt() }로 대체할 수 있다.

 

repeat(n)은 같은 동작을 n번 반복한다.

for문 대신 repeat함수를 써서 구현할 수도 있다.

 

 

 

최대공약수와 최대공배수

 

문제

 

 

정답

class Solution {
    fun solution(n: Int, m: Int): IntArray = intArrayOf(gcd(n, m), lcm(n, m))

    fun gcd(n: Int, m: Int): Int {
        var r = n % m
        if (r == 0) return m
        else return gcd(m, r)
    }

    fun lcm(n: Int, m: Int): Int = n * m / gcd(n, m)
}

코틀린에 따로 최대공약수 및 최소공배수를 구해주는 함수는 따로 없어서

두 함수는 Int형 값을 반환하도록 하고 solution 함수에서 반환하는 

배열의 요소를 두 함수의 반환값으로 지정하여 [최대공약수, 최대공배수]를 반환하도록 했다.

 

 

최대공약수 반환 함수

fun gcd(n: Int, m: Int): Int {
    var r = n % m
    if (r == 0) return m
    else return gcd(m, r)
}

gcd(Greatest Common Divisor)는 최대공약수를 뜻하는 말이다.

 

2 ~ n 의 범위를 반복문을 돌려 두 수 모두 나누어떨어지는 수를 구할 수도 있지만

시간 복잡도의 문제 때문에 유클리드 호제법을 이용해서 구하였다.

 

호제법이란 두 수가 서로 상대방 수를 나누어서 원하는 수를 얻는 알고리즘이다.

 

두 자연수 n, m에 대해서 n를 m로 나눈 나머지를 r이라 하면

n와 m의 최대공약수는 m와 r의 최대공약수와 같다.

 

r이 0이 될 때까지 재귀함수를 호출하게 되면

최종적으로 반환되는 m의 값은 최대공약수가 된다.

 

 

최소공배수 반환 함수

fun lcm(n: Int, m: Int): Int = n * m / gcd(n, m)

lcm( Least Common Multiple)은 최소공배수를 뜻하는 말이다.

 

최소공배수는 두 수를 곱한 값에 최대공약수를 나누는 것으로 구할 수 있다.

 

 

함수 간결하게 작성하기

// n의 제곱수를 반환하는 함수
fun solution(n: Int): Int = n * n

함수에서 실행되는 코드가 한 줄을 넘어가지 않는다면

중괄호({})와 return을 생략하고 등호(=)를 이용해 간략하게 한 줄로 쓸 수 있다.

 

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함