해결된 질문
작성
·
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님과 나머지 사람의 비교 조건을 만족하는지 안하는지를 비교하시면 안되고,
각각 비교하면서 최솟값이 어떤 조건으로 세팅되는지를 확인하셔야합니다.
코드의 반복문과 올리신 이해하신 내용 예시 형태로 바꾼다면 아래와 같습니다.
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는 비교하면서 계속 바뀌게 됩니다.
만약 이해하셨던 내용에 대해 아래와 같이 비교를 할 것이면
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값은 변경될 수 있습니다.
와 정말 이거 때문에 계속 고민했었는데 제가 minNumber = numbers[0]에서 계속 정적인 상태에서 고민을 하다가 이런 추론을 하게 되었네요.
numbers[i] < minNumber의 조건을 만족 했을 때 minNumber는 당연히 동적인 상태이고, 다음 반복에서 변경된 minNumber와 비교를 했어야 했는데.. 제가 생각한 방식은 반복문 안에서 계속 minNumber를 정적인 상태로 한 것이 되어 버렸네요. 그렇게 된다면 minNumber = numbers[i]의 식이 아무 의미가 없게 되는 되게 이상한 코딩을 제가 생각을 했었네요.. 이해 시켜주셔서 감사합니다!
늦은 새벽에 답변 달아주셔서 정말 진심으로 감사드립니다 선생님 편안한 밤 되십쇼!!
답변 주셔서 정말 감사드립니다 선생님
그럼 만약에 여기서 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 이라는 수 가 들어가지 않나요? 조건들이 다 참이 되는 것 중에 서로 비교되는 최소 금액 시점이 정확히 어느 부분인지 제가 잘 이해하지 못했습니다.
답변 주셔서 정말 감사합니다.