수행일자 : 2021.07.22
https://www.acmicpc.net/problem/2562
문제
- 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 |