제곱근
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
'ssung_항해일지 > 항해99_프로그래밍 기초(알고리즘)' 카테고리의 다른 글
알고리즘 - 마지막(with Test) (0) | 2023.02.03 |
---|---|
알고리즘 - 5일차 (1) | 2023.02.02 |
알고리즘 - 3일차 (0) | 2023.01.31 |
알고리즘 : 개인보충학습 (0) | 2023.01.30 |
알고리즘 - 2일차 (23.01.28) (0) | 2023.01.30 |