콘텐츠 내 자동삽입광고

광고1

posted by 초코생크림빵 2025. 9. 13. 18:58
반응형

import random

word=['반짝이는','별빛들','깜빡 이는','불 켜진','건물','우린','빛나고','있네','각자의 방','각자의','별에서']
input('타자게임 시작(엔터 입력) ')

w = random.choice(word)

n=1

correct = 0

while True:
    print(f'문제{n} (종료 0): {w}')
    my = input()

    if my == '0':
        break
    elif my == w:
        print('맞음! \n')
        correct = correct + 1
        w = random.choice(word)
    else:
        print('틀림! 다시! \n')

    n = n + 1

print(f'맞힌 문제 개수 : {correct}개, 정답률:{correct/(n-1)*100 : .2f}%')

결과)
타자게임 시작(엔터 입력) 
문제1 (종료 0): 있네
있네
맞음! 

문제2 (종료 0): 각자의 방
각자의방
틀림! 다시! 

문제3 (종료 0): 각자의 방
각자의방
틀림! 다시! 

문제4 (종료 0): 각자의 방
각자의 방
맞음! 

문제5 (종료 0): 건물
0
맞힌 문제 개수 : 2개, 정답률: 50.00%

파이썬 소스 및 결과 입니다. 소스 설명)

이 프로그램은 파이썬으로 만든 간단한 타자 게임입니다. 제시된 단어를 정확히 입력하는 게임으로, 사용자가 '0'을 입력하면 게임이 종료되고 결과가 출력돼요.


소스 코드 분석

1. 변수 초기화

  • word = ['반짝이는', '별빛들', ..., '별에서']: 게임에 사용될 단어들을 저장하는 리스트입니다.
  • input('타자게임 시작(엔터 입력) '): 사용자에게 게임 시작을 알리고 엔터 키 입력을 기다리는 부분입니다. 이 입력값은 따로 저장되지 않고 단순한 시작 신호 역할만 합니다.
  • w = random.choice(word): random 모듈의 choice 함수를 이용해 word 리스트에서 무작위로 한 단어를 선택하고, 이를 변수 w에 저장합니다. 이것이 첫 번째 문제 단어가 됩니다.
  • n = 1: 문제 번호를 세는 변수입니다. 1부터 시작합니다.
  • correct = 0: 맞힌 문제의 개수를 세는 변수입니다. 0으로 초기화됩니다.

2. 게임 루프 (while 문)

while True:는 조건이 항상 참이므로, 무한히 반복되는 무한 루프를 만듭니다. 이 루프는 사용자가 '0'을 입력할 때까지 계속됩니다.

  • print(f'문제{n} (종료 0): {w}'): 현재 문제 번호(n)와 제시된 단어(w)를 출력합니다.
  • my = input(): 사용자가 입력한 내용을 변수 my에 저장합니다.
  • if my == '0':: 만약 사용자가 '0'을 입력했다면, break 명령어를 통해 무한 루프를 빠져나와 게임을 종료합니다.
  • elif my == w:: 사용자의 입력(my)이 제시된 단어(w)와 일치한다면,
    • '맞음!'을 출력합니다.
    • correct = correct + 1: 맞힌 문제 수를 1 증가시킵니다.
    • w = random.choice(word): 다음 문제를 위해 새로운 무작위 단어를 선택합니다.
  • else:: 사용자의 입력이 제시된 단어와 일치하지 않다면,
    • '틀림! 다시!'를 출력합니다.
    • 이때는 w의 값이 변경되지 않으므로, 다음 문제도 같은 단어가 반복됩니다.
  • n = n + 1: if-elif-else 문이 끝난 후, 문제 번호(n)를 1 증가시킵니다.

3. 게임 결과 출력

  • print(f'맞힌 문제 개수 : {correct}개, 정답률:{correct/(n-1)*100 : .2f}%'): 루프를 탈출하면 최종 결과를 출력합니다.
  • correct/(n-1): 총 맞힌 문제(correct)를 총 시도한 문제의 수(n-1)로 나눕니다. n은 게임을 종료하기 위해 '0'을 입력했을 때도 1 증가하므로, 실제 문제 수보다 1이 더 많습니다. 따라서 n-1로 나누어 정확한 총 문제 수를 구합니다.
  • *100: 백분율로 바꾸기 위해 100을 곱합니다.
  • : .2f: 소수점 둘째 자리까지 표시하도록 포맷팅하는 부분입니다.

