[프로그래머스] 30 : 의상 | 기능개발

서예진·2024년 2월 26일
0

목차

▸ 의상
▸ 기능개발


✅ 의상 : Lv.2

▼ 문제

출처: 프로그래머스 코딩테스트 연습 > 해시 > 의상

▼ 내 풀이

  • HashMap을 활용하여 각 key에는 옷의 종류, value에는 옷의 수를 추가한다.
  • 의상 조합을 생각할 때 안입는 경우도 생각해야한다. 그러나 모든 종류를 안입은 경우는 의상 조합에서 제외해야한다.
  • 예를 들어, 얼굴 종류의 의상 수 2, 상의 종류의 의상 수 1인 경우, 의상 조합의 수는 얼굴 종류의 의상 수는 3(2+안입은 경우), 상의 종류의 의상 수는 2(1+안입은 경우)이다. 그러므로 총 의상 조합의 수는 3*2-1(모두 안입은 경우는 제외) = 5 이다.
  • 이 로직을 코드로 만들면 다음과 같다.
import java.util.*;

class Solution {
    public int solution(String[][] clothes) {
        int answer = 1;
        
        //종류별 의상 HashMap에 저장
        Map<String, Integer> clothesMap = new HashMap<>();
        
        for(int i = 0; i < clothes.length; i++){
            String clothingType = clothes[i][1];
            clothesMap.put(clothingType, clothesMap.getOrDefault(clothingType, 0) + 1);
        }
        
        //의상 조합하기 
         for(String s : clothesMap.keySet()) {
            answer *= (clothesMap.get(s) + 1);   
        }
        
        //모두 안입은 경우를 제외해야한다. 
        answer -= 1;  
        
        
        return answer;
    }
}

✅ 기능개발 : Lv.2

▼ 문제

출처: 프로그래머스 코딩테스트 연습 > 스택/큐 > 기능개발

▼ 내 풀이

  • progresses 배열대로 작업기간을 queue에 저장한다.
  • 우선, queue의 첫번째 요소를 내보내고 그 요소의 수보다 작은 것들만 내보낸다. 내보낼때는 내보낸 요소의 수를 알 수 있게 +1한다.
  • 또한, 정답 리스트에 그 내보낸 요소의 수를 저장한다.
import java.util.*;

class Solution {
    public List<Integer> solution(int[] progresses, int[] speeds) {
        
        Queue<Integer> q = new LinkedList<>();
        List<Integer> list = new ArrayList<>();
        
        for(int i = 0; i < progresses.length; i++){
            
            q.offer((int)Math.ceil((100-progresses[i])/(double)speeds[i]));
        }
        
        while(!q.isEmpty()){
            int temp = 0;
            int number = q.poll();
            temp++;
            while(!q.isEmpty() && number >= q.peek()){
                q.poll();
                temp++;
            }
            list.add(temp);
        }
        return list;
    }
}

▼ 알게된 점

- remove() vs poll()

  • q.remove(); : queue에서 가장 앞에 있는 요소를 제거하고 그 요소를 반환한다. 만약 queue가 비어있는 경우 'NoSuchElementException'이 발생한다.
  • q.poll(); : remove()와 비슷하지만, queue가 비어있을 경우 null을 반환한다.
  • 따라서, poll()을 사용하면 null인지 확인하는 작업을 통해 예외를 방지할 수 있다.

- add() vs offer()

  • q.add(); : queue에 요소를 추가한다. 만약 요소를 추가할 공간이 없는 경우 'IllegalStateException'을 발생시킨다.
  • q.offer(); : queue에 요소를 추가한다. 만약 요소를 추가할 공간이 없는 경우 요소를 추가하지 않고 false를 반환한다. 즉, 실패하는 경우에도 예외가 발생하지 않는다.
  • 따라서, 대부분의 경우 offer()을 사용하여 요소를 추가하는 것이 안전하다.

profile
안녕하세요

0개의 댓글