본문 바로가기
♞ | 공부일지/♝ | TIL

[Kotlin, 내일배움캠프] 공부일지(2024-06-26)

by immgga 2024. 6. 26.
오늘 공부한 내용 정리(2024년 6월 26일)

 

 

코드카타 문제풀이

숫자 게임(Silver 5, 2303번, 마라톤)

문제 내용

 

문제 풀이 방법

N명의 사람들에게 5장의 카드가 주어질 때, 5장의 카드에서 3장의 카드를 뽑은 후, 뽑은 카드의 합에서 일의 자리가 가장 크게 되도록 카드를 선택해야 할 때, 각각의 사람들의 일의 자리 중 가장 큰 값을 뽑은 사람이 몇 번째 사람인지 출력.

일의 자리가 제일 큰 사람이 여러 명이면 번호가 가장 큰 사람의 번호를 출력한다(그냥 가장 나중에 입력받은 사람이 우선이라는 뜻이다).

 

 

해결 코드(스포 주의)

더보기
import java.io.BufferedReader
import java.io.InputStreamReader

fun main() = with(BufferedReader(InputStreamReader(System.`in`))) {
    val people = readLine().toInt()
    val maxList = mutableListOf<Int>()

    for (i in 0 until people) {
        val cards = readLine().split(" ").map { it.toInt() }
        var max = 0

        for (i0 in cards.indices) {
            for (i1 in i0 + 1 until cards.size) {
                for (i2 in i1 + 1 until cards.size) {
                    val cardSum = cards[i0] + cards[i1] + cards[i2]
                    val lastNum = cardSum.toString().last().digitToInt()
                    if (max < lastNum) max = lastNum
                }
            }
        }

        maxList.add(max)
    }

    println(maxList.indexOfLast { it == maxList.max() }+1)
}

 

풀이 과정

people의 수만큼 for문으로 반복한다.

각 사람의 일의 자리 최댓값을 저장할 maxList를 생성한다.

 

cards를 이용해 입력받은 5장의 카드를 리스트로 받는다.

max는 일의 자리의 최댓값을 저장하기 위함이다.

5개의 카드 중 3개를 뽑아야 하기 때문에 3중 for문을 써야 한다.

2번째 for문부터 시작점을 바로 바깥 for문의 데이터에서 +1을 해주어야 중복되지 않는다.

다중 반복문을 통해 총 10번을 돌려서 5개의 카드 중 3개를 중복 없이 뽑아서 만들 수 있는 카드의 경우의 수를 구할 수 있다.

뽑은 카드의 합(cardSum)을 계산하고, 일의 자리를 추출한다(lastNum).

추출한 일의 자리가 max보다 작으면 max를 lastNum으로 갱신한다.

 

삼중 반복문이 끝나면 최종 max를 maxList에 넣어준다.

 

마지막으로 모든 반복이 종료된 후에는 maxList의 maxList의 최댓값과 같은 가장 마지막 index를 불러와서 1을 더해준 값을 출력.

 

 

문제 해결 과정

경우의 수를 구할 수 있으면 쉽게 해결이 가능한 문제.

일의 자리의 최댓값이 같은 사람이 있을 때, 나중에 카드를 받은 사람이 우선인 것을 의식해서 코드를 짜야한다.

 

 

변형 체스 놀이: 다바바(Dabbaba)(Silver 4, 29721번, 마라톤)

문제 내용

 

문제 풀이 방법

체스의 특수 말인 다바바는 현재 위치에서 상하좌우로 2칸씩 이동할 수 있다. 이동 경로 사이에 말이 있어도 이동할 수 있지만 도착지에 말이 있으면 이동할 수 없을 때,

체스판의 크기 N과 다바바의 개수 K가 주어질 때, 각 다바바들이 이동할 수 있는 모든 칸의 개수를 출력.

 

 

해결 코드(스포 주의)

더보기
import java.io.BufferedReader
import java.io.InputStreamReader

fun main() = with(BufferedReader(InputStreamReader(System.`in`))) {
    val (map, case) = readLine().split(" ").map { it.toInt() }
    val pieces = hashSetOf<List<Int>>()
    val moveResultSet = hashSetOf<List<Int>>()

    val mx = listOf(-2, 2, 0, 0)
    val my = listOf(0, 0, -2, 2)
    for (i in 0 until case) {
        val piece = readLine().split(" ").map { it.toInt() }
        pieces.add(piece)

        val x = piece[0]
        val y = piece[1]
        for (j in mx.indices) {
            val nx = x + mx[j]
            val ny = y + my[j]

            if (nx in 1 .. map && ny in 1 .. map) {
                moveResultSet.add(listOf(nx, ny))
            }
        }
    }

    println(moveResultSet.subtract(pieces).size)
}

 

풀이 과정

체스판의 크기(map)와 다바바의 개수(case)를 생성한다.

입력받은 다바바의 위치들을 저장할 pieces, 이동 결과를 저장할 moveResultSet을 저장한다.

상하좌우를 2칸씩 움직이게 할 mx, my를 생성한다.

 

case번 반복한다.

piece는 입력받은 체스판에서의 다바바의 위치이다. pieces에 넣어준다.

입력받은 값의 x, y값을 추출해 x, y변수를 만든다.

mx번 반복하면서 mx, my를 이용해 상하좌우로 움직인 값들을 구한다(nx, ny).

nx, ny가 체스판을 벗어나지 않았다면 moveResultSet에 데이터를 넣어 준다.

 

반복이 종료되면, moveResult와 pieces의 차집합(각 set에서 중복되는 값을 제거함)을 구한 후 그 결과의 크기를 출력한다.

 

 

문제 해결 과정

입력받을 때, 다바바의 이동 경로를 정확히 구해서 이동 가능 여부를 판단하는 것이 중요하다.

또한 기존 다바바가 있던 위치와 이동한 또 다른 다바바의 위치가 동일한 경우 이동할 수 없다는 것 때문에 차집합을 이용해 주었다.

 

 

Android 수준별 학습반 - 스탠다드반

오리엔테이션

활동 내용 간단 정리

담임 강사를 소개하고 어떤 커리큘럼이 있는지 설명받았다.

안드로이드 스튜디오의 숨겨진 기능들의 사용법을 알려 주었다(layout inspector 등).

안드로이드 UI를 구현해 보면서 많이 쓸법한 속성들을 알려 주었다.

 

 

개인 공부

매개 변수 탐색과 이분 탐색

공부 내용 간단 정리

블로그 정리

https://rkdrkd-history.tistory.com/134

 

[알고리즘] 매개변수 탐색(Parametric Search)과 이분 탐색(Binary Search)

내가 작년에 바이너리 서치에 대해 올린 적이 있다.이번에 문제 풀이에서 바이너리 서치와 매개변수 탐색을 이용하는 문제를 풀고 다시 개념을 공부해보려 한다.  이분 탐색 복습(Binary Search)이

rkdrkd-history.tistory.com

 


 

 

오늘 공부 내용 정리 및 회고

백준 마라톤과 탐색 알고리즘을 공부했다. 마라톤 문제를 푸느라 알고리즘 공부가 늦어져 현재(19:43) 탐색 문제를 풀어보지는 못했다. 1문제 이상은 풀어봐야지. 공부했는데.

수준별 학습반의 스탠다드반 오리엔테이션을 들었다. 강사가 지루하지 않아서 재미있게 들었다. 나중에는 어떻게 될지는 모르겠지만.

 

 

728x90