본문 바로가기

내일배움캠프

본 캠프 24일차

오늘은 베이직반 과제를 좀 계속 풀어보았다. 총 45문제인데 알고리즘 문제도 손을 못대는 중이라 걱정이 좀 앞선다.

fun main() {

}

좀 늦게 시작해서 다른사람들이 먼저 어떤식으로 풀었나 보았는데...다들 저 칸 안에서만 푸는듯 하다.

이번에 문제 낼 때도 클래스를 따로 빼서 문제를 풀고 main에는 그냥 출력만 되게끔 해서 풀고 있었는데 일단 따로 뺴서 하는거도 좀 애매하다보니 이쪽으로 바꿔서 해봐야겠다.

//1번문제
fun main() {
    var sol = Solution().solution()
    println("${sol}")
}

class Solution {
    fun solution(n: Int): Int {
        var answer = 0
        for (a in 1..n) {
            if (n % a == 0) {
                answer += a
            }
        }
        return answer
    }
}

이런식이었는데...일단 메인에서만 푸는거로 가보도록했다.

1. 1~100까지 정수 중 홀수의 합을 출력하시오. [입력 :x , 출력 : 2500]

fun main() {
    var retrun = 0

    for(i in 1..100) {
        if (i % 2 != 0) {
            retrun += i
        }
    }
    println("1~100까지 정수 중 홀수 합은 $retrun 입니다.")
}

우선 변수를 선언해서 0을 넣어주고 1~100까지 정수 중 홀수 이므로 나누어서 나머지가 0이 아닌 수 들을 더했다.

 

2. 입력받은 문자열을 뒤집어서 출력해 주세요. [입력 : abcde, 출력 : edcba] 띄어쓰기 없고 영문 소문자만

fun main() {
    while (true) {
        var str = readLine()!!.toString()
        var strM = str.toMutableList()

        for (i in strM.indices) {
            if (!strM[i].isUpperCase() && !str.trim().isEmpty()) {
                println("${str.reversed()}")
                break
            } else {
                println("다시 입력하시오")
                break

            }
        }

    }
}

한참 붙들고 있다가...구글의 도움을 받기로 했다. 우선 문자열을 뒤집는건 reversed() 를 쓰면 된다고 한다. 그래서 원래는

fun main() {
        var str = readLine()!!.toString()
                println("${str.reversed()}")
 }

원래 이렇게만 했었는데 조건을 넣으려고 하니 좀 애매해 졌다. 일단 띄워쓰기를 방지하기 위해 뭘 써야 하나 찾아보는데 도저히 못찾고 어제 들었던 trim()과 isEmpty()를 같이 집어넣었다. 그리고 소문자인지 대문자인지 판별하기 위해 isLowerCase나 isUpperCase를 쓰려고 했는데 그냥 쓰려고 했더니 넣어지지 않아서 찾아보니 list로 만들어서 몇번째 인덱스가 대문자인지 소문자인지 판별하는 용도로 쓰이는거 같다. 그래서 그걸 기준으로 다시 짜서 만들었다.

 

3. 입력받은 정수의 홀짝을 구분하는 코드를 작성해 주시오.(0제외) [ 입력 : 0, 출력 : 다시 입력해 주세요.] , [입력 : 5, 출력 : 홀수]

fun main() {
    while (true) {
        var num1 = readLine()!!.toInt()
        when {
            num1 == 0 -> {
                println("다시 입력하시오")
            }
            num1 % 2 == 0 -> {
                println("짝수")
                break
            }
            else -> {
                println("홀수")
                break
            }
        }
    }
}

원래 when 뒤 () 괄호안에 num1을 넣고 하려고 했는데...나머지 계산을 어찌 해야할지 몰라서 생략하고 안에다가 num1을 넣으니 제대로 돌아가긴 한다...

0만 제외하고라서 일단 0일때는 다시 입력하시오가 계속 뜨게 만들기 위해 while를 그 위에 선언하고 시작했다.

그리고 2로 나누어 떨어지는게 0일 때 짝수 출력후 탈출하고 아닐경우는 홀수 출력 후 탈출하게 해두었다.

 

4. 1~1000까지 정수 중 3의배수 또는 8의 배수에 속하는 값을 추출하고, 총합을 구하시오.(24의 배수는 제외?) [출력 : 3,6,8,9,12,15,16,18,21,27...1000 / 188505]

fun main() {
    var answer: Int = 0
    for (i in 1..1000) {
        if (i % 3 == 0 || i % 8 == 0) {
            if ((i % 24 != 0)) {
                println("$i")
                answer += i
            }
        }
    }
    println("$answer")
}

일단 예전에 프로그래머스에서 비슷한거 본거 같아서 일단 그쪽을 찾아 보았다. answer에 일단 0을 넣고 1~1000 안에 있는 숫자를 구하고 더해야하므로 for문을 이용하였다. 우선 3의배수와 8의 배수 둘 중 하나면 되는 거기에 or을 나타내는 ||을 사용 하였고 추가적으로 이것이 아니다 라는 것을 나타내려고 했는데 자꾸 오류가 떠서 안에 따로 더 if를 만들어서 24의 배수가 아닌 경우까지 집어넣고 이 i를 추출하기 위해 println으로 i를 나타내었다. 추가적으로 총합도 나타내어야 하기에 answer에 +=i 로 0부터 i를 계속 더하는 식을 만들었다. 그뒤 나중에 println으로 answer 즉 총합값을 출력하게 하였다.

 

5.  성적에 따라 반을 결정하고자 한다. 0~24점은 E반, 25~49점은 D반, 50~75점은 C반, 75~99점은 B반 100점은 A반이 출력되도록 하시오. [입력 : 87, 출력 : B반]

fun main() {
    var grade = readLine()!!.toInt()

    when (grade) {
        100 -> {
            println("A반")
        }

        in 75..99 -> {
            println("B반")
        }

        in 50..74 -> {
            println("C반")
        }

        in 25..49 -> {
            println("D반")
        }

        in 0..24 -> {
            println("E반")
        }

        else -> {
            println("올바른 성적이 아닙니다.")
        }
    }
}

이건 내가 낸 문제랑 비슷해서 금방 답이 나왔다.

최대한 기한 내에 많은 문제를 풀어봐야겠다.