T.I.L 3rd Week (Python Only)

안희수·2021년 5월 16일
2

TIL

목록 보기
4/26
post-thumbnail

파이썬 스터디 시작에 앞서

프로그래밍은 거기서 거기다 라고 하지만 파이썬은 은근히 전통적인 프로그래밍 문법과는 거리가 있어 전에 프로그래밍을 하다 온 사람은 분명히 처음에는 헷갈린다.

간단한 반복문 조차 괄호 와 중괄호 쓰던 버릇 때문에 왜 안돌아가지 하고 몇번씩 디버깅 했는데

그러한 의미로 본다면 스터디 과정은 본인에게 있어서
코딩 재활 훈련이자 파이썬 개발을 하기 위한 걸음마 과정 이라고 할 수 있겠다.

// 그 전에 쓰던 FOR 반복문
for(int i = 0; i < 6; i ++){
	dosomething();
}

# 파이썬에서 FOR 반복문
for i in range(0,7): # range 끝자리가 6이면 0 ~ 5까지만 돈다
	dosomething() # 세미콜론 없음 && 중괄호로 열고 닫기 없음

금주 개발 로드맵

1. 로또 생성기

1_1. 개발 예상 기간

월요일

1_2. 프로그램 작성 규칙

1. 임의의 난수 [a,b,c,d,e,f] 6개 생성

2. 생성되는 숫자는 1 ~ 45 까지 범위 내 무작위

3. 한번만 출력 되는 것이 아닌 재작동 가능하도록

1_3. 구현 로직 설명

코드로 설명할 수도 있지만 그건 하단에 깃허브 URL 링크를 달아놨으니
굳이 코드를 장황하게 나열하지 않고 최대한 심플하게
어떻게 구현했는지만 설명하려고 한다

본 로또 프로그램 구동 요지는
1. 6개 숫자가 겹치지만 않으면 된다는 것
2. 숫자는 1부터 45까지 정해저 있다는 것

따라서

  • 첫번째
    1부터 45까지 숫자를 가지고 있는 배열과
    숫자가 들어가있지 않은 6개의 배열 2개를 만든다.

  • 두번째
    숫자를 가진 배열 범위 안에서 난수를 생성
    난수에 해당하는 인덱스 위치의 값을 배열에서 제거하고
    없앤 값을 로또 번호 생성 배열에 입력한다.

  • 세번째
    상기 두 행위를 6번 반복하면 1회씩 순회할 때마다
    입력된 값이 배열에서 사라졌기 때문에 배열 크기 내에서
    난수를 생성할 때 마다 중복되지 않고 난수에 해당하는
    인덱스를 가진 새로운 숫자를 가져오게 된다.
    값을 다 삽입하고 난 뒤에는 정렬되지 않은 상태이므로
    6개 값이 입력이 끝나면 정렬 과정을 한번 거쳐준다.

  • 마지막으로
    확인 메시지를 통해 로또 번호를 다시 생성할 것인지 묻고
    만약 다시 생성하겠다고 할 경우 숫자 배열을 초기화 하고
    첫번째 단계에서 실행한 함수를 다시 호출하면 된다.

1_4. 개발 일지

(2021-05-17) 1차 개발 결과
중복되는 값은 없는데 배열 내 숫자를 정렬하는 것을 까먹었다
정렬하는 로직 추가 필요


(2021-05-17) 2차 개발 결과
정렬 전과 정렬 후 결과를 비교하는 기능을 확인하였고
수정내역 반영



2. 빙고 게임

2_1. 개발 예상 기간

월요일 ~ 수요일

2_2. 프로그램 작성 규칙

1. [ 5 X 5 ] 숫자판 생성

2. 트리거 작동 시 임의의 난수 생성

3. 생성되는 숫자는 1 ~ 25 까지이고
한번도 뽑지 않은 숫자면 X 표시하고
뽑았던 숫자가 다시 나오며 따로 마킹함

4. 마킹한 횟수가 3번이 되면
사용자 입력을 받은 어떤 숫자라도 X 표시 가능

5. 빙고 조건은
좌에서 우로 1줄 (5개)
아래에서 위로 1줄 (5개)
아래에서 사선 위로 1줄 (5개) 를
모두 X 표시 했을 경우 1 빙고 성립

6. 총 25개 숫자가 모두 빙고 되면 게임 클리어
( 클리어 되었다는 메시지 출력 하면서 파이썬 프로그램 종료 )

2_3. 구현 로직 설명

빙고 숫자판을 만드는 방식은 2차원 배열을 이용하여
처음에는 1차원씩 배열을 삽입하려 하였으나
1차원 배열에서 reshape 기능을 사용하면 반복문 수행 없이 한번에
1차원 배열을 2차원 배열로 만들 수 있어서 그 방식을 사용하였다.

  • 첫번째
    숫자판에 난수를 생성하는 방법
    1부터 25까지 숫자를 우선 나열하고
    배열의 갯수만큼 반복할 때마다 0~24 사이의 난수를 생성
    반복문이 실행되는 N번째 배열과 난수로 발생한 위치 배열의 숫자를
    서로 교환한다.

  • 두번째
    1부터 25까지 숫자 교환이 끝난 1차원 배열을
    [5] * [5] 의 2차원 배열로 변환한다.


    중복 누적 횟수를 따로 기억하는 변수와
    특정 숫자가 중복되었음을 판단하는
    1부터 25까지의 숫자 배열을 하나 더 생성한다.

  • 세번째
    타이머를 작동한 뒤 타이머가 멈추면
    1부터 25 사이 임의의 난수를 호출한다.


    처음 호출한 숫자인 경우는 숫자 옆에 마킹하여 다음번에
    또 다시 호출되었을 경우 누적횟수에 1을 적산한다.


    누적된 횟수가 3번이 되면 원하는 숫자를 선택할 것인지
    묻고 그러하겠다는 의사를 받으면 입력받은 숫자의 위치를 찾아서
    마킹한 뒤 누적횟수를 다시 0으로 초기화 한다.

  • 마지막으로
    1부터 25까지 모든 숫자의 마킹이 끝나면
    프로그램을 종료한다.

2_4. 개발 일지

(2021-05-18) 1차 개발 결과
빙고 게임 관련 1차적인 기능 구현은 완료하였으나
예외 사항 처리는 아직 보완하지 않았고
실질적인 빙고인 종,횡,사선 방향의 빙고 확인 기능은
구현하지 못하였음


(2021-05-19) 2차 개발 결과
코드 클리닝 작업과 공통적인 변수에 대한 처리
그리고 입력 데이터에 대한 예외 처리 추가하였음
중복된 숫자 내역을 확인 시켜주는 기능 추가


3. Python 3주차 과제 산출물 진척도

월 - 50%_(로또 프로그램은 완성하였음 / 에러 처리는 미비)
화 - 70%_(빙고 프로그램은 완성하였으나 / 종 횡 사선 빙고 처리은 안됨 )
수 - 100%_(빙고 및 로또의 주요 기능 구현 왼료)
목 - 0%_( )
금 - 0%_( )
토 - 0%_( )
일 - 0%_( )


3_1. 프로그램 실제 출력 화면

로또 생성기

빙고 게임

3_2. 프로그램 소스 URL

로또 프로그램
https://github.com/heesu-ahn/python_study/blob/main/lotto.py

빙고 프로그램
https://github.com/heesu-ahn/python_study/blob/main/bingo.py

profile
9년차 소프트웨어 개발자 (2024년 재 개편 예정입니다)

0개의 댓글