본문 바로가기

[TIL][내일배움캠프]

[내일배움캠프][TIL] 23.12.04 (월) - 로또의 최고순위와 최저순위, 조건문·반복문 예제

1. 코드카타

 

오늘 푼 알고리즘 문제는 '로또의 최고순위와 최저순위'이다.

 

 로또의 최고순위와 최저순위
로또 번호를 담은 배열 lottos, 당첨 번호를 담은 배열 win_nums가 매개변수로 주어질 때, 당첨 가능한 최고 순위와 최저 순위를 차례대로 배열에 담아서 return 하도록 solution 함수를 완성하기 (단, lottos에 있는 0은 알 수 없는 번호)

 

문제가 너무 길어서 적지 않았지만, 로또 등수를 정하는 기준은 기존의 로또 등수와 같다.

  • 6개 다 맞추면 1등
  • 5개 맞추면 2등
  • 4개 맞추면 3등
  • 3개 맞추면 4등
  • 2개 맞추면 5등
  • 그 밑으로는 6등

그렇다면 이제 로또 등수의 범위를 구하는 코드를 한 번 만들어보자.

 

로또 등수는 0의 개수에 따라서 변동이 생긴다.

예를 들어 6개의 숫자 중에 0이 4개이고 나머지 2개는 로또 당첨번호와 일치할 때, 경우의 수는 다음과 같다.

  • 0이 전부 당첨번호와 일치할 때 -> 6개가 일치하므로 1등
  • 0이 전부 당첨번호와 불일치할 때 -> 2개만 일치하므로 5등

따라서 최고 순위와 최저 순위를 계산한다면 0을 전부 포함시킬 때와, 0을 전부 제외시킬 때 이 두 가지만 계산하면 된다.

 

이것을 코드로 나타내면 다음과 같다.

 

class Solution {
    fun solution(lottos: IntArray, win_nums: IntArray): IntArray {
        var answer: IntArray = intArrayOf()
        var cnt: Int = 0
        var zeroCnt: Int = 0
        
        for (i in lottos) {
            if (i in win_nums) cnt++
        }
        
        for (j in lottos.indices) {
            if (lottos[j] == 0) zeroCnt++
        }
        
        answer += when(cnt+zeroCnt){
            6 -> 1
            5 -> 2
            4 -> 3
            3 -> 4
            2 -> 5
            else -> 6
                }
        
        answer += when(cnt){
            6 -> 1
            5 -> 2
            4 -> 3
            3 -> 4
            2 -> 5
            else -> 6
        }
        
        return answer
    }
}

여기서 맨 처음 for문은 lottos 배열과 win_nums 배열에 일치하는 수의 개수를 찾는 것이다.

그리고 0의 개수도 찾은 다음, 일치하는 수+0의 개수 구문과 일치하는 수 구문 따로따로 계산해서 answer에 각각 저장한다.

 

 

2. 조건문·반복문 예제

 

저번 주에 알고리즘 강의를 들었을 때, 코딩에 익숙해지려면 여러가지 문제를 풀면서 익숙해지는 것이 좋다고 하셨다.

 

그리하여 이번에는 이것들을 한 번 풀어볼 예정이다.

 

원래는 저번 주에 냈으니 저번 주에 풀어보는 것이 맞는데 강사님도 시간에 구애받지 말라고 하셨거니와 계산기가 의외로 시간을 많이 잡아먹어서 이번 주에 한 번 풀어보기로 했다.

 

구성은 기본적으로 문제, 코드 형식으로 적었으며, 해설이 필요한 경우 밑에 사족을 달았다.

 

참고로 밑에 적는 코드에는 fun main()은 뺐다. 어차피 필수로 들어가야 하는 사항이라 있다고 가정하고 생략하기로 했다.

 

 

[1] 사용자에게 정수를 입력받아, 홀짝 구분하기 예) 입력: 10, 출력: 짝수입니다. (단, 0, null은 예외처리)

num = readLine()!!.toInt()

if (num == 0) println ("0입니다.")

if (num % 2 == 0) {
	println ("짝수입니다.")
	}
else {
	println("홀수입니다.")
	}

짝수를 구하는 방법은 워낙 잘 알려져있으니 넘어가고, 0은 예외처리를 하라고 했기에 저런 식으로 구현시켰다.

(null은 readLine() 옆에 !!를 붙여서 null값을 받지 못하게 처리했다.)

 

[2] 정수를 5개 입력받아 합계 구하기 (예시: 정수 5개 입력 1,2,3,4,5 -> 더한 값 15)

