링크 : https://school.programmers.co.kr/learn/courses/30/lessons/152996
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제 풀이
시소 거리에 따라 rates 배열을 만들었다.
그리고 for문을 돌며 체크.. 하지만 아래 코드는 타임아웃 우려가 있어 사용하지 않는게 좋다.
import java.util.*;
class Solution {
public long solution(int[] weights) {
Map<Integer, Integer> answerMap = new HashMap<>();
int[][] rates = {{1, 1}, {3, 2}, {4, 2}, {4, 3}};
for(int i=0; i<weights.length; i++) {
int left = weights[i]; // 왼쪽에 앉은 사람 무게
for(int l=0; l<weights.length; l++) {
int right = weights[l]; // 오른쪽에 앉은 사람 무게
if(i == l) {
break;
}
for(int j=0; j<rates.length; j++) {
int sum1 = left * rates[j][0];
int sum2 = right * rates[j][1];
if(sum1 == sum2) {
answerMap.put(sum1, sum1);
}
}
}
}
return answerMap.size();
}
}
아래는 수정한 소스코드이다.
1. 먼저, weights 배열을 오름차순 정렬 해준다. -> 같은 무게를 빨리 찾기 위해
2. 같은 무게를 가진 경우의 수를 찾아준다. sameNum 변수에 담고 전체 answer 에서 빼준다. -> 후에 같은 경우의 수를 같이 계산
3. 균형을 이루는 경우의 수를 찾아준다.
import java.util.*;
class Solution {
public long solution(int[] weights) {
long answer = 0;
Arrays.sort(weights); // 오름차순 정렬
int sameNum = 0;
for(int i=0; i<weights.length-1; i++) {
if(i>0) {
if(weights[i-1] == weights[i]) {
sameNum--;
answer += sameNum;
continue;
}
}
sameNum = 0;
for(int j=i+1; j<weights.length; j++) {
int left = weights[i];
int right = weights[j];
if(left == right ||
left * 3 == right * 2 ||
left * 2 == right * 1 ||
left * 4 == right * 3) {
answer++;
}
}
answer += sameNum;
}
return answer;
}
}'알고리즘 > 프로그래머스' 카테고리의 다른 글
| [프로그래머스] 혼자서 하는 틱택토(Java) (3) | 2024.02.28 |
|---|---|
| [프로그래머스] 무인도 여행(Java), 너비 우선 탐색(BFS) 알고리즘 (0) | 2024.02.14 |
| [프로그래머스] 숫자 변환하기(Java), DP & BFS 알고리즘 (1) | 2024.02.13 |
| [프로그래머스] 호텔 대실(Java), 2차원 배열 정렬 (2) | 2024.01.31 |
| [프로그래머스] 두 원 사이의 정수 쌍(Java) (2) | 2024.01.24 |