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

qpdlqg님의 프로필 이미지
qpdlqg

작성한 질문수

김영한의 자바 입문 - 코드로 시작하는 자바 첫걸음

문제와 풀이2

ArrayEx6 minNum, maxnum 질문입니다

해결된 질문

작성

·

295

·

수정됨

1

[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)

[질문 내용]
여기에 질문 내용을 남겨주세요.

package array.ex;

import java.util.Scanner;

public class ArrayEx6 { //입력받을 숫자 개수 입력하고 정수입력한다음 가장작은정수 큰정수 입력 해야됨
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        System.out.print("입력받을 숫자의 개수를 입력하세요.");
        int num = scanner.nextInt();
        System.out.println(num + "개의 정수를 입력하세요: ");
        int[] numbers = new int[num];
        int minNumber, maxNumber;

        for(int i = 0; i < num; i++) {
            numbers[i] = scanner.nextInt();
        }
        minNumber = maxNumber = numbers[0];
        for (int i = 1; i < num; i++) {
            if (numbers[i] < minNumber) {  
                minNumber = numbers[i];
            }
            if (numbers[i] > maxNumber) {
                maxNumber = numbers[i];
            }
        }
        System.out.println("가장 작은 정수" + minNumber);
        System.out.println("가장 큰 정수" + maxNumber);
    }
}

minNumber = maxNumber = number[0]

