TIL/kotlin 알고리즘

kotlin 프로그래머스 lv2 귤 고르기

crablo 2024. 3. 5. 12:17
728x90

해당문제에서 tangerine배열을 예시로 문제를 설명해줬다.

tangerine배열이 [1, 3, 2, 5, 4, 5, 2, 3]  이렇게 주어질때,

최대한 서로다른 종류를 유지하면서 k값에해당하는 귤의 갯수로 담으면 된다.

그 후 서로 다른종류가 몇가지가 있는지 return하면된다.

 

1. 의도 및 이유

이 코드의 목적은 주어진 배열 tangerine에서 각 요소의 등장 횟수를 계산하고, 등장 횟수가 높은 순서로 누적합이 특정 값 k를 초과하지 않는 최소 개수의 요소를 선택하는 것이다. 이는 주어진 문제에 대한 최적화된 해결 방식을 찾기위해서이다.

2. 코드 동작 로직
  1. 배열 tangerine을 순회하면서 각 요소의 등장 횟수를 tangerineMap 해시맵에 기록.
  2. 등장 횟수를 기반으로 내림차순으로 정렬한 후, 정렬된 값들을 순회하면서 누적합과 개수를 계산.
  3. 누적합이 k를 초과하지 않는 최소 개수의 요소를 선택.


3. 버그 또는 에러 및 해결
  1. 처음 takeWhile을이용해서 시간초과 에러가났고 그대신 for루프를 사용하여 누적합과 조건을 관리하도록 수정함


 

1. 해시맵 생성 및 초기화:

val tangerineMap = hashMapOf<Int,Int>()

배열 tangerine의 각 요소의 등장 횟수를 저장하기 위한 해시맵을 생성했다.

 

 

2. 배열 순회 및 등장 횟수 계산:

tangerine.forEach{ // [1, 3, 2, 5, 4, 5, 2, 3]

t->

tangerineMap[t] = (tangerineMap[t] ?:0) + 1         //tangerineMap =  {1=1, 2=2, 3=2, 4=1, 5=2}

}

배열 tangerine을 순회하면서 각 요소의 등장 횟수를 tangerineMap에 기록한다.

만약 해동 요소가 이미 등장한 적이 있다면, 기존 횟수에 1을 더하고, 처음 등장한 요소라면 1로 초기화한다.

 

3. 등장 횟수에 따라 내림차순 정렬:

val sortedValues = tangerineMap.values.sortedDescending()  //[2, 2, 2, 1, 1]

tangerineMap의 값들을 등장 횟수를 기준으로 내림차순 정렬함

 

4. 누적합 및 결과 계산:

var sum = 0
for (value in sortedValues) {
    sum += value
    answer++
    if (sum >= k) {
        break
    }
}

정렬된 등장 횟수를 순회하면서 누적합을 계산하고, 그때마다 answer을 1씩 증가시킨다.

만약 누적합이 주어진 값 k를 초과하면 루프를 종료한다.

 

  • keep: 문제풀기전 해결방법 정리 후 문제풀기, 알고리즘적 사고로 생각 정리하기
  • problem: 생각이 복잡하고 조급해함, gpt를 사용하지 않더라도 개념이 부족하여 검색 및 문제를 참조해서 푸는 경향이 있음.-> 나만의 생각이 없어진다는 느낌
  • try: 아직도 생각하는 시간이 너무 오래걸리고, 알고리즘을 집중적으로 공부한적이 없어서 부트캠프기간 마치기전 시기에는 30분내로 풀수있게끔 실력다지기
728x90