항해 99 온보딩 커리큘럼

[Java언어기초 1주차] 어느날 갑자기 글이 안 올라오면 당첨된 겁니다. [배열]

디스타입 2023. 3. 10. 01:02

2023/3/9일 목요일 흐림🌥️

 

학습 진행 및 완료 상황

  • Chapter 5 배열
  • Java 문법 뽀개기 1주차 배열(복습)

학습 중 발생한 이슈 / 고민 또는 이를 해결한 내용

 

배열의 첫 인상은 내가 어릴때 처음 만들어본 카레와 같았다.

잘 아는 맛이고, 분명 백종원 선생님이 넣으라는거 다 넣었는데 맛이 다르더란 말이지..

 

 

그래도 꿋꿋이 그럴싸하게 만들어 한입 먹어보니 Error... // 이땐 할 것도 많고 솔직히 귀찮고 재미없었다. 하기싫어..

코딩 공부를 시작한지 어느덧 4일째..

공부에 집중도 안되고,, 컴퓨터 앞에 앉아는 있지만 멍~ 하게 시간만 보내고 있는 나를 발견했다.

이렇게 시간을 보내면 안된다. 비전공자에 가진 것 하나 없는 나는 이 귀한 시간을 아무 의미 없이 흘려보내면 안된다.

흥미를 잃지 않고 재밌게 공부할 수 있는 나만의 방식을 찾아보자.

우선 배열로 할 수 있는 재밌는게 뭐가 있을까,,,

 

 

⌜chapter 5 - 11 배열의 활용(4) - 로또 번호 만들기⌟                                찾았다.

 

 

우선, 난 아직 랜덤 값을 얻는 방법을 모르기에 책의 예제를 참고했다.

 

public static void main(String[] args) {

    int[] ball = new int[45]; //45개의 정수값을 저장하기 위한 배열 생성

    for (int i = 0; i < ball.length; i++)
        ball[i] = i + 1; //ball[0]에 1이 저장된다

        int tmp = 0; // 두 값을 바꾸는데 사용할 임시변수
        int j = 0; //임의의 값을 얻어서 저장할 변수

        //배열의 i번째 요소와 임의의 요소에 저장된 값을 서로 바꿔서 값을 섞는다
        // 0번째부터 5번째 요소까지 모두 6개만 바꾼다
        for (int i = 0; i < 6; i++) {
            j = (int) (Math.random() * 45); // 0~44범위의 임의의 값을 얻는다
            tmp     = ball[i];
            ball[i] = ball[j]; // ball[i] 와 [j]의 값을 서로 바꾼다
            ball[j] = tmp;
        }

        // 배열 ball의 앞에서부터 6개의 요소를 출력한다
        for (int i = 0; i < 6; i++)
            System.out.printf("ball[%d]=%d%n", i, ball[i]);
    }

 

음... 딱 내가 배운 수준에서 for문을 활용해 이해하기 쉽게 작성되어 있었다.

하지만, 이 방식은 말하자면 마치 1 부터 45 까지의 카드를 잘 섞은 다음 맨 위의 카드 6 장을 꺼내는 것과 같지 않은가

효율적이라 할 수 있겠지만 나는 실제 로또 추첨을 하듯이

for문에 배열 ball[45]를 집어 넣고 한번 돌아갈때마다 하나씩! 공을 뽑고 싶었다.

 

예제를 통해 랜덤으로 값을 얻는 방법은 구했지만,

💡문제는 i++ 이후 ((Math.random() * 45) 에서 중복되는 값이 나올 경우였다.

 

잡힐 듯.. 안 잡힐 듯.. 간질간질

 

if문 노가다도 해보고 (5개 사용하니 되긴하더라!) 배열도 여러개 생성해보고

손만 뻗으면 잡힐 것 같은 간질간질한 기분에 검색 한번 안해보고 혼자 끙끙 앓다가 조원들이랑 내용을 공유했다.

너무나 고마운 우리 조원들, 마치 자기 문제처럼 같이 고민해주고 아이디어도 주고

(실제로 이때 나온 아이디어가 해결에 큰 도움이 되었다)

이웃 조 에이스들도 불러와서 의견을 나눴다. 이때부터 코딩이 미치도록 재밌어지기 시작했다.

 

결국 기술 매니저님의 이니에스타 환상 어시스트로 해결할 수 있었다. 

public static void main(String[] args) {

    int[] lotto45 = new int[6]; //인생을 바꿔 줄 번호가 들어갈 배열
    boolean[] visit = new boolean[45]; //boolean타입 배열의 초기값은 False로 들어간다
    int index = 0; //로또배열 안에 값을 넣어주는 순서

    while(index < 6){
        int num = (int) (Math.random() * 44); // 공을 뽑는다!
        if (!visit[num]) { //visit[num]값이 flase일때 입장
            lotto45[index] = num + 1; //random 값은 0~44(45개)중 1개가 나오므로 1을 더해 주었다
            index++;
            visit[num] = true; // visit[num] 값을 true로 바꿔 중복을 방지한다
        }
    }

    for (int i = 0; i < 6; i++) {
        System.out.println(String.format("%s번째 공은 %s 입니다.", i+1, lotto45[i]));
    }
}

 

사실 엄밀히 말하자면 이 방법도 일단 먼저 뽑고! 중복된 값이 나올 경우 다시 뽑는 방식이긴 하지만

문제를 떠올리고, 고민하고, 해결하는 과정에서 코딩에 재미를 느꼈고

아직은 부족하지만 언젠가는 확실하게 해결할 수 있겠다는 자신감을 얻을 수 있었다.

 

놀랍게도 이후에 잘 이해가 안가던 2차원 배열을 사용해 연금복권번호 생성 코드도 쉽게 만들 수 있었다!!

 

이건 아직 해결 못 한 Github에 올려보겠다.

 

오늘 새로 배운 내용

 

잘 모르겠을 땐 ⌘(command/con_win) + ⌥(option/art_win) + v 를 눌러라!! 인텔리제이님께서 답을 알려주실 것이다.

 

 

오늘의 한줄

 

이미 본문에 충분히 많이 썼기 때문에 오늘 코딩 결과물로 나온 번호 1 세트를 공유하는 걸로 대체하겠다.

 

1번째 공은 ㊴ 입니다. 
2번째 공은 ㉚ 입니다.
3번째 공은 ㉔ 입니다.
4번째 공은 ⑬ 입니다.
5번째 공은 ⑰ 입니다.
6번째 공은 ⑮ 입니다.

 

God bless you