문제 풀이

그리디 알고리즘 : 모험가 길드 [이코테 311P, Kotlin]

정자이노 2023. 1. 5. 18:09

문제 

한 마을에 모험가가 N명 있습니다. 모험가 길드에서는 N명의 모험가를 대상으로 '공포도'를 측정했는데,'공포도'가 높은 모험가는 쉽게 공포를 느껴 위험 상황에서 제대로 대처할 능력이 떨어집니다. 모험가 길드장인 동빈이는 모험가 그룹을 안전하게 구성하고자 공포도가 X인 모험가는 반드시 X명 이상으로구성한 모험가 그룹에 참여해야 여행을 떠날 수 있도록 규정했습니다. 동빈이는 최대 몇 개의 모험가 그룹을 만들 수 있는지 궁금합니다.

N명의 모험가에 대한 정보가 주어졌을 때, 여행을 떠날 수 있는 그룹 수의 최댓값을 구하는 프로그램을 작성하세요.

 

첫 번째 시도 

import java.io.BufferedReader
import java.io.InputStreamReader

fun main(){

    val br = BufferedReader(InputStreamReader(System.`in`))

    val num = br.readLine().toInt() // 총 인원
    val scaredList = mutableListOf<Int>()
    br.readLine().split(" ").forEach{
        scaredList.add(it.toInt())
    } // 공포도 받기
    scaredList.sort() // 오름차순 정렬

    var result = 0
    while(scaredList.isNotEmpty()){ // 인원이 존재할 때
        if(scaredList.size >= scaredList.last()){ // 현재 인원이 최대공포도보다 클 때
            result += 1 // 그룹 하나 추가
            repeat(scaredList.last()){
                scaredList.removeAt(scaredList.lastIndex) // 마지막 원소(최댓값) 삭제
            }
        }else{ // 총 인원보다 최댓값이 더 크다면
            print(result)
            return
        }
    }
    print(result)
}

책에 있는 테스트 케이스 

5

2 3 1 2 2 
는 통과 하였으나, 책에 없는 테스트 케이스  6 / 4 3 3 3 3 2 실패하였다. 

 

두번 째 시도 

import java.io.BufferedReader
import java.io.InputStreamReader

fun main(){

    val br = BufferedReader(InputStreamReader(System.`in`))

    val num = br.readLine().toInt() // 총 인원
    val scaredList = mutableListOf<Int>()
    br.readLine().split(" ").forEach{
        scaredList.add(it.toInt())
    } // 공포도 받기
    scaredList.sort() // 오름차순 정렬

    var result = 0
    while(scaredList.isNotEmpty()){ // 인원이 존재할 때
        if(scaredList.size >= scaredList.first()){ // 현재 인원이 최대공포도보다 클 때
            result += 1 // 그룹 하나 추가
            repeat(scaredList.first()){
                scaredList.removeAt(0) // 마지막 원소(최댓값) 삭제
            }
        }else{ // 총 인원보다 최댓값이 더 크다면
            print(result)
            return
        }
    }
    print(result)
}

 6 / 4 3 3 3 3 2 성공 

 

여행을 떠날 수 있는 그룹의 최댓값을 구하는 문제로, 모든 사람이 여행을 가는 경우를 생각하여 공포도가 가장 큰 사람을 기준으로 수행하였고 실패가 발생하였다. 공포도가 작은 사람을 기준으로 먼저 태우면 그룹의 최댓값이 도출된다! 

 

https://github.com/jeongjaino/Problem_solving/blob/master/src/main/kotlin/day1/Day1-1.kt

 

GitHub - jeongjaino/Problem_solving: 겨울방학 알고리즘 스터디!

겨울방학 알고리즘 스터디! . Contribute to jeongjaino/Problem_solving development by creating an account on GitHub.

github.com