211228 배열 예제
9개의 서로 다른 자연수를 입력받아 이 중 최대값을 찾고 그 수가 몇 번째 위치에 있는지 구하기
백준 2562번
1. 설명 및 목표
- 키보드로 배열에 값을 입력한다
- 배열의 값을 서로 비교해 그중 원하는 조건의 값을 출력한다.
2. 이론
배열이란 같은 타입 데이터를 연속된 공간에 저장하는 정적인(정해진) 자료구조로, 변수가 확장된 개념이다.
변수 -> 배열(동일한 자료형만 저장, ex.int a[]는 int형만 저장 가능) -> List(모든 자료형 저장) 순으로 확장할 수 있는데, List에 비해 배열은 처음 선언한 배열의 크기만큼만 값을 받을 수 있기 때문에, 상대적으로 유동적이지 못하다는 점에서 정적이라는 특징을 갖는다.
3. 세부 내용
Scanner sc=new Scanner(System.in);
int[] num=new int[9];
for(int i=0;i<num.length;i++)
num[i]=sc.nextInt();
9개의 수가 입력되어야 하기 때문에 길이 9인 int형 배열을 선언한 뒤 for문을 통해 값을 입력받는다.
int max=num[0], maxnum=0;
for(int i=0;i<num.length;i++) {
if(max<num[i]) {
max=num[i];
maxnum=i+1;
}
}
배열과 비교해 더 큰 값이 들어갈 변수 max를 num[0]로, 몇 번째 수인지를 집어넣을 변수 maxnum을 0으로 초기화시킨다. 그리고 for문 안에 if문을 집어넣어 max값과 배열을 차례로 비교한다. max에는 배열 첫 번째 수가 들어가 있으며, 다른 배열과 비교했을 때 다른 배열 값이 더 크면 그 배열의 값이 max로 들어가고, i는 0부터 시작하기 때문에 maxnum에는 i+1이 들어가게 된다. 그리고 다시 큰 값이 들어간 max와 다음 배열을 비교하는 과정을 거치게 된다.
4. 실행 결과
최대값이 8번째, 3번째 있는 경우 각각 결과가 제대로 출력되었음을 확인하였다.
5. 고찰
우선 처음 마음 가는대로 코드를 짰을 때 출력을 시키려고 하자 System.out.println() 안에 들어간 max와 maxnum에 빨간줄이 그어지고 에러가 났다. The local variable max may not have been initialized. 지역변수 값이 초기화되지 않아 생긴 오류였다. 원래 자기 자신을 포함해 연산을 해야할 때나 값을 초기화시켜야 한다고 생각했는데, 변수의 값이 언제 어떻게 바뀌든 초기값은 무조건 지정해주어야 한다는 것을 새롭게 알게 되었다.
그렇게 max와 maxnum의 초기값을 0으로 지정해두고 코드를 짰는데, 최대값이 8번째에 있는 것은 잘 출력되었지만 3번째 있는 경우엔 제대로 출력되지 않았다. 이에 for문을 통해 값이 어떻게 지정되는지 확인해봤는데 여기서 큰 실수가 있었다. if문에서 비교하는 것을 나란한 두 배열로 배치한 것이었다. if(num[i]>num[i+1])로 두고 큰 값을 max에 넣는 방식을 사용한다면, 3과 29에서 29가 max에 들어가고 29와 85에서 85가, 85와 38에서 85가 max에 들어가지만 이후 38과 12가 비교되어 38이 max에 들어가게 된다. 이는 완전히 잘못된 코드였다. 이에 max의 초기값을 num[0]으로 두고 if(max<num[i])로 수정한 뒤 실행시키니 그제야 제대로 값이 출력되었다.
maxnum가 하나 적게 나오는 사소한 문제도 있었으나, 이는 maxnum에 i를 되돌려주었기 때문에 발생한 오류로, i가 0부터 시작하기 때문에 i+1을 넣어주는 방식으로 간단하게 해결하였다.
머릿속으로 이렇게 하면 되겠구나 단순하게 얼개를 짜고 코드를 짜기 시작하면 이렇게 예상치 못한 오류를 많이 만나게 되는 것 같다. 문제가 처리되는 과정을 차례로 써둔 다음 그 과정에 따라 코드를 짜는 버릇을 들여야겠다고 생각했고, 다음부터는 의식적으로 알고리즘을 미리 구성해둔 뒤 코드를 짜보고자 한다.
6. 전체 코드