반응형
문제분석
문제는 매우 간단하다 서로다른 weights 2개를 골라서 그 경우가
총 7개의 케이스 4:3 ,4:2,3:2, 1:1 ,2:3, 3:4, 2:4 인 경우를 판단하면된다.
FirstTry : 문제대로 풀기
그냥 문제대로 풀었다.
2차 반복문으로 서로다른 사람의 몸무게를 2개 골라 case를 판별한다.
case의 부합한다면 answer++를 증가시키는 간단하게 구현했지만..
효율성에러
문제 풀고보니 제한사항이 사람의 몸무게 갯수가 10만까지 간다.
구글에 쳐보니 10만*10만이 100억이라고 한다. 당연히 걸릴만한 시간복잡도다..
Second Try: 1차 반복문으로 줄이기
1차 반복문으로 줄여서 구현해야한다.
여기서 생각난게 Arr또는 Map을 구현해서 정보를 저장해두는게 현명하다 보았다.
그 이유는, 어처피 각 몸무게는 확인해야할 몸무게는 총 7개의 케이스의 몸무게 뿐이다.
각 케이스마다 몸무게를 저장하고, 그 케이스의 7개의 케이스가 저장된 메모리를 검색해서 그 갯수만큼 커플수를 올린다.
첫번째 로직과는 다르게 이 두번째로직은 한정된 배열안에서 검색을 하는 행위기때문에,
소수점을 발생하는 경우와 배열의 범위를 넘어가는 경우를 철저하게 배제해줘야한다.
오늘의 교휸 : 제한사항 꼭 유의하자
문제풀이
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
class Solution {
public long solution(int[] weights) {
long answer = 0;
int[] board = new int[1001];
for(int weight : weights){
if(board[weight]!=0){
answer+=board[weight];
}
if(weight*2<=1000&&board[weight*2]!=0){
answer+=board[weight*2];
}
if(weight%2==0&&weight/2>=100&&board[weight/2]!=0){
answer+=board[weight/2];
}
if(weight%2==0&&(weight/2)*3<=1000&&board[(weight/2)*3]!=0){
answer+=board[(weight/2)*3];
}
if(weight%3==0&&(weight/3)*2>=100&&board[(weight/3)*2]!=0){
answer+=board[(weight/3)*2];
}
if(weight%3==0&&(weight/3)*4<=1000&&board[(weight/3)*4]!=0){
answer+=board[(weight/3)*4];
}
if(weight%4==0&&(weight/4)*3>=100&&board[(weight/4)*3]!=0){
answer+=board[(weight/4)*3];
}
board[weight]++;
}
return answer;
}
}
|
cs |
반응형
'알고리즘 > 프로그래머스 Level2' 카테고리의 다른 글
[프로그래머스,Java] Levle2: 숫자 변환하기 (0) | 2023.01.26 |
---|---|
[프로그래머스,Java] Level2: 뒤에 있는 큰수 (0) | 2023.01.26 |
[프로그래머스,Java] Level2: 이모티콘 할인행사 (0) | 2023.01.11 |
[프로그래머스,Java] Level2: 택배 배달과 수거하기 (0) | 2023.01.07 |
[프로그래머스 ,Java] Level2: 유사 칸토어 비트열 (0) | 2023.01.01 |