[ LeetCode | Java ] 219. Contains Duplicate II

dokim·2023년 8월 30일
post-thumbnail

🏷️219. Contains Duplicate II


1. 문제 설명

  • 정수 배열 nums와 정수 k가 주어졌을 때, 배열에서 nums[i] == nums[j]이고 abs(i - j) <= k인 두 개의 서로 다른 인덱스 ij가 있는 경우 true를 반환합니다.


2. 접근 방법

HashMap을 사용하여 배열 nums의 정수와 index를 Key : Value 값으로 초기화하여 중복 되는 key가 왔을 경우 비교&연산을 하여 결과를 만들어 냈습니다.

  • HashMap을 사용하여 배열 numsdateKey값으로, indexvalue값으로 저장하고 nums의 중복된 데이터를 찾으면 index를 비교&연산합니다.
  • 연산 결과가 k보다 같거나 작은면 true를 반환하고, 다르면 Value값을 현재 index값으로 수정합니다.
  • 마지막까지 원하는 결과값을 찾지 못하면 false를 반환합니다.

3. 구현 코드

class Solution {
    public boolean containsNearbyDuplicate(int[] nums, int k) {
        
        HashMap<Integer, Integer> map = new HashMap<>();
        
        for(int i = 0; i < nums.length; i++){
            if(map.containsKey(nums[i])){
                if(i - map.get(nums[i]) <= k)
                    return true;
                else
                    map.put(nums[i], i);
            }
            else
               map.put(nums[i], i);
        }
        return false;
    }
}
  • 시간 복잡도: O(n)
  • 공간 복잡도: O(n)

4. 개선 사항

중복된 else문 코드를 줄여 개선해 보았습니다.

  • 원래 else문의 코드에서 map.put(nums[i], i); 작업을 하였습니다. 하지만 조금만 수정 해주면 간결한 코드로 만들 수 있어 수정하였습니다. 항상 중복된 작업이 있으면 리펙토링을 할 수 있는지 생각을 하도록 해야겠습니다.
class Solution {
    public boolean containsNearbyDuplicate(int[] nums, int k) {
    	Map<Integer, Integer> map = new HashMap<Integer, Integer>();
    	for (int i = 0; i < nums.length; i++) {
        	if (map.containsKey(nums[i])) 
            	if (i - map.get(nums[i]) <= k) return true;
         	map.put(nums[i], i);
    	}
    return false;
	}
}

5. 최종 회고

  • 처음에는 HashMap으로 문제를 접근하고 생각하는 것이 익숙하지 않아 코드를 만드는데 시간이 걸렸습니다. 점점 익숙해지고 이해도가 올라가면서 활용하는 방식과 생각이 편해지고 있어 뿌뜻함을 느끼고 있습니다.😊

0개의 댓글