[ 수학 ] - 최대값,최소값,지능형 기차2 ,피보난치,일곱난장이
최대값 최소값 구하는 방법에대해서 풀어보았다.
1번째는 반복문을 이용하였고
2번째는 Arrays.sort를 이용하였다
1.번
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String n = sc.nextLine();
int[] arr = new int[Integer.parseInt(n)];
String s = sc.nextLine();
String[] S =s.split(" ");
int[] intArr = new int[S.length];
for(int i = 0 ; i < S.length;i++) {
intArr[i]=Integer.parseInt(S[i]);
}
//최소값
//System.out.println(min(intArr));
// 최대값
System.out.println(max(intArr));
}
static int max(int[] maxArr) {
int maxIndex=0;
int max = -1000000;
for(int i=0;i<maxArr.length;i++) {
if(maxArr[i]>=max) {
max=maxArr[i];
maxIndex=i;
}
}
return maxArr[maxIndex];
}
static int min(int[] minArr) {
int minIndex=0;
int min = 1000000;
for(int i=0;i<minArr.length;i++) {
if(minArr[i]<=min) {
min=minArr[i];
minIndex=i;
}
}
return minArr[minIndex];
}
}
2번
package com.myproject.CodeTest;
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String n = sc.nextLine();
int[] arr = new int[Integer.parseInt(n)];
String s = sc.nextLine();
String[] S =s.split(" ");
int[] intArr = new int[S.length];
for(int i = 0 ; i < S.length;i++) {
intArr[i]=Integer.parseInt(S[i]);
}
//쉬운방법 sort 사용
Arrays.sort(intArr);
System.out.println(intArr[0]);
System.out.println(intArr[intArr.length-1]);
}
}
결과는 1번이 훨씬더 짧게 걸렷다는것을 알수있다.
1번의경우 코드가 더 길지만 반복문을 통해 가장 큰값만뽑았고 , 2번의 경우 코드는 짧지만 정렬을 진행하다보면 배열을 복사해서 재생상하는 과정때문에 시간이 오래걸린다는 사실을 확인하였다.
2. 지능형 기차 2
https://www.acmicpc.net/problem/2460
2460번: 지능형 기차 2
최근에 개발된 지능형 기차가 1번역(출발역)부터 10번역(종착역)까지 10개의 정차역이 있는 노선에서 운행되고 있다. 이 기차에는 타거나 내리는 사람 수를 자동으로 인식할 수 있는 장치가 있다.
www.acmicpc.net
오늘 어떻게하다보니 재귀함수에대해서 공부를 했는데 마침 재귀함수를 사용해 볼 수 있엇다.
재귀함수를 사용한 부분은 버스가 매번 승강장에서 사람이 승차/하차 하는데 버스에 남은인원이 가장 많을때 몇명인가 부분에서 사용하였다.
즉 1번 승강장에서 10명이 타고 2명이 내리고
2번 승강장에서 3명이 타고 4명이 내리고
3번 승강장에서 9명이 타고 12명이 내린다면
1번 승강장이 지나고 버스에 남은인원은 10-2 = 8명
2번 승강장이 지나고 버스에 남은 인원은 10 -2 + 3 - 4 =7명
3번 승강장이 지나고 버스에 남은인원은 10 -2 + 3 - 4 + 9 - 12 = 4명이 된다
이런식으로 각승강장마다 이전에 있던 승강장의 승/하차 인원을 사용하였다 ㅋ
그리고 가장 많은인원을 찾기 위해 위의 값들을 배열에 { 8 ,7 ,4 } 이런식으로 담을떄 사용할수있엇다.
이중 가장 큰 값을 찾는것은 이위에서 사용한 최대값 찾기를 사용하여 문제를 풀었다.
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int[] inputArr = new int[10];
for(int i = 0 ; i < inputArr.length; i++) {
String input = sc.nextLine();
inputArr[i]=Integer.parseInt(input.split(" ")[1]) -Integer.parseInt(input.split(" ")[0]);
}
int[] intArr = new int[10];
for (int i = 0 ; i < intArr.length;i++) {
// 재귀함수
intArr[i]=factorial(inputArr,i);
}
//최대값은
System.out.println(max(intArr));
}
static int factorial(int[] inputArr,int i) {
if(i==0) return inputArr[i];
return inputArr[i] + factorial(inputArr,i-1);
}
static int max(int[] intArr) {
int max=0;
int maxIndex=0;
for(int i=0;i<intArr.length;i++) {
if(intArr[i]>max) {
max=intArr[i];
maxIndex=i;
}
}
return intArr[maxIndex];
}
}
3. 피보난치
오늘 재귀함수를 공부하면서 같이 언급되는 피보난치도 문제로 풀어보았다. 거의 예제 코드랑 똑같은 문제였음.
https://www.acmicpc.net/problem/10870
10870번: 피보나치 수 5
피보나치 수는 0과 1로 시작한다. 0번째 피보나치 수는 0이고, 1번째 피보나치 수는 1이다. 그 다음 2번째 부터는 바로 앞 두 피보나치 수의 합이 된다. 이를 식으로 써보면 Fn = Fn-1 + Fn-2 (n ≥ 2)가
www.acmicpc.net
규칙은 처음 숫자배열 [n,m] 주고 배열이 늘어나는데 있어 덧셈을 시키는데 n+m= l 일때 배열은 [n,m,l[ 이되는 규칙이다.
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int input = sc.nextInt();
//fibonacci
System.out.println(fibonacci(input));
}
static int fibonacci(int input) {
int[] intArr = new int[input+1];
for(int i=0;i<intArr.length;i++) {
if(i==0) intArr[0]=0;
else if(i==1) intArr[1]=1;
else {
intArr[i]=intArr[i-2] + intArr[i-1];
}
}
return intArr[input];
}
}
4. 일곱난장이
https://www.acmicpc.net/problem/2309
2309번: 일곱 난쟁이
아홉 개의 줄에 걸쳐 난쟁이들의 키가 주어진다. 주어지는 키는 100을 넘지 않는 자연수이며, 아홉 난쟁이의 키는 모두 다르며, 가능한 정답이 여러 가지인 경우에는 아무거나 출력한다.
www.acmicpc.net
문제의 내용은 9개중 7개를 뽑아 100이 될 경우 7개의값을 낮은순서부터 표시하라라는 내용이다.
조건중에 7개값이 중복되지않는다 정도이다.
그래서 intArr 배열에 9개의 숫자를 받았고
while문을 돌려 7개의 합이 100인경우 while을 종료하였다.
7개의 숫자는 뽑을때 이전에 뽑은 배열의 숫자일경우 다른숫자가 나올떄까지 while문을 사용하였고 , 뽑은숫자는 arrayList에 담고 뽑을때마다 indexOf 로 검사하여 -1이 아닌경우에만 추가하였다.
마지막으로 array 를 Arrays.sort를 사용하여 정렬한다.
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int[] intArr = new int[9];
for( int i = 0 ; i<intArr.length;i++) {
int input = sc.nextInt();
intArr[i]=input;
}
int[] result = null; // 난쟁이 키
while(true) {
ArrayList<Integer> randomArr =new ArrayList<>();
result = new int[7];
for(int i= 0 ;i<7;i++) {
//7번 숫자를 뽑고 그숫자의 값을 더해 100인지 확인다
//단 같은 숫자를 두번뽑을경우 다시뽑아야한다.
//중복제거용
while(true) {
int r = (int)(Math.random()*9);
if(randomArr.indexOf(r)==-1) {
//중복체크용
randomArr.add(r);
//난장이 키 덧셈용
result[i]=intArr[r];
break;
}
}
}
int total =0;
for(int r : result) {
total+=r;
}
if(total == 100 ) break;
}
Arrays.sort(result);
for(int r : result) {
System.out.println(r);
}
}
}