문제1.

기원이는 오늘 항해99를 시작했다. 성격이 급한 기원이는 항해 1일 차부터 언제 수료를 하게될 지 궁금하다. 항해 1일 차 날짜를 입력하면 98일 이후 항해를 수료하게 되는 날짜를 계산해주는 알고리즘을 만들어보자.
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

public class Main {
    public String solution(int month, int day) {
        String answer = "";
        LocalDate date = LocalDate.of(2022, month, day);
        LocalDate newDate = date.plusDays(98);
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("M월 dd일");
        answer = dateTimeFormatter.format(newDate);
        
        return answer;
    }

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

java.time.LocalDate 와 

java.time.format.DateTimeFormatter 를 import하면 쉽게 풀 수 있는 문제였습니다.

 

.plusDay() 메소드를 이용하여 날짜를 더합니다.

 

DateTimeFormatter.ofPattern()을 사용해서 "M월 dd일" 형식으로 출력합니다.

 

 

문제2.

지용이는 항해에서 한 주 동안 공부 기록을 남길 알고리즘을 만들어보기로 결심했다. 항해의 체크인 페이지에는 몇가지 조건이 있는데 이를 만족하는 알고리즘을 만들어보자.
체크인과 체크아웃은 항상 정시에 진행한 것으로 가정한다.
체크아웃을 할 때 익일 시간은 24+a 로 계산한다.
즉 새벽 2시는 24+2 인 26으로 표기한다.
체크인 페이지는 체크아웃이 새벽 5시 정각이나 새벽 5시를 넘어가면 체크아웃을 깜빡한 것으로 간주한다.
따라서 새벽 5시가 넘어가 체크아웃을 하게 되면 자동으로 체크아웃을 오후 9시(21시)로 한 것으로 처리한다.
public class Main {
    public int solution(int[] arr1, int[] arr2) {
        int answer = 0;
        for(int i=0; i<arr2.length; i++){
            if( arr2[i]>=29){
                answer += 21-arr1[i];
            }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));
    }
}

 

문제3.

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

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

소수 찾기가 어렵습니다... 매니저님 오시면 여쭤봐야겠음..

여쭤봤습니다...

 

import java.util.concurrent.LinkedTransferQueue;

public class primeNumbers {

    public String solution(String s) {
        String answer = "";
        //1은 소수가 아니다
        //2를 제외한 짝수도 소수가 아니다.
        //제곱근(sqrt) 범위 나누기법이란?
        //소수 여부를 검사할 수에 대해서 그 값의 제곱근을 기준으로 그 곱은 대칭적으로 곱이 일어나므로 
        //제곱근 이하의 작은 값까지만 검사를 하면 나머지는 검사를 할 필요가 없다는 방법으로 검사할 데이터를 제곱근 개 이하로 줄 일 수 있는 방법

        //소수 중 최대값
        //소수가 아닌 수 중 최소값 

        int primeMax = 0;
        int nonPrimeMin = Integer.MAX_VALUE;

        String[] numbers = s.split(" "); //

        for (String number : numbers) {
            int num = Integer.parseInt(number);
            if (numbercheck(num)) {
                if (num > primeMax) {
                    primeMax = num;
                }
            } else {
                if (num < nonPrimeMin) {
                    nonPrimeMin = num;
                }
            }
        }
        return nonPrimeMin + " " + primeMax;
    }

    private boolean numbercheck(int num) {
        //1이하는 소수가 아님
        if (num <= 1)
            return false;
        //2는 소수지만 2로 나누어지는 수는 소수가 아님
        if (num % 2 == 0)
            return num == 2;

        //3부터 소수 검사; 제곱근 이하의 수로 나누어지면 소수
        for (int i = 3; i < Math.sqrt(num); i++) {
            if (num % i == 0) {
                return false;
            }
        }
        return true;
    }


    public static void main(String[] args) {
        primeNumbers method = new primeNumbers();
        String s = "97 75 88 99 95 92 73";
        System.out.println(method.solution(s));
    }
}

 

+ Recent posts