어떠한 시소에 2,3,4 간격으로 좌석이 있다.
탑승한 사람의 무게와 시소 축과 좌석 간의 거리의 곱이 양쪽 다 같다면 시소 짝꿍 = answer++
answer 반환
사실 틀릴 거 예상하고 굉장히 원초적으로 풀어봤음
import java.util.*;
class Solution {
public long solution(int[] weights) {
long answer = 0;
Arrays.sort(weights);
for(int i=0; i<weights.length-1; i++) {
int n1 = weights[i];
int n2 = weights[i] * (2/3);
int n3 = weights[i] * (3/4);
int n4 = weights[i] * (2/4);
for(int j=i; j<weights.length; j++) {
if(weights[j] == n1) {
answer++;
break;
}
if(weights[j] == n2) {
answer++;
break;
}
if(weights[j] == n3) {
answer++;
break;
}
if(weights[j] == n4) {
answer++;
break;
}
}
}
return answer;
}
}
예제코드만 통과함ㅎ
map을 사용한 풀이법으로 풀어야 함
효율성을 위해 정렬
현재 몸무게에서 시소짝꿍이 되는 몸무게 찾기
2-1. 같은 몸무게라면 똑같은 간격에 뒀을 때 시소짝꿍 = n1
2-2. 2와 3의 지점에서 시소짝꿍이라면 x(2/3)해서 같으면 된다 = n2
2-3. 3과 4의 지점에서 시소짝꿍이라면 x(3/4)해서 같으면 된다 = n3
2-4. 2와 4의 지점에서 시소짝꿍이라면 x(2/4)해서 같으면 된다 = n4
map에 있는지 확인. 있으면 answer에 map에 기록된 몸무게 갯수 추가. 없으면 map에 몸무게 갯수 추가
answer 반환
ex) [100, 180, 360, 100, 270]
정렬 -> [100, 100, 180, 270, 360]
만약 w가 처음의 100일 때, map은 비어있으므로 바로 map에 넣어준다
-> map [100:1]
w가 그 다음의 100일 때, n1=100이고 n2,n3,n4는 map에 없다. n1은 map에 있으므로 2번째 100은 1번째 100과 시소짝꿍이다. answer에 더해준다.(answer = 1)
-> map [100:2]
w가 180일 때, n1=180, n2=120, n3=135, n4=90이다. 이 숫자들은 map에 존재하지 않으므로 map에는 나 자신인 180이 들어간다.
-> map [100:2, 180:1]
w가 270일 때, n1=270, n2=180, n3=202.5, n4=135이다. n2가 map에 있으므로 180과 270은 시소짝꿍이다. answer에 더해준다.(answer=2)
-> map [100:2, 180:1, 270:1]
w가 360일 때, n1=360, n2=240, n3=270, n4=180이다. n3와 n4가 map에 있으므로 360과 270은 시소짝꿍이다. 또, 360과 180도 시소짝꿍이다. answer에 더해준다. (answer=4)
-> map [100:2, 180:1, 270:1, 360:1]
=> answer = 4
map.put을 if절이 끝나고 마지막에 하는 이유: 처음부터 map에 넣고 시작하면 나 자신과 짝꿍이라 판단하기 때문에!
쉽게 생각해보자면 뒤에서부터 짝꿍을 찾아간다 생각하면 된다... (내피셜)
//*1, *2/3, *3/4, *2/4
import java.util.*;
class Solution {
public long solution(int[] weights) {
long answer = 0;
Arrays.sort(weights);
HashMap<Double, Integer> map = new HashMap<>();
for(int w:weights) {
//실수로 나눠줘야해서 소수점으로 계산
double n1 = w*1.0;
double n2 = w*(2.0/3.0);
double n3 = w*(3.0/4.0);
double n4 = w*(2.0/4.0);
if(map.containsKey(n1)) {
answer += map.get(n1);
}
if(map.containsKey(n2)) {
answer += map.get(n2);
}
if(map.containsKey(n3)) {
answer += map.get(n3);
}
if(map.containsKey(n4)) {
answer += map.get(n4);
}
map.put(n1, map.getOrDefault(n1,0)+1);
}
return answer;
}
}
정답~
이지만 여기서 젤 중요한 점
n1,n2,n3,n4는 double형이다. 왜? int형으로 하면 (3/4)이 정수가 되므로 0이 되어버린다. 그러면 틀린 계산이 된다.
실수(double)형으로 해서 (3/4)가 0이 아니라 0.75로 계산되게 만들어야 한다. 그러기 위해서 (3.0/4.0) 이런식으로 실수형 값을 곱해주었다.
이것땜시 오류났었다..!