TIL - Python - for&while&FizzBuzz

김영훈·2021년 2월 18일
0

Python

목록 보기
5/14

# for 반복문

  • for와 range 사용하기

    반복문의 변수 i
    ▶ 변수 i를 루프 인덱스라고도 부르며 index의 첫머리글자를 따서 i를 주로 사용합니다

    for i in range(1,101):
        print('Hello, world!', i)
  • for와 range 응용하기

    • 증가폭 사용하기
    • 숫자 감소시키기
      • 증가폭 활용 *참고: 1씩 감소시킬 경우 증가폭 -1 입력 필수
      • reversed() 활용 *참고: reversed(): iterator의 요소를 역순으로 return하는 함수. 원본을 변경하지 않는다.
    • 입력한 횟수대로 반복하기
        for i in range(0,21, 2):  #  증가폭 사용하기
            print('Hello, world!', i)  

        for i in range(20,-1, -2):  # 증가폭으로 숫자 감소시키기
            print('Hello, world!', i)

        for i in reversed(range(0,21, 2)):  # reversed()로 숫자 감소시키기
            print('Hello, world!', i) 
  • range대신 시퀀스 객체를 넣어도 된다.
    • list, tuple, dict, str...

# While 반복문

  • while 반복문 기본 형태

    • *주의: 조건식만 지정하고 변화식을 생략하면 반복이 끝나지 않고 무한루프
         초기식
         while 조건식:
             반복할 코드
             변화식
  • while 반복문 사용하기

    • 초깃값을 감소시키기

    • 입력한 횟수대로 반복하기

        i = 20
        while i > 0:
            print( i, 'Hello, world!')
            i -= 1

        count = int(input())
        i = 0
        while i < count:
            print(i, 'Hello, world!')
            i += 1
  • 반복 횟수가 정해지지 않은 경우

    랜덤(random) 모듈
    random.random() : 0 이상 1 미만의 숫자 중에서 아무 숫자나 하나를 뽑아 return
    random.randrange(a, b) : a 이상 b 미만의 정수 중에서 하나를 뽑아 return
    random.randint(a, b) : a 이상 b 이하의 정수 중에서 하나를 뽑아 return
    random.shuffle(list 객체): list 객체 내부 요소의 순서를 섞음. 원본을 변경
    random.choice(sequence 객체) : 내부 요소 중 하나를 무작위로 뽑음.

  • while 반복문으로 무한 루프 만들기

    • while에 조건식 대신 True를 지정하면 무한 루프가 만들어짐.
    • True 대신 True로 취급하는 값(문자열, 0이 아닌 숫자)을 사용해도 된다.
    • 콘솔(터미널, 명령 프롬프트)에서 Ctrl+C를 입력하여 무한 루프를 끝낸다.
        while True:
            print('Hello, world')

# break, continue

  • break로 반복문 끝내기

    • breakforwhile 문법에서 제어흐름(반복)을 벗어나기 위해 사용
    • continue는 제어흐름(반복)을 유지한 상태에서 코드의 실행만 건너뜀
        i = 0
        while True:
            print(i)
            i += 1
            if i == 100:
                break
        
        for i in range(200):
            print(i)
            if i == 100:
                break
  • continue로 코드 실행 건너뛰기

    • 반복문 안에서 continue를 실행하면 continue 아래의 코드는 실행하지 않고 건너뛴 다음 반복을 시작
        for i in range(100):
            if i % 2 == 0:
                continue  #  아래 코드를 실행하지 않고 건너뜀
        print(i)
  • 입력한 횟수대로 반복하기

    연습문제
    표준 입력으로 정수 두 개가 입력됩니다(첫 번째 입력 값의 범위는 1~200, 두 번째 입력 값의 범위는 10~200이며 첫 번째 입력 값은 두 번째 입력 값보다 항상 작습니다). 다음 소스 코드를 완성하여 첫 번째 정수와 두 번째 정수 사이의 숫자 중 3으로 끝나지 않는 숫자가 출력되게 만드세요. 정답에 코드를 작성할 때는 while True:에 맞춰서 들여쓰기를 해주세요.

        start, stop = map(int, input().split())
        
        i = start
        while True:
            if (i-3) % 10 == 0:
                i += 1
                continue
            if i > stop:
                break
            print(i, end=' ')
            i += 1

