개발 공부/문제와 풀이

Java) 연습문제 3-1

죽밥죽밥화이팅 2024. 8. 10. 19:19

package Java_18_3.src;

public class Practice1 {
    public static void solution(int[] nums) {
        int idx = 0;
        for (int num : nums) {
            if (idx == 0 || num > nums[idx - 1]) {
                nums[idx++] = num;
            }
        }
        System.out.print("[" + idx + "] ");
        for (int i = 0; i < idx; i++) {
            System.out.print(nums[i] + " ");
        }
        System.out.println();
    }

    public static void main(String[] args) {
        // Test code
        solution(new int[] {1, 1, 2}); //idx)[2] 1 2 
        solution(new int[] {0, 0, 1, 1, 1, 2, 2, 3, 3, 4}); //idx)[5] 0 1 2 3 4 
    }
}

 


 

package Java_18_3.src;

import java.util.ArrayList;

public class Practice2 {
    public static ArrayList<Integer> solution(int[] nums) {
        ArrayList<Integer> list = new ArrayList<>();

        for (int i = 0; i < nums.length; i++) {
            int index = Math.abs(nums[i]) - 1;

            if (nums[index] < 0) {
                list.add(Math.abs(index + 1));
            }
            nums[index] = -nums[index];
        }
        return list;
    }

    public static void main(String[] args) {
        // Test code
        int[] nums = {4, 3, 2, 7, 8, 2, 3, 1}; 
        System.out.println(solution(nums)); //[2, 3]

        nums = new int[]{1, 1, 2};
        System.out.println(solution(nums)); //[1]

        nums = new int[]{1, 3, 1, 3, 5, 5};
        System.out.println(solution(nums)); //[1, 3, 5]
    }
}

 


 

package Java_18_3.src;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;

public class Practice3 {
    public static void solution(int[] arr, int k, int x) {
        // key: 절대값 차이 / value: 해당 값
        HashMap<Integer, ArrayList<Integer>> map = new HashMap<>();

        for (int i = 0; i < arr.length; i++) {
            // Math.abs():절대값
            int diff = Math.abs(x - arr[i]);
            // 동일한 절대값이 있는지 없는지를 위해 하나 꺼내봄
            ArrayList<Integer> cur = map.get(diff);
            if (cur == null) {
                // 값이 없으면 해당 절대값을 넣어줌
                map.put(diff, new ArrayList<>(Arrays.asList(arr[i])));
            } else {
                // 절대값이 같으면 값이 작은수가 앞에 배치되어 출력 될 수 있도록
                int idx = cur.size();
                for (int j = 0; j < cur.size(); j++) {
                    if (cur.get(j) > arr[i]) {
                        idx = j;
                        break;
                    }
                }
                cur.add(idx, arr[i]);
            }
        }

        // 출력을 위한 list
        ArrayList<Integer> result = new ArrayList<>();
        int cnt = 0;
        while (map.size() > 0) {
            int minDiff = map.keySet().stream().min((a, b) -> a - b).get();
            ArrayList<Integer> cur = map.get(minDiff);
            map.remove(minDiff);

            while (cur.size() > 0) {
                result.add(cur.get(0));
                cur.remove(0);
                cnt++;

                if (cnt == k) {
                    break;
                }
            }

            if (cnt == k) {
                break;
            }
        }

        Collections.sort(result);
        System.out.println(result);
    }

    public static void main(String[] args) {
        // Test code
        int[] arr = {1, 2, 3, 4, 5};
        solution(arr, 4, 3);

        arr = new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
        solution(arr, 5, 5);

        arr = new int[]{2, 4};
        solution(arr, 1, 3);

        arr = new int[]{2, 4};
        solution(arr, 3, 3);
    }
}