본문 바로가기
TIL/Java 알고리즘 문제 풀이

23.06.03

by J1-H00N 2023. 6. 3.

1. 몫 구하기

public class _01_getQuotient {
    public static void main(String[] args) {
        _01_getQuotient get = new _01_getQuotient();
        System.out.println(get.getQuotient());
    }

    private int getQuotient() {
        Scanner sc = new Scanner(System.in);
        int firstNumber = sc.nextInt(); // 나눠지는 숫자
        int secondNumber = sc.nextInt(); // 나눌 숫자

        int quotient = firstNumber/secondNumber; // 타입이 int이므로 소수점을 버려진다.
        return quotient;
    }
}

큰 어려움 없이 해냈다.

 

2. 최빈값 구하기

public class _02_getMode {
    public static void main(String[] args) {
        _02_getMode getMode = new _02_getMode();
        int[] ints = {1,2,1,3,1,4,1,2,3,1};
        for (String count : getMode.getMode(ints)) {
            System.out.println(count);
        }
    }

    private String[] getMode(int[] ints) {
        int index = 0;
        String[] countArray = new String[ints.length];
        for (int getInt : ints){
            int count = 0;
            for (int i = 0; i < ints.length; i++) {
                if (getInt == ints[i]) {
                    count++;
                }
            }
            countArray[index] = getInt + " + " + count;
            index++;
        }

        return countArray;
    }
}

처음에는 위와 같이 배열에서 각 숫자를 가져와 배열의 다른숫자들과 비교해 같으면 카운트를 1씩 추가해 어떤 숫자의 카운트가 제일 큰 지 비교하려 했으나 로직도 더러워지고 무엇보다 같은 숫자를 여러번 카운트해 깔끔하게 출력되지 않았다.

 

그래서 일단 배열안에 어떤 숫자들이 있는지부터 확인하고, 각 숫자가 몇 개 있는지 확인하는 방식으로 진행하려 한다.

public class _02_getMode {
    public static void main(String[] args) {
        int[] ints = {1,2,1,3,1,4,1,2,3,1};
        getMode(ints);
    }

    // 최빈값 구하는 메서드
    private static void getMode(int[] ints) {
        ArrayList<Integer> countInts = new ArrayList<>();
        for (int i = 0; i < checkInts(ints).size(); i++) {
            int count = 0;
            for (int j = 0; j < ints.length; j++) {
                // 확인된 숫자와 리스트 안에 숫자가 같으면 카운트 추가
                if (checkInts(ints).get(i).equals(ints[j])) {
                    count++;
                }
            }
            countInts.add(count);
        }

        // 카운트가 가장 큰 값의 숫자 확인하기 = 최빈값의 카운트
        int maxCount = 0;
        for (int i = 0; i < countInts.size(); i++) {
            if (countInts.get(i) > maxCount) {
                maxCount = countInts.get(i);
            }
        }

        System.out.println(checkInts(ints).get(countInts.indexOf(maxCount)) + " : " + maxCount + "회");
    }

    // 확인된 숫자 리스트 만들기
    private static ArrayList<Integer> checkInts(int[] ints) {
        ArrayList<Integer> checkedInts = new ArrayList<>();
        // 각각의 원소가 확인된 숫자 리스트에 없으면 추가
        for (int check : ints) {
            if (!checkedInts.contains(check)) {
                checkedInts.add(check);
            }
        }
        return checkedInts;
    }
}

 

위와 같이 작성할경우 시간복잡도가 너무 커져 ArrayList가 아닌 Map으로 생성하는 것이 더 좋을 듯 하다는 조언을 받았다.

'TIL > Java 알고리즘 문제 풀이' 카테고리의 다른 글

23.06.18  (2) 2023.06.18
23.06.16  (0) 2023.06.16
23.06.11  (0) 2023.06.11
23.06.07  (0) 2023.06.07
23.06.05  (0) 2023.06.05