프로그래머스[programmers] - 귤 고르기(Kotlin)[LV2]

2024. 3. 12. 22:17· CodingTest/Programmers
목차
  1. 문제
  2. 문제 풀이
  3. 전체 코드

문제

https://school.programmers.co.kr/learn/courses/30/lessons/138476

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제 풀이

주어진 배열에서 최소한의 크기의 종류로 배열을 구성하는 문제이다.

그러기 위해서 크기별 개수를 기록할 필요가 있다.

 

크기별 개수 기록

fun makeSubTotal(tangerine : IntArray){
tangerine.forEachIndexed{ index, _ ->
fruits[tangerine[index]]++
}
}

나는 귤의 크기를 index로 가지는 배열을 만들어서 귤의 크기별 개수를 기록했다.

 

다음으론 귤의 크기별 개수가 많은 순서대로, 즉 크기별 내림차순으로 정렬을 했다.

크기 별 내림차순 정렬

private val q = PriorityQueue<Pair<Int,Int>>(compareBy{-it.first})
fun sortFruitBySum(){
fruits.forEachIndexed{ index, sum->
if(sum!=0){
q.add(Pair(sum,index))
}
}
}

크기 별 내림차순으로 정렬되는 우선순위큐에 기록한 귤의 크기와 개수를 넣어줬다.

지금 와서 생각해 보니 새로운 큐를 생성하는 것보단 기존 fruits 배열을 정렬하는 코드가 더 괜찮았을 것 같다.

 

다음으론 이제 박스에 담을 일만 남았다.

당연하게도 담을 수 있는 양만큼 최대한으로 귤을 담아줘야 한다.

여기서 담는 귤은 개수가 가장 많은 종류에 해당될 것이다.

예를 들어서 크기가 1인 귤이 5개, 크기가 2인 귤이 4개, 크기가 3인 귤은 3개라고 가정할 때,

해당 과정에선 1을 먼저 담고, 다음은 2, 다음은 3처럼 개수가 많은 귤부터 담는다.

최대한 많은 개수의 귤을 처리해야 뽑을 수 있는 귤의 개수가 줄고 이는 곧 담을 귤의 종류가 적어지기 때문이다.

귤 담기

while(!q.isEmpty()){
val now = q.poll()
if(remain <= 0){
break
}
remain -= now.first
answer++
}

 

귤을 담고, 뽑을 수 있는 개수에서 뺀 뒤 answer(종류)를 +1 한다.

만약 잔여개수가 0 이하라면 더 이상 뽑지 못하므로 종료한다.

 

전체 코드

/*
크기 별로 분류했을 때 서로 다른 종류의 수를 최소화하고싶다.
여기서 귤을 k개 골라 상자에 담는다.
고로 k개를 어떻게 담을건지가 중요한 문제
k개를 담아서 상자에는 서로 다른 종류의 수를 적게하는것이 목표
*/
import java.util.*
class Solution {
private lateinit var fruits : IntArray
private val q = PriorityQueue<Pair<Int,Int>>(compareBy{-it.first})
fun solution(k: Int, tangerine: IntArray): Int {
fruits = IntArray(10000001)
makeSubTotal(tangerine)
sortFruitBySum()
var remain = k
var answer = 0
while(!q.isEmpty()){
val now = q.poll()
if(remain <= 0){
break
}
remain -= now.first
answer++
}
return answer
}
fun makeSubTotal(tangerine : IntArray){
tangerine.forEachIndexed{ index, _ ->
fruits[tangerine[index]]++
}
}
fun sortFruitBySum(){
fruits.forEachIndexed{ index, sum->
if(sum!=0){
q.add(Pair(sum,index))
}
}
}
}
저작자표시 (새창열림)

'CodingTest > Programmers' 카테고리의 다른 글

프로그래머스[programmers] - 가장 많이 받은 선물(Kotlin)[LV1]  (0) 2024.03.19
프로그래머스[programmers] - 도넛과 막대 그래프(Kotlin)[LV2]  (0) 2024.03.19
프로그래머스[programmers] - 연속된 부분 수열의 합(Kotlin)[LV2]  (1) 2024.03.11
프로그래머스[programmers] - 두 원 사이의 정수 쌍(Kotlin)[LV2]  (0) 2024.03.11
프로그래머스[programmers] - 여행경로(Kotlin)[LV3]  (0) 2024.03.08
  1. 문제
  2. 문제 풀이
  3. 전체 코드
'CodingTest/Programmers' 카테고리의 다른 글
  • 프로그래머스[programmers] - 가장 많이 받은 선물(Kotlin)[LV1]
  • 프로그래머스[programmers] - 도넛과 막대 그래프(Kotlin)[LV2]
  • 프로그래머스[programmers] - 연속된 부분 수열의 합(Kotlin)[LV2]
  • 프로그래머스[programmers] - 두 원 사이의 정수 쌍(Kotlin)[LV2]
재한
재한
안녕하세요 💻
재한
짜이한
전체
오늘
어제
  • 분류 전체보기 (504)
    • Skils (118)
      • Android (52)
      • C++ (5)
      • Kotlin (36)
      • Algorithm (24)
      • Server (1)
    • CodingTest (228)
      • Programmers (45)
      • Baekjoon (183)
    • Experience (8)
      • 후기(코딩테스트,프로그램,프로젝트) (8)
    • Computer Science (70)
      • Design Pattern (2)
      • OOP (2)
      • Computer Architecture (14)
      • OS (2)
      • Software Engineering (3)
      • DataBase (8)
      • Network (39)
    • 학교 (75)
      • R프로그래밍 (26)
      • 회계와 사회생활 (17)
      • 컴퓨터학개론 (20)
      • it기술경영개론 (12)

블로그 메뉴

  • 홈
  • 태그
  • 카테고리
  • 글쓰기
  • 설정

인기 글

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
재한
프로그래머스[programmers] - 귤 고르기(Kotlin)[LV2]
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.