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로 못쓰는 이유 ?
- 중복 안됨 → 동일한 key는 같은 value
- 빠르게 찾을 수 있어야 함. 보통 해시 기반 탐색임 HashMap으로 구현하니까
- 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;
}
}