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

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

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

 

 

코드카타 문제풀이

회의실 배정(Silver 1, 1931번)

문제 내용

 

문제 풀이 방법

회의의 개수 n과 n번의 회의 시작 시간과 끝 시간이 순서대로 주어질 때, 위의 시간을 최대한 활용해 사용할 수 있는 회의의 최대 개수를 출력한다.

회의의 진행시간이 적은 순으로 정렬하면 편하다.

 

해결 코드(스포 주의)

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

fun main() = with(BufferedReader(InputStreamReader(System.`in`))) {
    val meetingArray = Array<List<Int>>(readLine().toInt()) { emptyList() }

    for (i in meetingArray.indices) {
        meetingArray[i] = readLine().split(" ").map { it.toInt() }
    }

    meetingArray.sortBy { it[0] }
    meetingArray.sortBy { it[1] }

    var meetingStartTime = 0
    var meetingCnt = 0
    for (i in meetingArray.indices) {
        if (meetingStartTime <= meetingArray[i][0]) {
            meetingStartTime = meetingArray[i][1]
            meetingCnt++
        }
    }

    println(meetingCnt)
}

 

풀이 과정

meetingArray를 만들어서 회의 정보를 이 배열에 담는다.

meetingArray를 회의 시작 순으로 정렬을 하고, 회의 시작 후로 다시 정렬한다.

시작 시간을 저장할 변수를 만들고(meetingStartTime), meetingStartTime이 meetingArray에 저장된 시작 시간보다 이른 시간이면(작거나 같음) meetingStartTime으로 조건을 처음 만족한 array 데이터의 종료 시간으로 값을 변경하고, meetingCnt(회의 횟수)를 1씩 늘린다.

[1, 4], [3, 5], [5, 7], [3, 8] 순으로 값이 들어오면 처음 값인 1, 4에서 0(meetingStartTime 초기값)이 1보다 작기 때문에 meetingStartTime을 종료 시간인 4로 변경하면 다음 데이터인 [3, 5]는 조건 미충족으로 넘어가고 다음 값을 비교하기 때문에 meetingStartTime은 0 -> 4 -> 7 순서로 변하게 된다.

 

문제 해결 과정

값 정렬을 어떻게 하느냐에 따라 쉽게 풀릴 수도 있고 아닐 수도 있는 문제이다.

대체로 많은 사람들이 회의 진행 시간순으로 정렬을 한다고 하던데 잘못된 접근 방법이다.

문제 카테고리는 그리디 알고리즘인데 정렬의 비중이 많이 큰 문제였다.

 

방 번호(Silver 5, 1475번)

문제 내용

 

문제 풀이 방법

방의 번호 N이 주어질 때, 1부터 9까지 1개씩 존재하는 플라스틱 숫자 세트를 이용해 방 번호를 만들려면 필요한 숫자 세트의 최솟값을 출력.

 

 

해결 코드(스포 주의)

더보기
import java.util.*
import kotlin.math.ceil

fun main() = with(Scanner(System.`in`)) {
    val roomNumber = next().map { it.digitToInt() }.toMutableList()
    val usePlasticNumCnt = Array(10) { 0 }

    for (i in roomNumber) {
        // 9인 경우 6으로 통합시키기.
        if (i == 9) usePlasticNumCnt[6]++
        else usePlasticNumCnt[i]++
    }

    // 6과 9는 한 세트이기 때문에 2로 나눈 값을 올림(데이터가 3인 경우에는 세트가 2개가 필요하기 때문).
    usePlasticNumCnt[6] = ceil(usePlasticNumCnt[6] / 2.0).toInt()
    println(usePlasticNumCnt.max())
}

 

풀이 과정

방 번호의 수를 하나씩 보기 위해 roomNumber를 생성해 준다.

숫자가 총 몇 개가 있는지 확인하기 위해 usePlasticNumCnt를 생성한다.

usePlasticNumCnt에서 roomNumber의 숫자 데이터에 해당하는 index에 값을 1 더해준다.

숫자 데이터가 9인 경우에는 6에 통합시켜 증가시킨다 index 6의 데이터에는 6과 9의 개수가 들어있는 셈이다.

반복을 종료하고 index 6에 해당하는 값에 2를 나누고 나눈 값을 올림 한다.

결괏값 usePlasticNumCnt에서 가장 큰 값을 출력한다.

 

 

문제 해결 과정

구현 문제라 문제를 어떻게 해결해야 할지 갈피를 잡지 못하면 Silver 5문제 치고는 많이 어려울 것이다.

내가 그랬으니까..

 

 

스파르타 코딩 클럽 강의 수강

키오스크 해설 강의 수강

강의 내용 간단 정리

키오스크 Lv.5까지 구현하는 강의를 듣고 따라 쳐보았다.

따라 치면서 내 코드와 다른 점은

내 코드에서 장바구니와 남은 잔액은 companion object로 생성했지만, 강의 코드는 전역으로 선언했다는 점.
상속 관계는 비슷했지만, 나는 메뉴 종류별로 자식 클래스를 하나씩 만들어 주었지만, 강의 코드는 하나로 관리했다는 점.
또한 강의에서 카테고리를 String으로 사용하던데 내 코드는 enum class를 사용했다는  점도 있다.

 

어떤 코드가 더 나은 코드인지는 비교와 검색을 해봐야겠다.

 


 

오늘 공부 내용 정리 및 회고

오늘은 알고리즘 문제에 시간을 많이 뺏겨서 키오스크 해설 강의까지밖에 듣지 못했다.

내일부터는 새로운 팀원들과 Android 개발 기초를 배운다. 본격적으로 Android의 기초를 공부한다.

정리하는 것을 좀 더 신경 써서 정리해야겠다.

내일 시간적 여유가 있다면 그리디 알고리즘 공부를 시작해 봐야겠다.

728x90