console.log
[PRG] 152996 시소 짝꿍 JAVA 본문
https://school.programmers.co.kr/learn/courses/30/lessons/152996
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
메모리: 76.6 MB
실행시간: 0.11 ms
문제분석
배열을 순회하며 짝꿍을 찾는다 !
이때 중요한 것은 같은 몸무게의 사람이 존재하는지,
또한 그 사람들을 제외하고 2배, 3배, 4배에 겹치는 사람과 짝을 이루는 것 !
걸린시간
1시간 ⏱️
풀이방법
a : 원본 몸무게 카운트 할 배열 [1001]
b : 2,3,4배 몸무게 카운트 할 배열 [4001]
1. weights 배열 순회하기
2. 현재 사람의 몸무게가 a에 있는지 체크
3. 2가 true : 2에 해당되는 만큼 ++, 현재 사람의 몸무게 2,3,4배가 2에 해당되는거 말고도 b에 있는 만큼 ++
2가 false : 현재 사람의 몸무게 2,3,4배가 b에 있는 만큼 ++
4. 현재 사람의 몸무게에 따라 a와 b에 카운트 더하기
포인트
쌍을 카운트 할 때에는 중복을 조심해야 한다 !
하지만, 내가 생각한 방법대로 하면 앞에서부터 순회하며 카운트하기 때문에
중복이 발생하지 않는다 !
왜냐하면 ... 앞에서 등록된 사람의 몸무게만 판별하기 때문에
앞에서 뒷 사람을 체크하지 못했다면 뒤에서 체크한다 !
코드
class Solution {
public long solution(int[] weights) {
long answer = 0;
// 카운트 배열 생성
long[] cntWeight = new long[1001]; // 몸무게 원본 저장
long[] cntMul = new long[4001]; // 몸무게 배수 저장
// weights 배열 순회
for(int i = 0; i < weights.length; i ++) {
// 현재 사람의 몸무게 체크
long temp = cntWeight[weights[i]];
int m2 = weights[i] * 2;
int m3 = weights[i] * 3;
int m4 = weights[i] * 4;
if(temp > 0) { // 앞에서 같은 몸무게가 있었다면
// 그 사람 수 만큼 카운트 ++
answer += temp;
// 몸무게 2, 3, 4배 체크하기
answer += cntMul[m2] - temp;
answer += cntMul[m3] - temp;
answer += cntMul[m4] - temp;
} else { // 앞에서 같은 몸무게가 없었다면
answer += cntMul[m2];
answer += cntMul[m3];
answer += cntMul[m4];
}
// 배열에 카운트 더하기
cntWeight[weights[i]] ++;
cntMul[m2] ++;
cntMul[m3] ++;
cntMul[m4] ++;
}
return answer;
}
}
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[PRG] 150368 이모티콘 할인행사 JAVA (0) | 2023.09.11 |
---|---|
[PRG] 155651 호텔 대실 JAVA (0) | 2023.09.09 |
[PRG] 161988 연속 펄스 부분 수열의 합 JAVA (0) | 2023.09.01 |
[PRG] 160585 혼자서 하는 틱택토 JAVA (0) | 2023.08.30 |
[PRG] 172927 광물 캐기 JAVA (0) | 2023.08.27 |