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 ("둘다아님")
}
'[TIL][내일배움캠프]' 카테고리의 다른 글
[내일배움캠프][TIL] 23.12.06 (수) - 바탕화면 정리, 클래스 (1) | 2023.12.06 |
---|---|
[내일배움캠프][TIL] 23.12.05 (화) - 푸드 파이트 대회, 객체지향 프로그래밍 심화 (2) | 2023.12.05 |
[내일배움캠프][TIL] 23.12.01 (금) - 명예의 전당, 계산기 만들기 Lv3 완성본 (0) | 2023.12.01 |
[내일배움캠프][TIL] 23.11.30 (목) - 모의고사, Kotlin 문법 기초 과제 (계산기 만들기 Lv3) (1) | 2023.11.30 |
[내일배움캠프][TIL] 23.11.29 (수) - 과일 장수, Kotlin 문법 기초 과제 (계산기 만들기) (1) | 2023.11.29 |