본문 바로가기

항해 99/Java

프로그래밍 테스트 및 IDE 프로젝트 빌드 오류 해결

인텔리제이 프로젝트 빌드 오류 해결방법

에러 코드

Module 'week' production: java.lang.ClassCastException: class org.jetbrains.jps.builders.java.dependencyView.TypeRepr$PrimitiveType cannot be cast to class org.jetbrains.jps.builders.java.dependencyView.TypeRepr$ClassType (org.jetbrains.jps.builders.java.dependencyView.TypeRepr$PrimitiveType and org.jetbrains.jps.builders.java.dependencyView.TypeRepr$ClassType are in unnamed module of loader java.net.URLClassLoader @1c20c684)

 

해결 방법

  • Menu → Build → Build project / Rebuild project
  • Menu → File →  Invalidate caches / Restart → 첫번 째 항목 체크 → Invalidate and Restart
  • 최근에 설치하거나 활성화한 플러그인을 제거
  • Check dependencies (especially cyclic-dependencies) in   File → Project Structure... → Modules
  • 마지막 수단: 백업을 만들고 프로젝트 디렉토리에서 .idea 폴더를 제거한 다음, 처음부터 새 프로젝트를 생성

 

 

항해 99 알고리즘 테스트

1. 잔돈의 최소 갯수 구하기

package test4.test1;

public class Main {
    /*
    * 금액 1000원
    * 편의점에는 500, 100, 50, 10원이 충분하고 직원은 거스름돈 개수가 가장 적게 줌
    * 물건을 사고 1000원을 1장 냈을 때 받을 잔돈의 개수
    * 물건 가격: 10 <= price <= 1000, 1원 단위 미고려
    * amount = 1000 에서 물건 가격(price)을 뺀 값
    * price = 물건 가격
    * answer = 받은 거스름돈 개수
    * 각 거스름돈 단위별로 나눗셈 연산 사용*/

    public int solution(int price) {
        int answer = 0;
        int amount = 1000 - price;
        int value500 = amount / 500; // 거스름돈에서 500원 개수
        int value100 = (amount % 500) / 100; // 거스름돈에서 500원 개수 뺀 100원 개수
        int value50 = (amount % 500 % 100) / 50; // 거스름돈에서 500, 100원 뺀 50원 개수
        int value10 = (amount % 500 % 100 % 50) / 10; // 거스름돈에서 500,100,50원 뺀 10원 개수
        answer = value500 + value100 + value50 + value10; // 거스름돈 개수 총합

        return answer;
    }

    public static void main(String[] args) {
        Main method = new Main();
        int num1 = 160;
        System.out.println(method.solution(num1));
        System.out.println(method.solution(900));
        System.out.println(method.solution(550));
        System.out.println(method.solution(320));
        System.out.println(method.solution(160));
        System.out.println(method.solution(700));
    }
}
  • 나눗셈 연산을 사용해 물건을 사고 남은 돈에서 500, 100, 50, 10원의 거스름돈으로 받을 동전의 갯수를 구함

 

2. 일주일간 총 공부시간 구하기

public class Main {
    /*
    * 체크인과 체크아웃은 항상 정시
    * 체크아웃을 할 때 익일 시간은 24+a로 계산, 새벽 2시는 24+2 = 26
    * 체크인 페이지는 체크 아웃이 새벽 5시 정각 및 5시를 넘아가면 체크아웃을 깜박한 것으로 간주
    * 새벽 5시 지나서 체크아웃하면 체크아웃 시간을 21로 처리
    *
    * 제한조건
    * 체크인과 체크아웃 진행한 배열 2개
    * 각 배열에는 월~일까지 체크인, 체크아웃 시간이 있음
    * 각 배열의 길이는 7
    *
    * 체크인 체크 아웃 배열을 보고 일주일 공부 시간을 return
    * 각 배열 번호 별로 시간을 계산하고 총합을 구함
    * 1일 공부 시간은 체크아웃 - 체크인
    * 29 이상부터는 21로 처리하도록 계산 - 조건문 사용*/
    public int solution(int[] arr1, int[] arr2) {
        int answer = 0;
        for (int i = 0; i < 7; i++) { // 제한 사항 배열 길이 7이므로 7 입력 배열 길이 제한이 없을 경우 length 사용
            if (arr2[i] >= 29) {
                answer += 21 - arr1[i]; // 새벽 5시 이후 체크 아웃은 오후 9시 체크 아웃 시간으로
            } else {
                answer += arr2[i] - arr1[i];
            }
        }
        return answer;
    }

    public static void main(String[] args) {
        Main method = new Main();
        int[] arr1 = {9, 9, 9, 9, 7, 9, 8};
        int[] arr2 = {23, 23, 30, 28, 30, 23, 23};
        System.out.println(method.solution(arr1, arr2));
        System.out.println(method.solution(new int[]{9, 9, 8, 8, 7, 8, 9}, new int[]{21, 25, 30, 29, 22, 23, 30}));
        System.out.println(method.solution(new int[]{9, 7, 8, 9, 7, 9, 8}, new int[]{23, 22, 26, 26, 29, 27, 22}));
    }
}
  • 이중 반복문 및 조건문을 사용해 체크 아웃 시간 - 체크 인 시간을 계산해 1일 공부시간을 구하고 총 공부시간에 합산

 

