본문 바로가기

PS

다단계 칫솔 판매 [프로그래머스]

1. 문제에 대한 이해

  • 우리가 풀어야 할 문제는 무엇인가?
  • 주어진 자료는 무엇인가?
  • 조건은 무엇인가?
  • 우리가 문제를 풀기 위해 주어진 자료가 충분한가?
  • 숨겨진 조건이나 자료가 있는가? 그렇다면 그 것을 다른 방법으로 해석해보라. 

- 문제는 무엇인가?

-> 왜 이렇게 되는가?

-> 왜 시간 초과가 발생하는가?

-> HashMap을 통해서 해결했다. 

 

 

    

2. 계획

  • 전에 비슷한 문제를 알고 있는가?
  • 이 문제를 푸는데 있어서 유용하게 쓸 수 있는 지식은 무엇인가?
  • 비슷한 문제를 풀어본 적이 있다면 그 것을 활용할 수 있는가?
  • 만약 문제를 풀 수 없다면 문제를 더 단순하게 하기 위해서 주어진 조건을 버려보아라
  • 주어진 자료로부터 유용한 것을 이끌어 낼 수 있는가?
  • 자료는 모두 사용했는가?
  • 조건을 모두 사용했는가?
  • 문제에 포함된 핵심적인 개념은 모두 고려했는가?

3. 실행

  • 풀이 계획을 실행하고, 각 단계가 올바른지 점검하라.

[기존 코드]

import java.util.*; 

class Solution {
   
    public static HashMap<String, String> map;
    public static int[] result;
    
    public void DFS(String name, int earning, String[] enroll){
        
        
        if(name.equals("center")){
            return; 
        }else{
            
            if(earning < 10){
                     
                for(int i=0; i<enroll.length; i++){
                    if(name.equals(enroll[i])){
                        result[i] += earning;
                        break;
                    }
                }
                return; 
            }
            
            
            
            for(int i=0; i<enroll.length; i++){
                if(name.equals(enroll[i])){
                    result[i] += Math.ceil(earning*0.9);
                    break;
                }
            }
            
            DFS(map.get(name), (int)(earning*0.1), enroll);
            
        }
        
        
    }
    
    
    public int[] solution(String[] enroll, String[] referral, String[] seller, int[] amount) {
        int[] answer = {};
        
        map = new HashMap<>();
        
        result = new int[enroll.length];
        
        for(int i=0; i<enroll.length; i++){
            if(referral[i].equals("-")){
                map.put(enroll[i], "center");
            }else{
                map.put(enroll[i], referral[i]);
            }
        }
        
        for(int i=0; i<seller.length; i++){
            
            String name = seller[i];
            int earning = amount[i]*100;
            
            DFS(name, earning, enroll);
            
        }
        
        
        
        return result;
    }
    
}

 

[수정한 코드]

import java.util.*; 

public class Solution {
   
    public static HashMap<String, String> map;
    public static HashMap<String, Integer> enrollMap; 
    public static int[] result;
    
    public void DFS(String name, int earning, String[] enroll){
        
        
        if(name.equals("center")){
            return; 
        }else{
            
            if(earning < 10){
            
                if(enrollMap.containsKey(name)){
                    int idx = enrollMap.get(name);
                    result[idx] += earning;
                }         
                return; 
            }
            
            
            if(enrollMap.containsKey(name)){
                int idx = enrollMap.get(name);
                result[idx] += Math.ceil(earning*0.9);
            }       
            
            
            
            DFS(map.get(name), (int)(earning*0.1), enroll);
            
        }
        
        
    }
    
    
    public int[] solution(String[] enroll, String[] referral, String[] seller, int[] amount) {
        int[] answer = {};
        
        map = new HashMap<>();
        enrollMap = new HashMap<>(); 
        
        result = new int[enroll.length];
        
        for(int i=0; i<enroll.length; i++){
            if(referral[i].equals("-")){
                map.put(enroll[i], "center");
            }else{
                map.put(enroll[i], referral[i]);
            }
        }
        
        for(int i=0; i<enroll.length; i++){
            String str = enroll[i];
            enrollMap.put(str, i); 
        }
        
        
        for(int i=0; i<seller.length; i++){
            
            String name = seller[i];
            int earning = amount[i]*100;
            
            DFS(name, earning, enroll);
            
        }
        
        
        
        return result;
    }
 }

 

4. 반성

  • 문제를 다른 방식으로 해결할 수 있는가?
  • 결과나 방법을 어떤 다른 문제에 활용할 수 있는가?
  • 어떻게 하면 더 효율적으로 문제를 해결할 수 있는가?
  • 어떻게 하면 더 효과적으로 문제를 해결할 수 있는가?

- 어떻게 하면 더 효율적으로 문제를 해결할 수 있는가?

-> HashMap을 사용하면 시간 복잡도를 낮출 수 있다

-> HashMap에 자식과 부모를 넣어서 관리할 수 있다

-> Math.ceil을 통해서 오름 값을 구할 수 있다

-> DFS를 활용한다는 의미를 잘 이해해야 한다

 

'PS' 카테고리의 다른 글

나무 재테크 [BOJ 16235]  (0) 2022.09.30
행렬 테두리 회전하기 [프로그래머스]  (0) 2022.09.30
괄호 추가하기 [BOJ 16637]  (0) 2022.09.27
컴백홈 [BOJ 1189]  (1) 2022.09.26
양궁대회 [프로그래머스] - 2번째  (1) 2022.09.23