막무가내로 삽질하는 알고리즘

TwoSum

Jungsoomin :) 2020. 10. 11. 13:55

내가 생각한 부분은 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