3. 문자열 안의 소수 최대값과 소수가 아닌 수의 최소값 구하기

package test4.test3;

import java.util.Arrays;

public class Main {
    /*
    * 문자열 s에는 공백으로 구분된 숫자가 저장
    * s에 나타나는 숫자 중 소수의 최대값과 소수가 아닌 수의 최소값을 찾고
    * "(최소값)(최대값)"형태의 문자열로 반환
    * s가 "2 3 4 5"면 "4 5"를 리턴
    * 제한 사항
    * 문자열 s에는 소수, 소수가 아닌 수 1개 이상은 있음
    * 음수(-)는 없음
    * 문자열 공백 기준으로 잘라서 Integer.parseInt로 형변환
    * 소수 판별 조건문 1개 및 소수로 판별된 수 중에 최대 값 찾기
    * 소수가 아닌 거로 판별된 수 중에 최소 값 찾기*/
    public String solution(String s) {
        // 문자열 s를 공백 기준으로 자르고(split), stream mapToInt로 각 문자열 숫자를 int로 형변환
        int[] check_number = Arrays.stream(s.split(" ")).mapToInt(Integer::parseInt).toArray();

        // 최대 소수 값
        int maxPrimeNum = 0;
        // 최소 소수가 아닌 값
        int minNonPrimeNum = Integer.MAX_VALUE; // 최대 값으로 지정 후 최소 값 구하기

        //배열의 각 값을 순회하며 소수인지 아닌지 확인
        // 소수는 1과 자신 외의 수로는 안 나눠지므로 약수가 있는지 확인
        // 해당 수의 제곱근 까지만 확인
        for (int num : check_number) {
            boolean isPrime = true;
            // num이 0, 1인 경우를 확인하는 조건문
            if (num <= 1) {
                isPrime = false;
            } else {
                for (int i = 2; i <= Math.sqrt(num); i++) {
                    // num이 i로 나눌 때 나머지가 없으면 소수가 아님
                    if (num % i == 0) {
                        isPrime = false;
                        break;
                    }
                }
            }

            // 소수 최대값, 소수 아닌 수 최소 값 갱신
            if (isPrime) {
                // 소수 최대 값 갱신
                maxPrimeNum = Math.max(maxPrimeNum, num);
            } else {
                // 소수 아닌 수 최소 값 갱신
                minNonPrimeNum = Math.min(minNonPrimeNum, num);
            }

        }

        // 결과를 공백으로 구분하여 반환 (소수 아닌 수의 최소값) 공백 (소수의 최대값)
        String answer = minNonPrimeNum + " " + maxPrimeNum;
        return answer;
    }

    public static void main(String[] args) {
        Main method = new Main();
        String s = "97 75 88 99 95 92 73";
        System.out.println(method.solution(s));
        System.out.println(method.solution("2 3 4 5"));
        System.out.println(method.solution("15 4 10 9 7 8"));
        System.out.println(method.solution("15 3 10 9 7 8"));
        System.out.println(method.solution("1 3 4 5 9 11 16"));
    }
}
  • Stream API를 사용해 문자열을 자르고 숫자로 형변환 하여 배열로 변환
  • 이중 반복문 및 조건문을 사용해 배열의 수가 소수인지 소수가 아닌지 판별 후 소수인 값은 최대값으로 갱신하고 소수가 아닌 값은 최소 값으로 갱신
  • 0, 1에 대한 조건문도 추가

 

멘토링 내용 요약

  • 코딩 테스트 준비 시 랜덤 카테고리로 공부하는 것보다 하나의 카테고리 문제를 많이 풀면서 익숙해 지는 게 좋음
  • 한 문제를 다양한 방식으로 푸는 것보다 본인이 익숙한 방식으로 푸는 것이 효율적임
  • 공부할 때 설명으로만 이해가 안 될 경우
    • 이론 부분을 먼저 정리하고 해당 부분의 예제를 찾아보거나
    • 자신이 배운 것을 사용해서 예제를 만들어보는 것도 이해하는데 도움이 됨
    • 한글로만 검색하지말고 영어로 검색하는 것도 더 다양한 예제를 찾는데 도움이 됨
    • 공부를 할 때 한 번에 여러 부분에 대해 하지말고 중요한 부분에 중점을 두고 공부하는 것이 좋음

'항해 99 > Java' 카테고리의 다른 글

빌터 패턴  (1) 2024.02.26
WIL - 3  (0) 2024.02.25
Java - 모던 자바  (0) 2024.02.19
Java - 프로세스, 쓰레드  (0) 2024.02.19
WIL - 2  (0) 2024.02.18