for (int i = 1; i < num; i++) {

if(numbers[i] < minNumber) {

minNumber = numbers[i]

}

여기 부분에서 minNumber가 왜 최솟값이 되는지 이해가 안됩니다. 예를들어 number[0]에 10이 들어가 있다 쳤을때

minNumber는 10이되고 결국 numbers[i] < 10이 됩니다.

그리고 반복을 돌려서 numbers[1] ~ numbers[num - 1]까지 갔을때, 1 < 10, 2 < 10, 3 < 10 모두다 조건에 만족하여true라고 생각을 하였습니다 그래서 minNumber에도 1이든 2든 3이든 반복문이 돌아가다 마지막 숫자가 true 였을 때 minNumber에 들어갈 것이라고 생각을 했습니다. 근데 판별을 할 때 제가 모르는 어떠한 기능이 있는 건지 아니면 제가 반복문을 잘못 생각하고 있었던 건지 왜 최솟값이 나오는지 전혀 모르겠습니다. 또한 정수를 입력 했을 때 같은 숫자를 입력하면 조건식 이 false인데도 출력이 되는 것이 의아했습니다. 어떠한 조건으로 인해 출력이 되고 그러한 결과가 나오는 건지 여쭤보고 싶습니다 선생님.

답변 1

1

안녕하세요. qpdlqg님, 공식 서포터즈 OMG입니다.

minNumber = maxNumber = number[0]
for (int i = 1; i < num; i++) {
  if(numbers[i] < minNumber) {
    minNumber = numbers[i]
}

위 코드를 이해하기 위해 다음과 같은 예시를 들어볼게요.

 

  • 돈을 가장 적게 보유한 사람을 찾는 상황입니다.

    • 사람 목록 순서

      • [qpdlqg님, OMG, 영한님, IU] 이 순서로 줄 지어 있습니다.

    • 보유 금액

      • [qpdlqg님: 2,000원, OMG:1,000원, 영한님:3,000원, IU:3,500원]

 

  • 누가 가장 돈을 적게 보유한지 모르고, 각 사람들의 돈을 한명씩 비교하여 가장 적은 사람을 찾습니다.(=for문)

 

  • 일단 비교 대상이 필요하기에 가장 첫번째 순서인 qpdlqg님이 돈을 가장 적게 가지고, 많이 가지고 있다고 가정합니다. minNumber = maxNumber = number[0] = 2,000원

 

  • 한명씩 비교해야 하고, 가장 적게 가지고 있다고 가정한 qpdlqg님 다음 순서인 저부터 비교를 시작하면 될 것 같습니다. 그러면서 전체 순번까지를 비교하려 합니다.for (int i = 1; i < num; i++)

    • i=0부터 시작하지 않고 1부터 시작하는 이유

 

  • 다음 순서인 저와 비교를 해야하기 때문에 다음 순번의 사람과 비교를 시작합니다.

    • if(numbers[i] < minNumber)

  • 제가 보유한 금액이 더 적기 때문에 (1,000원 < 2,000원) minNumber는 제 보유 금액이 1,000원이 됩니다.

  • 여기서 순번이 만약 영한님과 제가 바뀌었다면 3,000원 < 2,000원으로 조건을 만족하지 못하였을 것이고, 다음 반복문이 실행될 때 변경이 되었을 것입니다.

     

    • [qpdlqg님: 2,000원, 영한님:3,000원, OMG:1,000원, IU:3,500원]

    • qpdlqg님의 2,000원 영한님의 3,000원의 최소 금액 비교 조건문을 만족하지 못했고 다음 반복문에서 2,000원과 1,000원의 비교가 진행되고 최소금액이 이 시점에서 바뀝니다.

 

이 상황을 사례로 이해가 안되는 부분이 있다면 추가로 댓글 남겨주세요.

감사합니다.

qpdlqg님의 프로필 이미지
qpdlqg
질문자

답변 주셔서 정말 감사드립니다 선생님

그럼 만약에 여기서 numbers[i]에 들어가 있는 배열 제가 입력 했을 때를 가정을 합니다.

  • [qpdlqg님: 2,000원, 영님:3,000원, OMG:1,000원, IU:3,500원, inflearn:1,500원]

순서대로 numbers[0] = qpdlqg

numbers[1] = 영님

..... numbers[4] = inflearn

까지라 가정을 하였을 때,

numbers[0]

numbers[1]영님 (3000) < qpdlqg(2000) - 조건 만족 x

numbers[2]OMG (1000) < qpdlqg(2000) - 조건 만족 o

numbers[3]IU (3500) < qpdlqg(2000) - 조건 만족 x

numbers[4]inflearn (1500) < qpdlqg(2000) 조건 만족 o

 

조건을 만족한 부분은 numbers에 있는 [2],[4]입니다. 여기서 조건을 만족하지 않은 [1], [3]은 조건이 되지 않았기 때문에 numbers[i]가 minNumber로 들어가지 않았을 것 입니다.

 

그럼 이제 조건이 만족 하는 부분을 따져 봤을 때, 1000[2]과 1500[4]은 먼저 1000 < 2000을 먼저 조건식에 만족하여, minNumber 변수에 1000이 들어가게 되었습니다. 그다음 1500 < 2000 이라는 조건식을 만족하여 minNumber는 결국에 1500 이라는 수 가 들어가지 않나요? 조건들이 다 참이 되는 것 중에 서로 비교되는 최소 금액 시점이 정확히 어느 부분인지 제가 잘 이해하지 못했습니다.

답변 주셔서 정말 감사합니다.

 

 

 

생각하고 계신 비교 방법 중 잘못 체크하고 있는 부분을 알 것 같네요.

qpdlqg님과 나머지 사람의 비교 조건을 만족하는지 안하는지를 비교하시면 안되고,

각각 비교하면서 최솟값이 어떤 조건으로 세팅되는지를 확인하셔야합니다.


코드의 반복문과 올리신 이해하신 내용 예시 형태로 바꾼다면 아래와 같습니다.

for (int i = 1; i < num; i++) {
  if(numbers[i] < minNumber) {
    minNumber = numbers[i]
}

코드를 잘 보시면 if (numbers[i] 는 최솟값 보다 작은가?) 가 비교로직입니다.

( if (numbers[i] < minNumber) )

따라서 다음과 같이 비교를 해야합니다.


numbers[1]영한님 (3000) < 최솟값(2,000) - 최솟값 (2,000원 보존)

numbers[2]OMG (1000) < 최솟값(2,000) - 최솟값 (1,000원 변경)

numbers[3]IU (3500) < 최솟값(1,000) - 최솟값 (1,000원 보존)

numbers[4]inflearn (1500) < 최솟값(1,000) - 최솟값 (1,000원 보존)

최솟값을 갖는 minNumber는 비교하면서 계속 바뀌게 됩니다.

 

만약 이해하셨던 내용에 대해 아래와 같이 비교를 할 것이면

image

if (numbers[i] < numbers[0])이 맞는비교 입니다.

 

반복문까지는 이해하신 것 같고, 조건을 만족할 때 값이 변경되는 것은 이해하신 것 같지만

if문의 비교대상을 잘못 짚으셔서 헷갈리신 것 같아요.

 

이 부분을 다시한번 생각해보시고 이해가 되지 않을 경우 댓글 남겨주세요

조건을 만족한 부분은 numbers에 있는 [2],[4]입니다. 여기서 조건을 만족하지 않은 [1], [3]은 조건이 되지 않았기 때문에 minNumber로 들어가지 않았을 것 입니다.

 

=>

minNumber가 들어가는 것은 [2] 한번 입니다.

[4]는 제가 minNumber가 먼저 세팅되고 나서

numbers[4] inflearn(1,500) < minNumber(OMG의 1,000원)

이렇게 비교가 될 것이기에 [1][3][4]가 만족하지 않게 되는 것입니다.

-

반복문이 실행되면서 비교하는 minNumber값은 변경될 수 있습니다.

 

 

qpdlqg님의 프로필 이미지
qpdlqg
질문자

와 정말 이거 때문에 계속 고민했었는데 제가 minNumber = numbers[0]에서 계속 정적인 상태에서 고민을 하다가 이런 추론을 하게 되었네요.

numbers[i] < minNumber의 조건을 만족 했을 때 minNumber는 당연히 동적인 상태이고, 다음 반복에서 변경된 minNumber와 비교를 했어야 했는데.. 제가 생각한 방식은 반복문 안에서 계속 minNumber를 정적인 상태로 한 것이 되어 버렸네요. 그렇게 된다면 minNumber = numbers[i]의 식이 아무 의미가 없게 되는 되게 이상한 코딩을 제가 생각을 했었네요.. 이해 시켜주셔서 감사합니다!

 

늦은 새벽에 답변 달아주셔서 정말 진심으로 감사드립니다 선생님 편안한 밤 되십쇼!!

강의 수강 중 궁금한 사항은 언제든 질문 남겨주세요 😀

qpdlqg님의 프로필 이미지
qpdlqg
질문자

넵! 감사합니다~~!

qpdlqg님의 프로필 이미지
qpdlqg

작성한 질문수

질문하기