val numbers = readLine()!!.split(" ").map { it.toInt() }.toTypedArray()
var sum: Int = 0

for (number in numbers) {
	sum += number
    }
    
return sum

이번 문제에서 중요한 것은 바로 numbers를 정의하는 건데

val numbers = readLine()!!.split(" ").map { it.toInt() }.toTypedArray()

이렇게 하면 입력할 때 예를 들어 "1 3 5 7 9" 라고 입력하면 알아서 배열로 만들어준다.

 

[3] 문자열에서 특정 알파벳 ‘a’의 개수를 세주세요. 입력 예) apple / 출력 예) 1

val word = readLine()!!.split(" ").map { it.toString() }.toTypedArray()
var cnt:Int = 0

for (i in 0 until word.size) {
	if (word[i] == "a") cnt++
    }
    
println ("a의 숫자: $cnt ")

2번의 문자열 버전이다.

 

[4] 정수 5개에서 가장 작은 값을 찾아주세요. 입력 예) 1,2,3,4,5 출력 예) 1

val numbers = readLine()!!.split(" ").map { it.toInt() }.toTypedArray()

println ("최소값 : ${numbers.min()}")

 

[5] 1-100의 숫자 중에 2개를 뽑아 더하거나, 곱하거나, 나눠서 25가 나오는 경우의 수와 몇 번인지 구하기 출력 예) (1,24), (2,23), (5,5),,,, 총 30개.

val arr = intArrayOf(100)
var cnt:Int = 0
    
for (i in 1..100){
	for (j in 1..100){
		if (arr[i]+arr[j] == 25) cnt++
		else if (arr[i]*arr[j] == 25) cnt++
		else if (arr[i]/arr[j] == 25) cnt++
		}
	}
    
println("$cnt")

위의 예에서 알 수 있듯이 '서로 같은' 숫자도 뽑을 수 있기 때문에 j의 반복도 겹치게 해두었다.

다만, 이런 식으로 하면 작업량이 꽤나 많을 것 같은데 어떤 식으로 간소화시킬지는 조금 더 생각해봐야겠다.

 

[6] 월을 입력받아 해당 월이 어떤 계절에 속하는지를 판별하기(계절의 기준은 3월~5월까지 봄입니다., 6~8월:여름.. 입력: 4, 출력:봄입니다.)

var month = readLine()!!.toInt

when(month){
	in 3..5 -> println ("봄입니다.")
	in 6..8 -> println ("여름입니다.")
	in 9..11 -> println ("가을입니다.")
	1, 2, 12 -> println ("겨울입니다.")
	else -> println ("잘못된 정보입니다.")
    }

1에서 12까지만 숫자를 받도록 범위를 조절할 수 있으면 좋겠지만 readLine()으로 그렇게 하는 방법을 알지 못해서 when 절에서 그 외의 값을 처리하는 것으로 문제를 풀었다.

 

[7] 날짜를 입력하여 해당 요일이 주말인지 평일인지를 판별하기 (달의 기준은 30일이며 1일은 월요일입니다.) 입력 2일, 출력:평일

var date = readLine()!!.toInt()

if(date >= 31) println ("잘못된 입력입니다.")

else{
when(date%7){
	6, 0 -> println ("주말")
	else -> println ("평일")
    }
}

이것 역시 date의 범위를 1부터 30까지 잡는 게 좋은데 date 자체에서 범위를 어떻게 짜야할지 몰라서 if 조건문을 추가했다.

 

[8] 1부터 입력한 값을 모두 더하는 코드 만들기 (ex : 입력한 값이 5 라면 15가 출력됩니다.)

var num = readLine()!!.toInt()
var sum: Int = 0

for (i in 1..num) {
	sum += i
    }
    
println ("$sum")

 

[9] down to 를 활용하여 20이하 짝수 출력하기 (출력예: 20,18,16……..)

for (i in 20 downTo 0 step 2) {
	println("$i")
    }

 

[10] 1부터 100까지의 숫자 중에서 사용자의 숫자를 입력받아 그 숫자가 2의 배수인지 3의배수인지 아무 배수도 아닌지(2, 3배수가 아닌) 찾는 코드 (출력: 2의배수, 3의배수, 둘다배수, 둘다아님)

var num = readLine()!!.toInt()

if (num%2 == 0) {
	println ("2의배수")
    }
else if (num%3 == 0) {
	println ("3의배수")
    }
else if (num%2 == 0 && num%3 ==0) {
	println ("둘다배수")
    }
else {
	println ("둘다아님")
    }