01.31 모의고사(JAVA)

2023. 1. 31. 17:03개발일지

1. 신대륙 발견

기원이는 오늘 항해99를 시작했다. 성격이 급한 기원이는 항해 1일 차부터 언제 수료를 하게될 지 궁금하다.

항해 1일 차 날짜를 입력하면 98일 이후 항해를 수료하게 되는 날짜를 계산해주는 알고리즘을 만들어보자.

제한 조건

  • 1 ≤ month ≤ 12
  • 1 ≤ day ≤ 31 (2월은 28일로 고정합니다, 즉 윤일은 고려하지 않습니다.)

 

입출력 예

month day result
11 27 "3월 5일"
6 22 "9월 28일"

 

지정 입력값

month day result
1 18 '4월 26일'
public class Main {
    public String solution(int year, int month, int day) {
        String answer = "";
        Calendar cal = Calendar.getInstance();
        cal.set(year, month-1, day+98);
        answer = cal.get(Calendar.MONTH)+1 + "월" + cal.get(Calendar.DATE) + "일";
        return answer;
    }




    public static void main(String[] args) {
        Main test = new Main();
        System.out.println(test.solution(2023,1,1));
    }

}

풀이 내용

  • Calender라는 클래스를 임포트 해줘서 입력한 년, 월, 일을 cal에 담아줄 때 month에 -1을 해주고 day에다 +100을 해줍니다. 이때 +100은 100일 이후 기준으로 잡은겁니다. month에 -1을 붙이는 이유는 안 빼주면 예를 들어서 위에 코드처럼 2023,1,1을 입력했을 때 똑같이 반환되어야 하지만 -1을 안붙이면 월에 +1이 되서 2월 1일로 출력되기 때문입니다. 이제 answer에 값을 저장해줄때 cal.get(Calender.MONTH)+1로 월을 찾아주고 cal.get(Calender.DATE)로 일을 찾아줍니다 이때 cal.get(Calender.MONTH)에 +1을 해주는 이유는 Java에서 월은 0부터 시작이기 때문입니다. 그 다음 마지막으로 answer값을 반환해줍니다.

 

2. 몇시간 했더라? (중)

지용이는 항해에서 한 주 동안 공부 기록을 남길 알고리즘을 만들어보기로 결심했다. 항해의 체크인 페이지에는 몇가지 조건이 있는데 이를 만족하는 알고리즘을 만들어보자.

  • 체크인과 체크아웃은 항상 정시에 진행한 것으로 가정한다.
  • 체크아웃을 할 때 익일 시간은 24+a 로 계산한다. 즉 새벽 2시는 24+2 인 26으로 표기한다.
  • 체크인 페이지는 체크아웃이 새벽 5시 정각이나 새벽 5시를 넘어가면 체크아웃을 깜빡한 것으로 간주한다. 따라서 새벽 5시가 넘어가 체크아웃을 하게 되면 자동으로 체크아웃을 오후 9시(21시)로 한 것으로 처리한다.

제한 조건

  • 체크인(checkin)과 체크아웃(checkout)을 진행한 시간이 담긴 배열 두 개가 주어진다.
  • 각 배열에는 월요일부터 일요일까지 체크인/아웃을 한 시간이 담겨있다.
  • checkin과 checkout 배열의 길이는 각각 7 이다.

입출력 예

checkin checkout result
{9, 9, 8, 8, 7, 8, 9} {21, 25, 30, 29, 22, 23, 30} 96
{9, 7, 8, 9, 7, 9, 8} {23, 22, 26, 26, 29, 27, 22} 110

 

지정 입력값

checkin checkout result
{9, 9, 9, 9, 7, 9, 8} {23, 23, 30, 28, 30, 23, 23} 102

 

public class Main {
        public int solution(int[] arr1, int[] arr2) {
            int answer = 0;
            for (int i = 0; i < arr1.length; i++) {
               if (arr2[i] > 29){
                   arr2[i] = 21;
               }
               int time = arr2[i] - arr1[i];
               answer +=time;
            }
            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));
        }
    }

 

