코딩테스트/PROGRAMMERS

[Programmers] 다단계 칫솔 판매 - JAVA

5월._. 2023. 5. 29.
728x90

1. 문제

 

프로그래머스

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

programmers.co.kr

각 판매원의 이름을 담은 배열 enroll, 각 판매원을 다단계 조직에 참여시킨 다른 판매원의 이름을 담은 배열 referral, 판매량 집계 데이터의 판매원 이름을 나열한 배열 seller, 판매량 집계 데이터의 판매 수량을 나열한 배열 amount가 매개변수로 주어질 때, 각 판매원이 득한 이익금을 나열한 배열을 return 하도록 solution 함수를 완성해주세요. 판매원에게 배분된 이익금의 총합을 계산하여(정수형으로), 입력으로 주어진 enroll에 이름이 포함된 순서에 따라 나열하면 됩니다.


2. 풀이

Member 클래스

인덱스, 추천인, 수익을 저장한다.

class Member {
    int idx;
    Member next = null;
    int money = 0;
    Member(int idx, Member next){this.next = next;this.idx = idx;}
}

 

solution

1.  center를 미리 map에 넣어둔다.

2.  추천인, 인덱스를 Member 객체에 넣어서 map에 저장한다.

3.  seller 배열 순서대로 처리한다. now에 map.get(seller[i])을 넣고, next에 now.next를 저장한다. 초기 money는 판매한 양 * 100원이다.

4.  계속 반복하되, money / 10 == 0 이거나 next == null인 경우 now에 모든 money가 더해져야하므로 더하고 종료한다.

5.  now.money에 money-money/10을 더한다.

6.  money는 10으로 나눈값을 저장한다.

7.  now = next, next = now.next로 교체해서 다음 반복 때 활용되도록 한다.

public int[] solution(String[] enroll, String[] referral, String[] seller, int[] amount) {
    Map<String, Member> map = new HashMap<>();
    map.put("-", new Member(-1,null));
    for(int i=0;i<enroll.length;i++) {
        map.put(enroll[i], new Member(i,map.get(referral[i])));
    }
        
    int money;
    Member now, next;
    for(int i=0;i<seller.length;i++){
        now = map.get(seller[i]);
        next = now.next;
        money = amount[i]*100;

        while(true){
            if(money/10==0 || next == null){
                now.money += money;
                break;
            }
                
            now.money += money-money/10;
            money /= 10;
                
            now = next;
            next = now.next;
        }
    }
        
    int[] answer = new int[enroll.length];
    for(Member mem:map.values()){
        if(mem.idx == -1) continue;
        answer[mem.idx] = mem.money;
    }
        
    return answer;
}

3. 결과

now.money += money/10*9 이런거 해서 계속 틀렸다. 발견하는 데 오래걸렸다^_ㅜ

댓글