강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

궁콘이님의 프로필 이미지
궁콘이

작성한 질문수

자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비

2. 보이는 학생

선생님 왜 오답인지 이해가 안갑니다..

작성

·

97

0

삭제된 글입니다

답변 1

0

맨 앞 줄 0번 인덱스는 선생님이 아니라 학생이에요!

저렇게 비교한다면, 마지막 비교시 배열의 범위를 초과하게 

ArrayIndexOutOfBoundsException

되니 런타임 에러가 발생하겠네요!

궁콘이님의 프로필 이미지
궁콘이
질문자

배열범위를 초과하지 못하도록 처음 입력받은 str에 str+" 0" 이렇게

마지막 0은 가장 작은 수로 무조건 제외되니까 공백과 0을 추가해줬습니다..

그리고 에러는 Runtime Error가 발생하네요ㅠㅠ

서로 비교하게 된다면,  만약 서로 비교할 당시 자기 자신과 바로 뒤 학생이 크다고 cnt++을 해버리면, 만약 바로 뒤 학생보다 앞에 있는 학생들중 키가 더 큰 학생이 있다면, 논리적 오류가 될 수 있겠죠!

웬만하면 nextLine()을 쓰시지 않는 것을 추천 드려요! nextInt()로 받고, 

nextLine()은 웬만하면 문자열 받을 때만 쓰시길 추천드려요.

똑같은 로직으로 밑 코드로 바꾸었을 때, 오답은 동일합니다.

import java.util.Scanner;
  
public class Main {
    static void Solution(int num, int[] students){
      	students[num] = 0;
        int cnt = 1;
        for (int i = 1; i < num; i++) {
            if(students[i] < students[i+1]){
                cnt++;
            }
        }
        System.out.println(cnt);

    }

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        int num = sc.nextInt();
      	int[] students = new int[num + 1];
      	for (int i = 0; i < num; i++){
        	students[i] = sc.nextInt();	
        }
        Solution(num,students);

    }
}
궁콘이님의 프로필 이미지
궁콘이
질문자

감사합니다! 

nextLine은 왠만하면 사용 않도록 하겠습니다ㅠㅠ

근데 설명해주신 위의 로직에서 제가 사용한 방식을 적용시키려면

처음 int배열 생성시 num+1을 크기를 할당받아 num+1의 인덱스에 "0"이라는 값을 넣어 주어야 합니다.

반목문에서의 ArrayIndexOutOfBoundException방지를 위한 더미값을 넣어주려함인데..

반목문은 num크기 만큼 돌리고 num+1의 값은 마지막값의 예외 방지를 위한 "0"이라는 값이 들어있습니다.

students[num+1] = 0;

즉 이렇게 사용하기 위함 이었습니다.

제 로직은 처음 입력값 str자체에 +" 0"으로 받아서 split으로 배열을 만들어 마지막 인덱스값에 "0'을 넣어 배열 생성시 처음부터 반복문안에서의 ArrayIndexOutOfBoundException을 방지하기위해 추가하여 만든 경우입니다..

아물론 이렇게 해도 마찬가지로 RuntimeError가 발생합니다.. 

원인을 모르겠네여 ㅠㅠ 제가 이해를 잘 못한 건지..  죄송합니다!!!

num은, 학생 수라고 생각했을 때, 만약 학생수가 6이라면

int[]의 길이는 6으로 초기화 될테고, 0, 1, 2, 3, 4, 5 인덱스가 존재하겠죠.

그래서 num +  1로 초기화 하면 길이가 7이 되겠고, num은 6이니 0, 1, 2, 3, 4, 5, 6 까지 생성된 배열의 마지막 부분에 0을 넣을 수 있겠습니다.

궁콘이님의 프로필 이미지
궁콘이
질문자

말씀하신데로 학생이 6명이면 학생수대로 배열을 선언하고 초기화 하겠지만 ㅜㅜ  저는 처음 배열 선언시 num+1로 할당한 이유가 계속 말씀드린데 for문안에서 학생배열[i] < 학생배열[i+1] 로직의 조건에  배열ArrayIndexOutOfBoundException 방지하기 위해서 길이7로 초기화해서 마지막값 0을 추가한거에요. 마지막 학생도 비교를 하기 위해서요.

제가 문제 이해를 못한것 같네여.. 질문한 부분은 그게아니라서ㅠㅠ

결과적으로 제가 만든게 정답이 아닌것 같아서 그냥 선생님 설명대로 공부하려구요!

감사합니다ㅠㅠㅜㅜㅜㅜㅜ

궁콘이님의 프로필 이미지
궁콘이

작성한 질문수

질문하기