• [C++] 로또 번호 생성기 코드, 랜덤한 중복하지 않은 숫자 생성.

    2023. 9. 15.

    by. KAEY


     

    ✨ INTRO 

    랜덤한 난수 생성에 대한 실습에 빠지지 않는 일확천금의 로또 번호 생성.

    로또 1등이 당첨된다면...... 😎 정말 좋겠지..만..

     

     

    아무튼, 모던한 방식도 있고 여러 방법이 있겠지만 

    내가 생각한 논리로도 구현이 가능한지 한 번 시도를 해보고 싶었고.

    의미가 없지는 않았지만 이것이 효율적이라고 판단하기는 어려움.

    최소가 6번의 반복이면 끝날 수 있기 때문에, 그 이상의 반복 횟수가 나오기 때문이지만..

    또한 답지를 보고 수학 문제를 풀면 그땐 내가 이해가 가더라도, 나중가면 햇갈릴 수 있기도 하고...

    무엇보다 내가 생각한 대로 코드를 짜고 풀어보는게 재밌으니까 한 번 가보자잇 😎

     

     

     


    나의 코드 흐름 구조

     

     º 로또 이므로 벡터의 크기는 6으로 한다.

     º 랜덤한 수를 벡터의 뒤에 넣는다.

     º 오름차 순 정렬을 시행하고,  unique() 를 이용하여 중복 값을 제거한다.

     º 만약 벡터의 크기가 6이 아니라면, 중복 값이 제거되었다고 판단한다.

     º 올바르게 반복문이 종료되면 중복 값이 없는 로또 번호가 오름차순으로 정렬된다.

     

     


    소스코드 리뷰

    while (lotto.size() < 6) { //로또의 크기가 6이 될 때까지.		
    		int num = rand() % 45 + 1; // 범위를 한정하고 싶다면 나머지 이용하기			
    		lotto.push_back(num);
    					
    		sort(lotto.begin(), lotto.end()); //정렬하고 			
    		lotto.erase(unique(lotto.begin(), lotto.end()), lotto.end()); //중복값제거
    
    	}

    코드를 구상할 땐 논리 정연하고 장왕했으나, 막상 코드로 작성하면 몇 줄 안되서..

    그렇다고 해서 코드가 적다고 그것이 안 좋은 코드라고 생각하고 싶지는 않다.

    오히려 짧고 이해하기 쉽게 써진 코드가 내가 생각하기엔 좋은 코드 같아서..

     

     

    (의문) 근데 지금 생각해보면, 정렬하고 중복값 제거하는 과정을 매 번 하는 것보다는 

    벡터의 사이즈가 5나 6이 되었을 때, 시행하는 것이 좋지 않을까? 🤔

     

     

    또한 시간 복잡도를 고려해봤을 때, sort를 하는 부분은 시간 복잡도가 대략적으로 O(n log n) 이다.

    로또라는 적은 수의 값을 추출하는 과정이기에 많은 복잡도가 걸리지는 않지만...

    다른 인터넷에서 찾아볼 수 있는 코드들에서 상수 시간의 복잡도를 요구하는 과정과 비교하면

    효율적이라고는 보기 어렵긴 하겠다.

     

     

    그럼에도 내가 생각했던 코드 흐름이 원하는 결과를 생성해내는 것에 성공했다는 것이

    이 삭막한 코드 작성에서의 한 줄기 즐거움이니까. 😊

     

     


    기존 코드 참고 >

     

    깃 허브 링크 ( 클릭시 새 창에서 열립니다. )

     

     


    🎉해당 글의 내용은 "포스코 x 코딩온 스마트 팩토리 과정 수업" 에서의 수업 자료 및 실습 과제 등에서 일부 발췌되어 작성 되었습니다.


    댓글 (비로그인 댓글 허용하지 않습니다.)