class Solution {
public 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;
break;
}
}
if (answer[1] != 0) break;
}
return answer;
}
}
일단 이렇게 풀었지만.. 이건 너무 오래 걸린다.
해시맵을 사용해봐야하나? 조금 더 생각해봐야겠다.
처음에는 모든 걸 해시맵에 넣고 (<숫자, 인덱스>) 찾으면 된다고 생각했는데, 막상 해보니 [3,3] 의 경우에 찾을 수 없다는 것을 알게되었다. 즉 중복되는 값에 대해서는 해결하기 어렵다. 리스트 형식으로 인덱스를 저장하는 것도 딱히..
답안을 보니 접근 자체는 잘했다고 생각했다. 그런데 굳이 다 넣을 필요가없고 앞선 것에서 있는지만 확인하는 걸로 위의 반례를 처리할 수 있었다.
class Solution {
public int[] twoSum(int[] nums, int target) {
HashMap<Integer, Integer> numIndex = new HashMap<>();
for (int i = 0; i< nums.length; i++){
int num = nums[i];
if (numIndex.containsKey(target - num)){
return new int[] {i, numIndex.get(target-num)};
}
numIndex.put(num, i);
}
return new int[] {};
}
}
class Solution {
public boolean isHappy(int n) {
int temp = n;
while (temp > 4){
int nextTemp = 0;
while (temp > 0){
int d = temp % 10;
nextTemp += d*d;
temp /= 10;
}
temp = nextTemp;
}
if (temp == 1){
return true;
}
return false;
}
}
처음에 이렇게 접근 했는데.. 뭔가 억지 부려서 푼 느낌이 난다..
답안을 보니 해시맵을 통해서 간단하게 루프를 확인할 수 있는 방법이 있었다.
class Solution {
public boolean isHappy(int n) {
Set<Integer> visit = new HashSet<>();
while (!visit.contains(n)) {
visit.add(n);
n = getNextNumber(n);
if (n == 1) {
return true;
}
}
return false;
}
private int getNextNumber(int n) {
int output = 0;
while (n > 0) {
int digit = n % 10;
output += digit * digit;
n = n / 10;
}
return output;
}
}
해시맵에 이미 존재하는 경우에는 이미 한번 계산했던 만큼 다시 루프가 돈다는 의미로 해결했던데 꽤나 흥미로웠다.
class Solution {
public boolean containsNearbyDuplicate(int[] nums, int k) {
HashMap<Integer, Integer> numIdx = new HashMap<>();
for (int i = 0; i<nums.length; i++){
if (numIdx.containsKey(nums[i])){
if (i - numIdx.get(nums[i]) <= k){
return true;
}
}
numIdx.put(nums[i], i);
}
return false;
}
}
위의 문제와 비슷해서 간단하게 해결했다.
128. Longest Consecutive Sequence
class Solution {
public int longestConsecutive(int[] nums) {
Set<Integer> numSet = new HashSet<>();
for (int num : nums){
numSet.add(num);
}
int longest = 0;
for (int num : numSet){
if (!numSet.contains(num - 1)){
int length = 1;
while (numSet.contains(num + length)) {
length++;
}
longest = Math.max(longest, length);
}
}
return longest;
}
}
도저히 답이 생각이 안나서 해결답안을 봤다.
제일 어려웠던 건 위로 가야할지 아래로 가야할지 정하는 게 어려웠다. 그런데 코드를 보니 예외사항이 안 생기게 한쪽으로 계산하게 만들면 되는 거였다는 것을 알게되었다.
완료!
'공부용 > 연습장' 카테고리의 다른 글
리트코드 16일차 (1) | 2025.02.20 |
---|---|
[리트코드] 15일차 (0) | 2025.02.19 |
[리트코드] 13일차 (0) | 2025.02.17 |
[리트코드] 12일차 (0) | 2025.02.16 |
리트코드 11일차 (0) | 2025.02.14 |