inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

김영한의 실전 자바 - 중급 1편

java중급 4강 레퍼클래스 로또 번호 생성기 문제

103

정현

작성한 질문수 4

0

4강 레퍼클래스 로또 번호 생성기 질문 있습니다.

 

package class04wrapperClass;
import java.util.Random;

public class Lottery {
    public static void main(String args[]) {
        //랜덤 생성자 선언 ==> 로또 값이 그때 그때 바뀜
        Random random = new Random();

        //로또 범위 지정 배열
        int[] randomArray = new int[6];
        

        //로또 배열에 로또 값 넣기
        for (int i = 0; i < randomArray.length; i++) {
            int randomValue=random.nextInt(45)+1;
            randomArray[i]=randomValue;
            if (randomArray[i]==randomArray[i++]||randomArray[i]==0)
                randomArray[i]=random.nextInt(45)+1;
        }

        for(int i =0; i<randomArray.length; i++){
            System.out.print(randomArray[i]+" , ");
        }

            }
}

이렇게 풀었는데 이것도 올바른 풀이 일까요???

java 객체지향

답변 1

0

OMG

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

올리신 코드의 경우, 중복 값을 제대로 걸러내지 못합니다.

사례)

image.png

 

설명드리기 위해 코드 정리를 하면

int randomValue=random.nextInt(45)+1;

randomArray[i]=randomValue;

randomValue는 배열에 값을 할당하기 위해 사용하고 그 외에는 사용하지 않으므로 불필요(=코드를 이해하기 위해 도움이 되지 않음) 하여 동일한 동작을 하지만, 아래처럼 별도 변수를 사용하지 않겠습니다.

for (int i = 0; i < randomArray.length; i++) {
    randomArray[i]= random.nextInt(45)+1;
    if (randomArray[i]==randomArray[i++] || randomArray[i]==0)
        randomArray[i]=random.nextInt(45)+1;
}

그리고 난수 생성을 random.nextInt(45)+1;

이렇게 1~45가 나오도록 했기 때문에 다음 if 조건문은 불필요(=항상 거짓)하여 제거하겠습니다. randomArray[i]==0

for (int i = 0; i < randomArray.length; i++) {
    randomArray[i]= random.nextInt(45)+1;
    if (randomArray[i]==randomArray[i++])
        randomArray[i]=random.nextInt(45)+1;
}

 

그럼 위 코드가 어떤 동작을 하는지 설명드리면,

if 비교문에서 i++문은 후위 증가이므로 == 비교를 할 시점에는

if (randomArray[i]==randomArray[i]) // 항상 참. i가 0일 때(처음 반복문 시작이라 가정)

이렇게 항상 참인 비교 결과를 갖고 비교 연산을 합니다. 그리고 후위증가로 인해 i값은 1이 증가하게 됩니다.

그 상태에서 다음 연산이 실행됩니다.

randomArray[i]=random.nextInt(45)+1; // i는 1이 되고 i가 1인 배열의 값에 난수 생성

무조건 참인 조건문으로 인해 첫번째 반복문이 실행될 시점에 i가 0, 1일 때의 난수가 생성됩니다.

for (int i = 0; i < randomArray.length; i++) {
    randomArray[i]= random.nextInt(45)+1; // i가 0일 때 난수가 한번 생성되고
    if (randomArray[i]==randomArray[i++])
        randomArray[i]=random.nextInt(45)+1; // 비교 연산으로 i가 1이 반드시 되고 난수가 생성됨
}

올리신 코드를 정리하면 반복문은 배열의 길이의 절반만 실행되는 코드와 같고, 중복 체크는 없는 코드라고 볼 수 있습니다. 아래와 같은 동작을 한다고 봐도 무방하다고 볼 수 있습니다.

for (int i = 0; i < randomArray.length; i++) {
    randomArray[i]= random.nextInt(45)+1;
    i++;
    randomArray[i]=random.nextInt(45)+1;
}

코드가 어떤 동작을 하는지 정리하여 설명드렸으니 보완해보셨으면 좋겠습니다 😀

감사합니다.

문제와 풀이

0

23

1

섹션 2 퀴즈 9번

0

32

2

강의노트 내용이 이해가 되지 않아서 문의드립니다.

0

47

1

중급1편, 래퍼클래스 문제와풀이2 로또제너레이터 질문

0

67

1

setVlaue질문

0

93

3

안녕하세요 코딩테스트와 병행하고 싶어서 질문드립니다.

0

93

1

findValue의 파라메터까지 래퍼클래스 배열인 이유가 있을까요?

0

74

1

아래 글처럼 toString() 강의부터 화면이 안보여요

0

99

2

TemporalAdjusters의 lastDayOfNextMonth(), lastDayOfNextYear() 메서드 지원 안함

0

84

2

오타 제보도 되나요?

0

90

2

지역 클래스 예제3 지역변수 질문

0

69

2

래퍼클래스 박싱 출력

0

60

1

자바 equals() 메소드에 대한 물리적 동일성, 논리적 동등성 질문

0

105

3

강의록 오타 제보

0

69

2

자바의 기본 클래스들에 관하여

0

70

1

실무에서 중첩(내부) 클래스 사용하나요?

0

79

1

지역 클래스 - 지역 변수 캡처3

0

55

1

12:30 의 newClassGrade 질문이 있습니다.

0

57

1

날짜와 시간 문제풀이가 막히는데

0

100

2

내부 클래스의 바깥 클래스 참조

0

68

1

스트링 풀, new String()

0

105

3

정적 중첩 클래스 사용 이유

0

97

1

status.getCode() 대신 status.code 사용

1

81

1

메서드의 지역변수명과 내부클래스의 멤버메서드에서의 지역변수명의 중복관련

0

75

1