class Solution {
public long solution(int[] weights) {
long answer = 0;
//범위가 100000이라서 무조건 반복은 한번 돌아야 한다고 생각 --> ?
Map<Integer, List<Integer>> hm = new HashMap<>();
Set<Integer> mySet = new HashSet<>(); //☑ Set공부
int leng = weights.length;
for(int i = 0; i < leng; i++){
if(!hm.containsKey(weights[i])){//weights가 key값으로 가지고 있지 않다면
List<Integer> myList = new ArrayList<>(); //리스트 생성
myList.add(i);//리스트에 추가
hm.put(weights[i], myList);//map의 key값에 무게, value에 리스트를 put
}
else{
hm.get(weights[i]).add(i);//key값으로 가지고 있다면, 해당 키갑의 value에 add
}
mySet.add(weights[i]);
}
for(int key : mySet){//set 하나씩 반복실행
int dupli = hm.get(key).size();//길이
//x2x2, x3x3 등 중복은 제외
int wX2 = key * 2;// 기준 시소 x2일 시
if(wX2 % 3 == 0){//x3일 때
if(hm.containsKey(wX2 / 3)){
answer += (long)hm.get(wX2/3).size() * dupli;
}
}
if(wX2 % 4 == 0){//x4일 때
if(hm.containsKey(wX2 / 4)){
answer += (long)hm.get(wX2 / 4).size() * dupli;
}
}
int wX3 = key * 3;//기준 x3
if(wX3 % 2 == 0){
if(hm.containsKey(wX3 / 2)){
answer += (long)hm.get(wX3/2).size() * dupli;
}
}
if(wX3 % 4 == 0){
if(hm.containsKey(wX3 / 4)){
answer += (long)hm.get(wX3/4).size() * dupli;
}
}
int wX4 = key * 4;
if(wX4%2 == 0){
if(hm.containsKey(wX4 / 2)){
answer += (long)hm.get(wX4/2).size()*dupli;
}
}
if(wX4 % 3 == 0){
if(hm.containsKey(wX4 / 3)){
answer += (long)hm.get(wX4/2).size()*dupli;
}
}
if(dupli > 1){
answer += (long)dupli * (long)(dupli -1 )/2;
}
hm.remove(key);
}
return answer;
}
}
이건 아직 내가 풀 문제가 아니다
다음에 다시 도전하자
📚도움받은곳
'Algorithm > 프로그래머스' 카테고리의 다른 글
[programmers] 최소직사각형 (1) | 2023.05.17 |
---|---|
[프로그래머스] 같은 숫자는 싫어(12906) (0) | 2023.03.10 |
[프로그래머스][SQL] 그룹별 조건에 맞는 식당 목록 출력하기(131124) (0) | 2023.03.09 |
[Programmers] 없는 숫자 더하기 (0) | 2022.07.22 |
[Programmers] 03 3진법 뒤집기 (0) | 2022.07.17 |