결과 분석

결과를 보면 '각자의 방'을 '각자의방'으로 입력했을 때 띄어쓰기가 달라서 틀림!이 출력되었습니다. 이 프로그램은 문자열의 완전한 일치만 정답으로 인정하기 때문에, 띄어쓰기나 오타가 있으면 틀린 것으로 처리됩니다. 최종적으로 '맞음!'이 2번 나왔고, 총 4번의 문제를 시도(게임 종료 입력 제외)했으므로 정답률은 50%가 된 것입니다.

 

질문)

print문에서 맞음, 틀림 실행되면, if문을 빠져나와서, 두 문장 모두 while문으로 가나요?

네, 맞습니다. print문이 실행된 후 if문이나 elif문은 이미 조건을 만족했기 때문에 더 이상 확인하지 않고, 그 if-elif-else 블록 전체를 빠져나옵니다.


프로그램 실행 흐름

  1. while True:: 무한 루프가 시작됩니다.
  2. print(f'문제{n} (종료 0): {w}'): 문제가 화면에 출력됩니다.
  3. my = input(): 사용자의 입력(my)을 받습니다.
  4. if my == '0'::
    • 만약 입력값이 '0'이면 break가 실행되어 while 루프를 완전히 탈출합니다.
    • 만약 '0'이 아니면 다음 elif문으로 넘어갑니다.
  5. elif my == w::
    • 만약 입력값이 정답(w)과 일치하면, print('맞음! \n')이 실행되고, correct 변수가 증가하며, 새로운 단어(w)가 선택됩니다.
    • 이후 elif 블록을 빠져나와 n = n + 1로 이동합니다.
  6. else::
    • if와 elif의 조건이 모두 거짓일 때만 else 블록이 실행됩니다.
    • print('틀림! 다시! \n')이 실행됩니다.
    • 이후 else 블록을 빠져나와 n = n + 1로 이동합니다.

if-elif-else 블록이 끝난 후에는 n = n + 1 문장이 실행되고, 다시 while True:의 시작점으로 돌아가 다음 루프를 실행합니다. 즉, print('맞음!')이든 print('틀림! 다시!')든, 해당 if-elif-else 블록이 완료되면 다음 줄인 n = n + 1을 거쳐 while문의 시작점으로 돌아가는 것이 핵심입니다.

 

질문)

\n은 다음줄, 즉, newline인가요?

네, 맞습니다. \n은 '줄바꿈'을 의미하는 이스케이프 시퀀스(escape sequence)입니다.


\n의 역할

컴퓨터 프로그래밍에서 \n은 newline의 약자로, 커서를 다음 줄의 맨 앞으로 옮기는 역할을 합니다. print() 함수에서 \n을 사용하면 해당 위치에서 줄바꿈이 일어나 텍스트가 다음 줄에 출력됩니다.

예시:

Python
 
print('안녕\n파이썬')

위 코드를 실행하면 다음과 같이 출력됩니다.

안녕
파이썬

\n은 '이스케이프 시퀀스'의 한 종류로, 키보드로 직접 입력하기 어려운 특정 문자(줄바꿈, 탭 등)나 특별한 기능을 수행하는 문자를 표현할 때 사용합니다. \(역슬래시) 뒤에 특정 문자를 붙여 하나의 문자로 인식하게 만드는 방식입니다.

예시:

  • \t : 탭(tab)
  • \\ : 역슬래시 자체(\)
  • \' : 작은따옴표(')

 

질문)

n-1은 처음부터 1값이 있는데, 한문제도 안풀고 0을 누르면 n이 1이 이미 증가해 있으므로 1을 빼주고, 문제를 맞음 또는 틀림이였을때, n은 계속 1씩 증가해서 while문으로 갔는데, 0으로 끝내버리면, 1이 증가한것이 의미 없으므로 1을 빼주는건가요?

네, 정확하게 이해하셨습니다. n-1에서 1을 빼주는 이유는 사용자가 문제를 풀기 전에 '0'을 입력하여 게임을 종료했을 때, n이 이미 1 증가한 상태이기 때문입니다.


