내가 생각한 부분은 for 문의 인덱스가 한번 돌때에 안쪽 for문에서 다음 원소부터의 수를 서칭해서 합이 target 과 같다면 answer 배열에 저장하는 것이었다.
public class TwoSum {
public static void main(String[] args) {
int[] input = new int[] {2,8,10,21};
int target = 10;
int[] answer = new int[2];
for(int i=0; i< input.length;i ++){
int temp = input[i];
for(int j=i+1; j<input.length-1;j ++ ){
if(temp + input[j] == target){
answer[0] = i+1;
answer[1] = j+1;
break;
}
}
}
System.out.println(Arrays.toString(answer));
}
}
풀이는 달랐다. 담을 그릇을 정하고, 그 그릇을 활용해서 값을 찾아내신다.
- 숫자들의 공통점으로 보아 Target - 원소는 찾아야할 값이다.
- Map <Target- 원소, index> 으로 값을 저장할 그릇을 정한다.
- 분기점을 고려하여 else 문에 첫 값을 넣고. 다음 원소부터 containskey 메서드를 이용해서 값을 서칭한다.
- 서칭한 값의 value인 인덱스를 꺼내서 answer에 저장한다.
/**
* 인덱스 0부터 빼서 for문을 돌린다. target 에서 뺀다
* 8을 Map에 넣는다. (8,1) 뺀값 , 인덱스
* 다음 인덱스 에서 Map에 있는 것과 매칭 되면 인덱스를 구한다.
*/
private static int[] solve(int[] input, int target) {
//담을 그릇은 항상중요함
Map<Integer,Integer> map = new HashMap<>();
int[] result = new int[2];
//for문 사용 결정
for(int i = 0; i<input.length; i++){
if(map.containsKey(input[i])){
int index = map.get(input[i]);// 인덱스를 바로 꺼낸다.
result[0] = index + 1;
result[1] = i + 1;
break;
} else {
//처음에는 반드시 else 문을 타게됨
map.put(target-input[i],i);// key 10-2 =8 , value i =0
}
}
return result;
}
'막무가내로 삽질하는 알고리즘' 카테고리의 다른 글
우선순위 큐 (0) | 2020.10.18 |
---|---|
Merge Interval (0) | 2020.10.11 |
DailyTemperature (0) | 2020.10.11 |
MoveZeros (0) | 2020.10.04 |
Meeting Room1 (0) | 2020.10.04 |