티스토리 뷰
Algorithm/문제풀이 Java
leetcode - Two Sum, Reverse Integer, Remove duplicates from sorted list
nauni 2021. 1. 13. 18:48문제주소
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에 대한 이해가 조금 부족하다는 생각이 들었다. 문제가 요구하는대로 그대로 작성하는게 예외케이스를 발생하지 않는 방안인 것 같고, 좀 더 간편하게 풀 수 있는 방안을 고민해 보아야 겠다는 생각이 들었다. 아직 알고리즘 풀 때, 미션을 할 때보다 자바가 더 불편하게 느껴진다. 😂
'Algorithm > 문제풀이 Java' 카테고리의 다른 글
프로그래머스 - 카카오 인형뽑기, 모의고사, 이상한 문자 만들기, K번째 수 (0) | 2021.01.20 |
---|---|
leetcode - Palindrome, Longest common prefix, Linked list cycle (0) | 2021.01.13 |
백준 1009 분산처리, 백준 1076 저항, 백준 1052 물병 (0) | 2021.01.07 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 글쓰기미션
- 운영체제
- 우아한테크코스
- DB
- JPA
- java
- 마스터즈코스
- 모의면접준비
- Transaction
- 코드스쿼드
- Spring
- 카카오
- 회고
- 월간회고
- 학습로그
- TIL
- OS
- 네트워크
- 우테코수업
- 객체지향
- 인증
- JS
- javascript
- 내부코드
- CS
- 개발공부일지
- TCP/IP
- 알고리즘
- python
- React
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함