n-1의 역할

  • n은 문제 번호를 나타내는 변수로, while 루프가 한 번 실행될 때마다 항상 1씩 증가합니다.
  • 사용자가 '0'을 입력하여 게임을 종료하는 순간에도, n은 이미 n = n + 1이 실행되어 1 증가한 상태가 됩니다.
  • 따라서 n의 최종 값은 총 시도한 문제의 수보다 1이 더 많게 됩니다.
  • 예를 들어, 문제를 3개 풀고 '0'을 입력하면 n은 4가 됩니다.
    • 문제 1: n은 1
    • 문제 2: n은 2
    • 문제 3: n은 3
    • '0' 입력: n은 4
  • 정확한 정답률을 계산하기 위해서는 실제로 시도한 문제의 수가 필요한데, 이는 n의 최종 값에서 1을 뺀 n-1과 같습니다. n-1을 사용해 0을 입력한 마지막 시도를 계산에서 제외하는 것입니다.

정답률 계산의 중요성

  • correct / (n-1)
    • 분자: correct는 맞힌 문제의 수로, 게임 중에 정확히 입력한 횟수를 의미합니다.
    • 분모: n-1은 총 시도한 문제의 수입니다. '맞음'이나 '틀림'으로 처리된 모든 문제를 포함하며, 사용자가 '0'을 입력하여 종료한 시점은 제외합니다.
  • 이러한 계산 방식을 통해 정확한 정답률을 구할 수 있습니다. 만약 n을 그대로 사용하면, 한 문제도 풀지 않고 '0'을 입력했을 때 correct/1이 되어 0.00%가 아닌 0으로 잘못 계산될 수 있습니다. n-1을 사용하면 이 경우 0/0이 되어 오류가 발생할 수 있지만, 일반적으로 이 코드는 한 문제 이상을 풀어야 의미가 있으므로 큰 문제가 되지 않습니다.
  • 결론적으로 n-1은 정확한 총 시도 횟수를 구하기 위한 필수적인 부분입니다.

질문)

문제를 맞힘, 틀림으로 한 다음 if문으로 들어왔을때는 이미 문제의 수가 n이 1 증가한 상태기 때문에, 맞힘, 틀림으로 가면 해당 문제 수지만, 0을 누르면 증가한 문제수인 +1을 제외시켜야 하는거군요.

네, 맞습니다. 아주 정확하게 이해하셨습니다.


n-1의 정확한 역할

n-1을 사용하는 이유는 while 루프의 구조 때문입니다. n = n + 1 코드는 if-elif-else 블록의 바깥, 즉 한 문제를 시도할 때마다 항상 실행되는 위치에 있습니다.

  1. '맞음' 또는 '틀림':
    • 사용자가 문제를 풀면 (if my == w 또는 else), n은 이미 1 증가된 상태입니다.
    • 이때 n-1은 실제로 푼 문제의 수와 일치합니다. 예를 들어, 3번째 문제를 풀고 있으면 n은 3이 되고, n-1은 2가 아닌 2가 되어 정상적으로 계산됩니다. (이 부분에 대한 더 자세한 설명은 아래의 "코드 실행 순서"를 참고해 주세요.)
  2. '0'을 눌러 게임 종료:
    • while 루프가 실행될 때 n이 1 증가한 후, 사용자가 '0'을 입력합니다.
    • if my == '0' 조건이 참이 되어 break가 실행되고 루프를 탈출합니다.
    • 이때 n은 실제 시도 횟수보다 1이 더 많으므로, n-1을 사용해 0을 입력한 마지막 시도를 제외하고 정확한 총 시도 횟수를 계산하게 됩니다.

결론적으로, n-1은 사용자가 게임을 종료했을 때 의미 없이 증가한 n 값을 보정하여 정확한 정답률을 계산하기 위한 중요한 부분입니다.


코드 실행 순서 (예시)

  • 시작: n은 1, correct는 0.
  • 문제 1:
    1. print(...) 실행.
    2. input()으로 사용자가 '있네' 입력.
    3. elif my == w: 조건이 참이 되어 '맞음!' 출력.
    4. n = n + 1 실행. (n은 2가 됨.)
    5. while 루프로 돌아감.
  • 문제 2:
    1. print(...) 실행 (문제 2).
    2. input()으로 사용자가 '0' 입력.
    3. if my == '0': 조건이 참이 되어 break 실행.
    4. while 루프를 완전히 탈출.
  • 결과 출력:
    1. n의 최종 값은 2입니다.
    2. correct의 최종 값은 1입니다.
    3. 정답률: correct / (n-1) = 1 / (2-1) = 1 / 1 = 100%.
    4. 만약 n을 그대로 사용했다면 1 / 2 = 50%로 잘못된 결과가 나왔을 것입니다.
반응형

콘텐츠 내 자동삽입광고