ssung_항해일지/항해99_프로그래밍 기초(알고리즘)

알고리즘 - 4일차 (모의고사 Review)

ssungcohol 2023. 2. 1. 02:12

제곱근 

Math.sqrt()

Math.sqrt(9) - 3 출력

 

x의 n제곱 값 출력

Math.pow(x, n);

Math.pow(3, 2); = 9


문제 1번

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

 

제한 조건 :

  • 1 ≤ month ≤ 12 ,
  • 1 ≤ day ≤ 31 (2월은 28일로 고정합니다, 즉 윤일은 고려하지 않습니다.)
public class Main {
    public String solution(int month, int day) {
        String answer = "";
        
        int[] days = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
        int total = 0;  // 전체 날짜
        int resultm = 0; // 반환해줄 달 변수
        int resultd = 0; // 반환해줄 날짜 변수
        
        total = total + (days[month-1] - day); // (days[month-1] - day) 는 처음 주어진 달과 날짜에서 남은 날짜를 계산
        
        int i = month;
        while (total < 98) {  // for문을 while문으로 변경
            total += days[i];
            i++;
        }
        
        resultm = i;
        
        resultd = days[resultm]-(total-97);  // 98일이 지난 시점의 해당 달 1일에서 날짜를 계산
        answer = resultm + "월" + resultd + "일" ;
        
        return answer;
    }

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

12월이 넘어가면 에러가 뜨는데.. 배열의 공간이 부족하다는 에러가 뜬다..

어떻게 해결을 해야하지? 여기저기 위치를 바꿔봐도 수정을 해봐도 해결이 안되네...

내일 해보자..


문제 2번

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

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

제한조건

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

입출력 예

check in check out As result
[9, 9, 8, 8, 7, 8, 9] [21, 25, 30, 29, 22, 23, 30] 96
public class Main {
    public int solution(int[] arr1, int[] arr2) {
        int answer = 0;
        
        int total = 0; // 공부시간 저장 변수 선언
        
        for (int i = 0; i < arr1.length; i++){ //arr1의 길이반큼 도는 for문
        	if(arr2[i] >= 30) { // 5시가 넘어가면 체크아웃을 21에 한 것으로 간주
            arr2[i] == 21;  // 새벽 5시가 지나 체크아웃을 하면 체크아웃시간 21시로 변환
            }
             total += arr2[i] - arr1[i];
            // 체크아웃시간-체크인 시간을 반복문 반복 횟수만큼 total에 저장
        }
        answer = total;
        
        return answer;  //(return total; 변경가능)
    }

    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"을 리턴하면 됩니다.

 

제한사항

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

입출력 예제

"2, 3, 4, 5" "4, 5"
"15, 3, 10, 9, 7, 8" "8, 7"

 

public class Main {
    public String solution(String s) {
        String answer = "";
        
        String[] str = s.split(" ");  // 입력받은 문자열 s를 공백으로 분리해 배열 num에 입력
        int max = -1; // 최댓값이 들어갈 변수 (소수)
        int min = -1; // 최솟값이 들어갈 변수 (소수 x)
        boolean sosu = true;
        
        for (int i = 0; i < str.length; i++) {
            for (int j = 2; j < Integer.parseInt(str[i]); j++) {
                // 모든 수는 1과 자기자신으로 나누어지기에 2부터 자기자신 -1 까지 for문 반복
                if (Integer.parseInt(str[i]) % j == 0) { // str i 번쨰 수가 j로 나누어 떨어진다면
                    sosu = false; // 소수가 아니다.
                    break;  // 안쪽 반복문 탈출
                }
            }
            if (sosu) { //소수이면
                if (max <= Integer.parseInt(str[i]))  // 현재값과 max 값을 비교해
                    max = Integer.parseInt(str[i]); // 큰 값을 max에 넣음

            } else { //소수가 아니면
                if (min >= Integer.parseInt(str[i]) || min == -1) // -1을 넣은 이유는 현재 값과 min 값을 비교하기 위해
                    min = Integer.parseInt(str[i]);
                }
            sosu = true; //소수 초기화
        }
        answer += min + " " + max;
        
        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));
    }
}
// 보너스 코드!!!
// 이건 무슨 코드일까요~~???? 그냥 외워~

for (int i = 0; i < str.length; i++) {
            for (int j = i + 1; j < str.length; j++) {
                if (Integer.parseInt(str[i]) > Integer.parseInt(str[j])) {
                    String tmp = str[i];
                    str[i] = str[j];
                    str[j] = tmp;
                }
            }
        }
728x90