-
배열자료구조와 알고리즘/문제풀기 2024. 1. 12. 10:07
-> 다시 도전 (물방울 가두기, 자신을 제외한 곱셈, 3더하기)
-> 투포인터로 문제 해결하는 방식 조금 배웠다 (물방울 가두기,3더하기..)
-> 중복값 계산하기 귀찮으면 Map에다가 key로 때려 박으면 쫌 다루기 쉬울 때가 있다.
-> map.containsKey, Arrays.asList, new ArrayList<>(map.values()) 야무지게 외워둡시다.
> 물방울 가두기 (리트코드 - 42)
1. 내 풀이(3ms)
public int trap(int[] height) { int maxHeight = Arrays.stream(height).max().getAsInt(); int rainWidth=0; int left = 0; int right = height.length - 1; int leftMax = height[left]; int rightMax = height[right]; while(left <= right){ //각 왼쪽 오른쪽 max와 포인터 움직이며 차이 더하기 if(rightMax < height[right]){ rightMax = height[right]; }else if(height[right] < rightMax){ rainWidth += rightMax - height[right]; height[right] = rightMax ; } if(leftMax < height[left]){ leftMax = height[left]; }else if(height[left] < leftMax){ rainWidth += leftMax - height[left]; height[left] = leftMax; } //maxHeight만나면 움직이지마! if(height[right] < maxHeight ){ right--; } if(height[left] < maxHeight){ left++; } //양 끝값이 같아서 움직이지 못할 때 풀어줌 혹은 left,right 같을때도 한번 움직이기 //이때 leftMax와 rightMax는 maxHeight로 설정해야한다. if(height[right] == maxHeight && height[left] == maxHeight && left<right ){ right--; left++; rightMax = maxHeight; leftMax = maxHeight; }else if(left == right){ right--; left++; } } return rainWidth; }
2. 투포인터 최대로 이동 (0ms ....)
public int trap(int[] height) { int volume = 0; int left =0; int right = height.length - 1; int leftMax = height[left]; int rightMax = height[right]; while(left < right){ leftMax = Math.max(height[left],leftMax); rightMAx = Math.max(height[right],rightMax); if(leftMax <= rightMax){ volume += leftMax - height[left]; left++; }else{ volume += rightMax - height[right]; right--; } } return volume; }
> 두 수의 합 (1)
1. 내 풀이 (49ms)
public int[] twoSum(int[] nums, int target) { int[] result = new int[2]; for(int i=0; i< nums.length-1; i++){ for(int j=i+1; j<nums.length;j++){ if(nums[j] == target-nums[i]){ result[0] = i; result[1] = j; } } } return result; }
2. 첫 번째 수를 뺀 결과 키 조회
public int[] twoSum(int[] nums, int target) { Map<Integer,Integer> numsMap = new HashMap<>(); for(int i = 0; i< nums.length; i++){ numsMap.put(nums[i],i); } //tartget에서 수를 뺀 것이 조회결과에 있으면 정답 for(int i=0; i<nums.length;i++){ if(numsMap.containsKey(target - nums[i]) && i != numsMap.get(target - nums[i])){ return new int[]{i,numsMap.get(target - nums[i])}; } } return null; }
3. 투 포인터 이용
> 투포인터는 정렬된 배열에서 값을 찾거나, 배열을 자르는 것에 쫌 더 이점이 있음! 인덱스를 찾는 문제에서는 투 포인터 적용하면 잘 안풀릴 수 있음 주의
> 배열 파티션 1 (리트코드 - 561)
1. 내 코드 (15ms)
public int arrayPairSum(int[] nums) { Arrays.sort(nums); int result=0; for(int i=0; i<nums.length; i=i+2){ result += Math.min(nums[i],nums[i+1]); } return result; }
> 자신을 제외한 배열의 곱 (리트코드 - 238)
public int[] productExceptSelf(int[] nums) { int[] array = new int[nums.length]; int p = 1; //아.. 왼쪽으로 한번 민다음 곱하고 오른쪽으로 한번 밀고 곱하기 // 오른쪽으로 한번 밀고 곱하기 for(int i=0; i<nums.length; i++){ array[i] = p; p*=nums[i]; } p=1; for(int i=nums.length-1; i>=0; i--){ array[i] *=p; p *= nums[i]; } return array; }
> 주식을 사고팔기 가장 좋은 시점 (리트코드 - 121)
1. 내 풀이(2ms)
public int maxProfit(int[] prices) { int maxProfit =0; int buy = prices[0]; for(int i=1; i<prices.length;i++){ if(buy>prices[i]){ buy = prices[i]; }else if(prices[i] - buy >0 && maxProfit < prices[i] - buy){ maxProfit = prices[i]-buy; } } return maxProfit; }
'자료구조와 알고리즘 > 문제풀기' 카테고리의 다른 글
완전탐색 - 백준 (10448) 유레카 문제 (0) 2024.04.16 연결리스트 (0) 2024.01.15 문자열 (0) 2024.01.10 SQL 고득점 킷 JOIN (0) 2023.09.01 백준 15990 - 1,2,3 더하기 5 (0) 2023.04.14