Skip to main content

250826


복합기 ok

kt ok

해태관 애슐리 영수증 ok

미술관 사진 정리 ok

여기 포켓스탑 계속 거절당하는 이유가 도대체 몹니까 와이 ??



코테

  • 이상한 문자 만들기 고치기 ok - 나중에 포스팅 연속공백 split("구분자" , -1)
  • 다음 큰 숫자 ok - Integer.bitCount(n)
  • 시저 암호 ok - 퍼센트 연산자랑 아스키로
  • PCCP
  • 숫자의 표현 투포인터 복습 ok
  • 짝지어 제거하기 와 너무 피곤하다 1시 40분임.... 내일해야겠다...
  • 피보나치수ok
  • 가장 가까운 같은 글자 ok
  • 숫자의 포현 ok - 투포인터
  • 다단계 칫솔판매 객체지향 와 넘 어렵네 이거하다 시간 ㄴ다감 ok


다단계 칫솔판매 객체지향

Map<String, Member> memberMap = new HashMap<>();
  • key (String) : enroll 배열에서 문자열 이름 ("john")
  • value (Member) : Member 객체 (Member(name = "john", parent=mary, profit=0))

여기서 parent 정보는 Map에 키값으로 저장하는게 아니라 객체지향으로 바꾸면 Member 객체 안에 parent 필드에 들어있음

class Member {
    String name;       // 내 이름
    Member parent;     // 다단계 권유한 멤버 (없으면 null)
    int profit;        // 내가 지금까지 번 돈

    public Member(String name) {
        this.name = name;
        this.profit = 0;
        this.parent = null;
    }
}

Map의 타입 파라미터가 <String, Member>인데 Member 자체를 key로 못쓰는 이유 ?

  1. 중복 안됨 → 동일한 key는 같은 value
  2. 빠르게 찾을 수 있어야 함. 보통 해시 기반 탐색임 HashMap으로 구현하니까
  3. equals() / hashCode()로 동일성 판단함

Member 객체는 내가 만든것
이걸 key로 쓰려면 equals()랑 hashCode() 오버라이딩 해야 함
안하면? 기본 Object의 equals/hashCode 씀
그러면? 메모리 주소 비교만 함.
그래서 이름 똑같은 두 멤버 Member("john") 만들어도 서로 다른 key 취급함.
Member는 mutable이라 내부 값이 바뀌면 hashCode 달라질 수 있음
그럼 버그 위험이 있음.
String은 immutable이라 key로 가능함


import java.util.*;

class Solution {
    public int[] solution(String[] enroll, String[] referral, String[] seller, int[] amount) {
        Map<String, Member> memberMap = new HashMap<>();
        
        // 1. 모든 멤버 key값 생성
        for (String name : enroll) {
            memberMap.put(name, new Member(name));
        }
        
        // 2. parent 연결
        for (int i = 0; i < enroll.length; i++) {
            String name = enroll[i];
            String parentName = referral[i];
            if (!parentName.equals("-")) {
                // 추천인이 없을 경우 "-"
                memberMap.get(name).setParent(memberMap.get(parentName));
            }
        }
        
        // 3. 판매 발생 처리
        for (int i = 0; i < seller.length; i++) {
            String name = seller[i];
            int profit = amount[i] * 100;
            memberMap.get(name).addProfit(profit);
        }
        
        // 4. 결과 배열 만들기
        int[] answer = new int[enroll.length];
        for (int i = 0; i < enroll.length; i++) {
            answer[i] = memberMap.get(enroll[i]).getProfit();
        }
     
    
        return answer;
    }
}

class Member {
    private final String name;
    private Member parent;
    private int profit;
    
    public Member(String name) {
        this.name = name;
        this.profit = 0;
    }
    
    public void setParent(Member parent) {
        this.parent = parent;
    }
    
    public void addProfit(int money) {
        int giveToParent = money / 10;
        this.profit += money - giveToParent;
        
        if (parent != null && giveToParent > 0) {
            parent.addProfit(giveToParent);
        }
    }
    
    public int getProfit() {
        return profit;
    }
}