3 minute read

2023-07-03

4단계 - 배열



목차





10818 번 문제


문제

N개의 정수가 주어진다. 이때, 최솟값과 최댓값을 구하는 프로그램을 작성하시오.


입력

첫째 줄에 정수의 개수 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 N개의 정수를 공백으로 구분해서 주어진다. 모든 정수는 -1,000,000보다 크거나 같고, 1,000,000보다 작거나 같은 정수이다.


출력

첫째 줄에 주어진 정수 N개의 최솟값과 최댓값을 공백으로 구분해 출력한다.



import java.io.*;
import java.util.StringTokenizer;

class Main{
    public static void main(String args[]) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        int a[] = new int[n];
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");
        for(int i = 0; i<n;i++){
            a[i] = Integer.parseInt(st.nextToken());
        }
        int min = a[0];
        int max = a[n-1];
        for(int i = 0; i<n; i++){
            if(a[i]<min){
                min = a[i];
            }
            if(a[i]>max){
                max = a[i];
            }
        }
        StringBuilder sb = new StringBuilder();
        sb.append(min).append(" ").append(max);
        System.out.println(sb);
    }
}
정답



메모리 시간
91528 KB 484 ms



너무 오래 걸렸다.. Math.min()과 Math.max를 써보자



import java.io.*;
import java.util.StringTokenizer;

class Main{
    public static void main(String args[]) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        int a[] = new int[n];
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");
        for(int i = 0; i<n;i++){
            a[i] = Integer.parseInt(st.nextToken());
        }
        int min = 1000000;
        int max = -1000000;
        for(int i = 0; i<n; i++){
            min = Math.min(a[i],min);
            max = Math.max(a[i],max);
        }
        StringBuilder sb = new StringBuilder();
        sb.append(min).append(" ").append(max);
        System.out.println(sb);
    }
}
정답(Math함수 사용)



메모리 시간
91504 KB 480 ms



별 차이가 없다.



import java.io.IOException;

public class Main {
    public static void main(String[] args) throws IOException {
        StringBuilder sb = new StringBuilder();
        int times = readInt();

        int min = Integer.MAX_VALUE;
        int max = Integer.MIN_VALUE;

        for(int i=0; i<times; i++){
            int num = readInt();

            min = Math.min(num, min);
            max = Math.max(num, max);
        }
        sb.append(min).append(" ").append(max);
        System.out.println(sb);
    }


    //method
    public static int readInt() throws IOException {
        boolean numSign = false;
        int value = 0; //리턴 시킬 숫자 합계

        while(true) {
            int num = System.in.read();

            if(num == '-'){ //음수라면
                numSign = true;
            } else if(num == ' ' || num == '\n') { //숫자 끝나는 지점 인식
                return numSign ? (-1 * value) : value;   
            } else {
                value = (value*10) + (num - '0');/*기존의 일의 자리를 다음 자리로 승격 */
            }
        }
    }
}
모범답안



메모리 시간
14260 KB 304 ms



int min = Integer.MAX_VALUE;
int max = Integer.MIN_VALUE;


이 코드를 보면 Integer.MAX_VALUE는 int 타입에서 표현할수있는 최댓값을 min값으로 지정해줬다. max또한 int 타입에서 표현 할 수 있는 최솟값으로 max값으로 지정해준 것이다.

그리고 readInt()매서드를 보면 numSign으로 음수와 양수를 판별해 음수라면 삼항 연산자로 -1을 곱해서 음수, 외에는 양수로 반환해준다.





2562 번 문제


문제

9개의 서로 다른 자연수가 주어질 때, 이들 중 최댓값을 찾고 그 최댓값이 몇 번째 수인지를 구하는 프로그램을 작성하시오.

예를 들어, 서로 다른 9개의 자연수

3, 29, 38, 12, 57, 74, 40, 85, 61

이 주어지면, 이들 중 최댓값은 85이고, 이 값은 8번째 수이다.


입력

첫째 줄부터 아홉 번째 줄까지 한 줄에 하나의 자연수가 주어진다. 주어지는 자연수는 100 보다 작다.


출력

첫째 줄에 최댓값을 출력하고, 둘째 줄에 최댓값이 몇 번째 수인지를 출력한다.



import java.io.*;

class Main{
    public static void main(String args[]) throws IOException{
        StringBuilder sb = new StringBuilder();
        int a[] = new int[9];
        int max = Integer.MIN_VALUE;
        int index = 0;
        for(int j = 0; j<9; j++){
            if(max< a[j]){
                max = a[j];
                index = j+1;
            }
        }
        sb.append(max).append("\n").append(index);
        System.out.println(sb);
    }
    
    private static Integer read() throws IOException{
        boolean sign = true;
        int a = 0;
        while(true){
            int num = System.in.read();
            if(num == '-'){
                sign = false;
            } else if(num == '\n'){
                return sign ? (-1*a) : a;
            } else {
                a = (a*10)+(a-'0');
            }
        }
    }
}
오답



왜 틀렸는지 잘 모르겠는데, 나머지는 내일 마저 풀어보겠다.



import java.io.*;

class Main{
    public static void main(String args[]) throws IOException{
        StringBuilder sb = new StringBuilder();
        int a[] = new int[9];
        int max = 0;
        int index = 0;
        for(int j = 0; j<9; j++){
            a[j] = read();
        }
        for(int i=0;i<9;i++){
            if(max<a[i]){
                max = a[i];
                index = i+1;
            }
        }
        
        sb.append(max).append("\n").append(index);
        System.out.println(sb);
    }
    
    private static int read() throws IOException{
        boolean sign = true;
        int a = 0;
        while(true){
            int num = System.in.read();
            if(num == '\n'){
                return a;
            } else {
                a = (a*10)+(num-'0');
            }
        }
    }
}
정답



메모리 시간
14088 KB 120 ms



문제는 read()함수 때문이었다… boolean계산하는 것이 반대로 되어있었기 때문에 계속 부호가 반대로 입력 됐던것이다. 사실 문제에는 자연수가 입력된다고 나와있기 때문에 애초에 음수 정수 판별이 필요없어서 조건문을 생략해버렸다.



import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;

class Main {
	public static void main(String[] args) throws NumberFormatException, IOException{
		
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		ArrayList<Integer> list = new ArrayList<Integer>();
		
		for (int i = 0; i < 9; i++) {
			list.add(Integer.parseInt(br.readLine()));
		}
		
 		int max = list.get(0);
		
		for (int j = 1; j < list.size(); j++) {
			if(list.get(j) > max)
				max = list.get(j);
		}
		
		System.out.println(max);
		System.out.println(list.indexOf(max) + 1);
		
	}
}
모범답안



메모리 시간
13980 KB 116 ms



ArrayList를 사용했다.