# 계단식으로 별 출력하기

  • 중첩 루프 사용하기
    • print() : 다음 줄로 개행
    • 중첩 루프 : 반복문 안에 반복문이 있는 형태
    for i in range(5):        
        for j in range(5):   
            if j <= i:          
                print('*', end='')  
        print()
  • 대각선으로 별 출력하기
    for i in range(1, 6):        
        for j in range(1, 6):   
            if j <= i:
                if i == j:
                    print('*', end='')  
                print(' ', end='')    
        print()

    for i in range(5):
        for j in range(5):
            if i == j:
                print('*', end='')
            print(' ', end='')
        print()
  • 산 모양으로 별 출력하기

    • 중첩 루프 사용하기
    • for i in range(count): x축 좌표
    • for i in reversed(range(count)): y축 좌표
    • j와 i의 대소 관계 비교로 조건을 설정 ex) j <= i, j < i, j >= i, j > i
        count = int(input())
        for i in range(count):
            for j in reversed(range(count)):
                if j <= i:
                    print('*', end='')
                else:
                    print(' ', end='')

            for j in range(count):
                if j < i:
                    print('*', end='')
                else:
                    print(' ', end='')
            print()
       
       # 다른 풀이
       
       count = int(input())
       for i in range(count):
           for j in range(2*count-1):
               if j in range(count-1-i, count+i):
                   print('*', end='')
               else:
                   print(' ', end='')
           print()

# FizzBuzz

  • FizzBuzz란?

    • 매우 간단한 프로그래밍 문제이며 규칙은 다음과 같다

      1) 1에서 100까지 출력
      2) 3의 배수는 Fizz 출력
      3) 5의 배수는 Buzz 출력
      4) 3과 5의 공배수는 FizzBuzz 출력

    • FizzBuzz 문제의 의도: 문제의 요구사항을 정확히 파악하여 구현했는지를 평가하는 것

    • FizzBuzz 기초 실력을 가늠하는 문제이기 때문에 프로그래밍 면접에 자주 등장한다.

  • 1부터 100까지 숫자 출력하기
    for i in range(1, 101):
        print(i)
  • 3의 배수와 5의 배수일 때 처리하기
    for i in range(1, 101):
        if i % 3 == 0:
            print('Fizz')
        elif i % 5 == 0:  #  문제점: 3과 5의 공통된 배수(공배수)가 모두 'Fizz'로 출력됨
            print('Buzz')
        else:
            print(i)
  • 3과 5의 공배수 처리하기
    for i in range(1, 101):
        if i % 3 == 0 and i % 5 == 0:
            print('FizzBuzz')
        elif i % 3 == 0:
            print('Fizz')
        elif i % 5 == 0:
            print('Buzz')
        else:
            print(i)
  • 15의 약수 처리하기
        x = 15
        for i in range(1, x+1):
            if x % i == 0:
            print(i)
  • 논리 연산자를 사용하지 않고 3과 5의 공배수 처리하기

    • 논리 연산자를 사용하는 대신 3과 5의 최소공배수 15의 배수에 대한 흐름을 제어

      하지만 실무에서는 i % 3 == 0 and i % 5 == 0처럼 의미를 명확하게 드러내는 것이 좋다.

  • 코드 단축하기

    • 문자열의 곱셈과 덧셈 복습

      >>> 'Fizz' + 'Buzz'
      'FizzBuzz'
      >>> 'Fizz' * 'True'
      'FizzBuzz'
      >>> 'Fizz' * 'False'
      ''
      문자열에 True를 곱하면 문자열이 그대로 나오고, False를 곱하면 문자열이 출력되지 않습니다(True는 1, False는 0으로 연산).

    • 논리 연산자 복습

      >>> print(True and Fasle)
      False
      >>> print(True or Fasle)
      True
      >>> print('' or 6)
      6
      >>> print(1 or 6)
      1
      >>> print(23 and 'abc')
      abc

    • 코드 단축하여 표현하기

    for i in range(1, 101):
       print('Fizz'*(i % 3 == 0) + 'Buzz'*(i % 5 == 0) or i)  
 
    # 문자열의 '덧셈'과 '곱셈'을 이용하여 print() 내부에서 처리
profile
Difference & Repetition

0개의 댓글