task가 주어질 때, 같은 레벨에 있는 task를 두 개에서 세 개씩 처리해 최소 수행 횟수를 구하는 문제다. 만일 두 개에서 세 개씩 처리가 불가능하면 -1을 반환한다.
수학 문제다
class Solution {
public int minimumRounds(int[] tasks) {
int answer = 0;
HashMap<Integer, Integer> map = new HashMap<>();
for(int i=0; i<tasks.length; i++){
if(map.containsKey(tasks[i])){
int tmp = map.get(tasks[i]) +1;
map.put(tasks[i], tmp);
//System.out.println(tmp);
}else{
map.put(tasks[i], 1);
}
}
for(int key : map.keySet()){
int value = map.get(key);
System.out.println("key value " + key + " " + value);
if(value < 2){
System.out.println("No");
return -1;
}
while(true){
if(value <= 1){
break;
}
if(value-3 != 1 && value >= 3){
value -=3;
answer++;
}else{
value -= 2;
answer++;
}
}
if(value != 0){
System.out.println("No");
return -1;
}
}
return answer;
}
}
나는 빼기로 풀었지만 나누기로 한 번에 풀 수도 있다. 해당 값이 1이라면 -1을 반환하고 3으로 나눠 떨어지면 3으로 나눈 몫을 answer에 더한다. 나눠 떨어지지 않으면 몫에다가 1을 더하고 그 값을 answer에 더한다.
class Solution {
public int minimumRounds(int[] tasks) {
int answer = 0;
HashMap<Integer, Integer> map = new HashMap<>();
for(int i=0; i<tasks.length; i++){
if(map.containsKey(tasks[i])){
int tmp = map.get(tasks[i]) +1;
map.put(tasks[i], tmp);
}else{
map.put(tasks[i], 1);
}
}
for(int key : map.keySet()){
int value = map.get(key);
if(value == 1){
return -1;
}
if(value % 3 == 0){
answer += (value/3);
}else{
answer += value/3 + 1;
}
}
return answer;
}
}
https://leetcode.com/problems/minimum-rounds-to-complete-all-tasks/description/