본문 바로가기

알고리즘/백준알고리즘

[백준알고리즘-JAVA]10818번, 2562번 풀이(최대, 최소 / 최댓값)

안녕하세요

인포돈 입니다.


백준 알고리즘 10818번, 2562번 풀이입니다. 


* 참고사항
 - 개발환경은 eclipse을 기준으로 작성되었습니다.
 - java언어를 이용하여 문제를 풀이합니다.
 - 알고리즘 문제는 풀이를 보고 해답을 찾는 것도 중요하지만 무엇보다 스스로 풀이를 시도해봐야 합니다!!
(해당 풀이를 보기 전 충분히 문제에 대해 고민해봐야 합니다!)
 - 해당 풀이 말고도 수많은 풀이 방법이 존재합니다.

 


백준 10818번 (최댓값)

 

문제

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

 

입력

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

 

출력

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

 

입력 예시

5
20 10 35 30 7

출력 예시

7 35

성공코드

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

			try {
				int num = Integer.parseInt(br.readLine());
				Integer[] minmax = new Integer[num];
								
				String str = br.readLine();
				String[] sarray = str.split(" ");
				
				
				for(int i = 0; i < num ; i ++) {
					minmax[i] = Integer.parseInt(sarray[i]);
				}
				
				int min=minmax[0];
				int max =minmax[0];
				
				for(int j = 1 ; j < num ; j++) {
					if(minmax[j] < min) {
						min = minmax[j];
					}
					if(max <minmax[j]) {
						max = minmax[j];
					}
				}
				
				br.close();
				
				System.out.println(min + " " + max);
				
			} catch (Exception e) {
				e.printStackTrace();
			} 
			
			}//main
		}

 

해당 코드는 크게 어려울 것이 없는 코드였다. 배열을 이용하여 입력을 통해 받은 문자열을 배열에 넣어주어 최대와 최소의 값을 넣어서 출력해주었다. 해당 코드에서 주의할 점은 배열의 인덱스이다. 

 

배열의 인덱스는 0에서부터 시작하는 것에 주의하여 반복문은 적절히 이용하여 최대 최소의 값을 구할 수 있다.

 

해당 코드에서는 이제 더 빠른 시간에 값을 출력하는 것에 중점을 두어 생각해볼 필요가 있다.

 

최대한 줄일 수 있는 중복을 줄이고 split대신 StringTokenizer을 사용한다던가, System보다는 StringBuilder나 Bufferedwriter을 사용한다던가 하는 방법으로 해당 코드 시간을 더욱 단출시킬 수 있을 것 같다.

 


백준 2562번 (최댓값)

 

문제

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

 

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

 

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

 

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

 

 

입력

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

 

 

출력

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

 

 

입력 예시

3
29
38
12
57
74
40
85
61

출력 예시

85
8

성공코드

import java.io.BufferedReader;
import java.io.InputStreamReader;


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

			try {
				Integer[] num = new Integer[9];
				int max=0;
				int index=0;
				
				for(int i =0; i<num.length;i++) {
					num[i]=Integer.parseInt(br.readLine());
				}
				
				for(int i=0; i<num.length;i++) {
					if(max < num[i]) {
						max = num[i];
						index = i+1;
					}
				}
				
				System.out.println(max + "\n" + index);
				
			} catch (Exception e) {
				e.printStackTrace();
			} 
			
			}//main
		}

 

해당 코드도 어려울게 크게 없는 코드이다. 해당 코드에서는 문제와 입력을 자세히 보면 된다. 입력은 한 줄씩 읽어 총 9개의 문자를 읽는다. 그런데 출력은 인덱스 그대로 하는 것이 아니라 몇 번째 인지를 묻는 문제임으로 +1을 생략하면 안 된다. 이문제는 인덱스의 이해를 잘하고 있는지에 대해 묻고 있는 문제이다.

 

해당 문제에서 또한 더 빠른 속도로 나아가는 방법을 고심해볼 필요가 있다. 해당 문제 또한 StringTokenizer을 이용한다던가 StringBuilder를 통해 속도를 조금 더 감소시킬 수 있을 것 같다.

 

여태 여러 문제를 풀어오면서 문자열을 가공할 때는 StringTokenizer 또는 StringBuilder를 통해서 가공하는 것이 좀 더 빠른 속도를 자랑하는 것을 알 수 있다.