티스토리 뷰

문제주소

leetcode.com/problems/two-sum/

leetcode.com/problems/reverse-integer/

leetcode.com/problems/remove-duplicates-from-sorted-list/

내 풀이 && 다른 사람 풀이

    public static int[] twoSum(int[] nums, int target) {
        int[] answer = new int[2];
        for (int i = 0; i < nums.length; i++) {
            for (int j = i + 1; j < nums.length; j++) {
                if ((nums[i] + nums[j]) == target) {
                    answer[0] = i;
                    answer[1] = j;
                    return answer;
                }
            }
        }
        return answer;
    }
    /*
	다른풀이 O(n) : 리츠코드 솔루션
    // 값을 hashmap을 넣어서 현재 값의 차이기 hashmap에 있다면 그것이 정답!
	public int[] twoSum(int[] nums, int target) {
    	Map<Integer, Integer> map = new HashMap<>();
    	for (int i = 0; i < nums.length; i++) {
        	map.put(nums[i], i);
    	}
    	for (int i = 0; i < nums.length; i++) {
        	int complement = target - nums[i];
        	if (map.containsKey(complement) && map.get(complement) != i) {
            	return new int[] { i, map.get(complement) };
        	}	
    	}
    	throw new IllegalArgumentException("No two sum solution");
	}
     */

    public static int reverse(int x) {
        String stringX = String.valueOf(x);
        StringBuilder temp = new StringBuilder();
        if (stringX.charAt(0) == '-') {
            stringX = stringX.substring(1);
            temp.append('-');
        }
        for (int i = stringX.length() - 1; i > -1; i--) {
            temp.append(stringX.charAt(i));
        }
        long tempAnswer = Long.parseLong(temp.toString());
        if (tempAnswer > Integer.MAX_VALUE || tempAnswer < Integer.MIN_VALUE) {
            return 0;
        }
        return (int) tempAnswer;
    }

    /* 
    리츠코드 솔루션
    10의 자리 수를 받아오는 다른 풀이 , integer 값 넘는 경우 체크하는 부분 확인!
    (2^21-1) = 2147483647가 max 인데 214748364이면 끝에가 8부터는 overflow!
    -2^31 = -2147483648가 min 인데 214748364이면 끝자리가 -9부터는 overflow!
    1의 자리로 역순을 만들어 주고 있으니 %10, *10으로 숫자를 활용한다.
        public int reverse(int x) {
            int rev = 0;
            while (x != 0) {
                int pop = x % 10;
                x /= 10;
                if (rev > Integer.MAX_VALUE/10 || (rev == Integer.MAX_VALUE / 10 && pop > 7)) return 0;
                if (rev < Integer.MIN_VALUE/10 || (rev == Integer.MIN_VALUE / 10 && pop < -8)) return 0;
                rev = rev * 10 + pop;
            }
            return rev;
        }
     */
  
    // next로 넘기는 작업을 어떻게 해야 하는지 모르겠어서 남의 코드 보고 풀었다.
    // head를 복사해서 그 자체의 연결고리를 바꿔주고 처음 시작인 head를 반환해주면 되었다.
    public static ListNode deleteDuplicates(ListNode head) {
        ListNode temp = head;
        while (temp != null) {
            ListNode next = temp.next;
            while (next != null && temp.val == next.val) {
                next = next.next;
            }
            temp.next = next;
            temp = next;
        }
        return head;
    }
    
    /*
    리츠코드 풀이
	public ListNode deleteDuplicates(ListNode head) {
    	ListNode current = head;
    	while (current != null && current.next != null) {
    		// 지금 값이랑 다음 값이 같을 때만 current의 다음 값을 그 다음 값으로 한 칸 더 넘겨준다.
        	if (current.next.val == current.val) {
            	current.next = current.next.next;
        	} else {
        	// 아니면 current의 현재 값을 바꿔주기!
            	current = current.next;
        	}
    	}
    	// head로 리턴하는게 내가 해결하지 못하던 것의 해결방법이었다.
    	return head;
	}
*/

 

3번은 예전에도 못 풀었던 문제 같은데 여전히 잘 안 풀려서 어려웠다. 아직 LinkedList에 대한 이해가 조금 부족하다는 생각이 들었다. 문제가 요구하는대로 그대로 작성하는게 예외케이스를 발생하지 않는 방안인 것 같고, 좀 더 간편하게 풀 수 있는 방안을 고민해 보아야 겠다는 생각이 들었다. 아직 알고리즘 풀 때, 미션을 할 때보다 자바가 더 불편하게 느껴진다. 😂

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
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
글 보관함