본문 바로가기

알고리즘/백준

[2562]최댓값

수행일자 : 2021.07.22


https://www.acmicpc.net/problem/2562

 

2562번: 최댓값

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

www.acmicpc.net


문제

  • 9개의 서로 다른 자연수가 주어질 때, 이들 중 최댓값을 찾고 그 최댓값이 몇 번째 수인지를 구하는 프로그램을 작성하시오.
  • 예를 들어, 서로 다른 9개의 자연수 3, 29, 38, 12, 57, 74, 40, 85, 61 이 주어지면, 이들 중 최댓값은 85이고, 이 값은 8번째 수이다.

입력

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

출력

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

입출력 예제


BufferedReader 와 배열을 사용해서 문제를 풀어보려고 한다.

배열의 수가 9로 정해져있으니 입력받을 변수는 배열에 넣을 9개의 값이면 충분하다.

선언할 변수는 다음과 같다.

  • 9개의 정수를 담을 배열
  • 최댓값을 담을 변수
  • 최댓값이 몇 번쨰에 있는지에 대한 값을 담을 변수

 for문으로 배열에 들어갈 9개의 수를 입력받아 넣어준다.

그 후에 배열에 있는 값과 최댓값(max)을 비교하여 만약 배열에 든 값이 더 크다면 max 변수에 arr 배열의 값을 넣어주도록 코드를 작성한다.

또한 최댓값이 존재하는 위치를 찾기 위해 최댓값을 찾기까지 몇 번의 if문이 작동했는지를 알기 위한 index 에 값을 넣어준다.

index = i + 1 인 이유는 다음과 같다.

  • [ i ] 번째 배열에 들어간 값을 index 에 넣어주면 i 는 인덱스 값이기 때문에 0부터 시작해서 출력하고자 하는 결과값에서 1이 빠지게 된다.
  • 그러므로 1을 추가로 더해서 원하는 결과값을 만들어주는 것이다.

버퍼에 여러 값을 모아두었다가 한번에 출력할 필요 없이, 해당 변수에 입력된 값을 그대로 출력하면 되는 문제이기에 System.out.printIn() 을 사용해서 결과를 출력한다.

 

답안 소스

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

public class Main {

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		int[] arr = new int[9];
		int max = 0;
		int index = 0;
		
		for(int i=0; i<arr.length; i++) {
			arr[i] = Integer.parseInt(br.readLine());
		
			if(arr[i] > max) {
				max = arr[i];
				index = i+1;
			}
		}
		System.out.println(max);
		System.out.println(index);
	}

}

문제 원인파악 및 해결방안

 

이 문제를 풀다가 다음과 같이 여러번의 런타임 에러가 발생했다.

이클립스에서 실행했을 때에는 정상적으로 돌아갔기에 대체 뭐가 문제인지 몰라서 이것저것 확인하다가 드디어 원인을 발견했다.

아래는 가장 초반에 제출했던 코드이다.


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

public class Main {

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		int[] arr = new int[9];
		int max = 0;
		int index = 0;

		StringTokenizer st = new StringTokenizer(br.readLine(), " ");
		
		for(int i=1; i<arr.length; i++) {
			arr[i] = Integer.parseInt(st.nextToken());
		
			if(arr[i] > max) {
				max = arr[i];
				index = i;
			}
		}
		System.out.println(max);
		System.out.println(index);
	}

}

문제는 바로 StringTokenizer 때문이었다.

입출력 예제를 보면 알 수 있듯이, 해당 문제는 입력받을 값들이 한 줄로 이루어진게 아니라 한 숫자씩 여러 줄로 이루어져 있는데, 그걸 생각하지 못하고 StringTokenizer 을 이용해서 입력받을 값을 한 줄로 입력했기 때문이었다.

해당 부분을 지우고, br.readLine()만 사용해서 여러 줄로 입력받으니 해결되었다.

'알고리즘 > 백준' 카테고리의 다른 글

[3052]나머지  (0) 2021.07.27
[2577]숫자의 개수  (0) 2021.07.25
[10818]최소, 최대  (0) 2021.07.21
[1110]더하기 사이클  (0) 2021.07.17
[10951]A+B - 4  (0) 2021.07.11