ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 배열
    자료구조와 알고리즘/문제풀기 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
Designed by Tistory.