풀이 내용

  • arr1배열길이만큼 반복문을 돌려줍니다 이때 arr2[i]가 29보다 크다면 그 배열은 21로 변경해줍니다. 그다음 int time이란 변수를 선언과 동시에 arr2[i] 와 arr1[i]를 빼준 값을 time에다가 저장을 합니다. 저장한 time안에 있는 값을 answer에다가 저장 후 return으로 값을 반환해줍니다.

3. 소수의 개수와 덧셈 (상)

문제 설명

문자열 s에는 공백으로 구분된 숫자들이 저장되어 있습니다. str에 나타나는 숫자 중 소수의 최대값과 소수가 아닌 수의 최소값을 찾아 이를 "(최소값) (최대값)"형태의 문자열을 반환하는 함수, solution을 완성하세요.

예를들어 s가 "2 3 4 5"라면 "4 5"를 리턴하고, "15 3 10 9 7 8"라면 "8 7"을 리턴하면 됩니다.


제한사항

  • s에는 둘 이상의 정수가 공백으로 구분되어 있습니다.
  • 문자열에는 소수가 한개 이상 섞여 있습니다.
  • 문자열에는 소수가 아닌 수가 한개 이상 섞여 있습니다.
  • 음수는 없습니다.

입출력 예

s result
"2 3 4 5" "4 5"
"15 3 10 9 7 8" "8 7"

지정 입력값

s result
"97 75 88 99 95 92 73" "75 97"
public class Main {
    public String solution(String s) {
        String answer = "";
        String[] str = s.split(" ");
//        문자열을 문자열 배열로 분할합니다.
        int[] arr = new int[str.length];
//        문자열 배열을 정수 배열로 변환합니다.
        int min = 0;
        int max = 0;
        for (int i = 0; i < str.length; i++) {
            arr[i] = Integer.parseInt(str[i]);
        }
//        str길이만큼 반복하면서 arr[i] 값에 String타입의 str[i]을 숫자를 int타입으로 변환시킵니다.
        Arrays.sort(arr);
//        정수 배열을 정렬합니다.

        for (int i = 0; i<arr.length; i++) {
            if(isPrime(arr[i])){
                min = arr[i];
            }
        }
//        배열에서 가장 작은 소수를 찾습니다.
        for (int j = 0; j < arr.length; j++) {
            if (!isPrime(arr[j])){
                max = arr[j];
                break;
            }
        }
//        배열에서 가장 큰 소수가 아닌 숫자를 찾습니다.
        return answer = max+" "+min;
//        소수가 아닌 가장 큰 숫자와 가장 작은 소수를 반환합니다.
    }

    public boolean isPrime(int n) {
        for (int i = 2; i<=(int)Math.sqrt(n); i++) {
            if (n % i == 0) {
                return false;
            }
        }
        return true;
    }

    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));
    }
}

풀이 내용

  1. 문자열을 문자열 배열로 반환합니다.
  2. 문자열 배열을 정수 배열로 변환합니다.
  3. 정수 배열을 정리합니다.
  4. 배열에서 가장 작은 소수를 찾습니다.
  5. 배열에서 가장 큰 소수가 아닌 숫자를 찾습니다.
  6. 소수가 아닌 가장 큰숫자와 가장 작은 소수를 반환합니다.

===========================================================================

1번 문제 풀면서 시간계산하는 부분이 약했는데 이번에 구글에서 내가 원하는 방향으로 처음으로 바꿔봐서 만족스럽고 2번문제가 더욱 쉬운느낌은 저만 든건가요..? 3번은 문제를 이해를 못해서 팀원분들 리뷰한거보고 거기서 정리해서 올렸습니다. 우선 문제를 이해하는 방식으로 공부를 해야겠습니다! 겁먹지않고 힘들어도 즐기면서 열심히 다시 열공!

'개발일지' 카테고리의 다른 글

02.01 bus (객체지향)  (0) 2023.02.01
02.01 그리디 알고리즘 1 (JAVA)  (0) 2023.02.01
01.30 알고리즘  (0) 2023.01.30
01.28 TIL  (0) 2023.01.28
01.27 TIL  (1) 2023.01.27