[데이터 분석 부트캠프] 데이터 분석을 위한 핵심 Tool Python(6)

2023. 7. 8. 09:54IT 라이프/패캠 데이터분석 부트캠프 9기

반응형

1. while 반복문 실습

⌘ while문의 구성

  • 초기식이 항상 따로 필요한 건 아니고 input()으로 표준입력받은 값을 초기값으로 사용 가능하다면 충분히 활용하여 코드를 심플하게 작성
i = 0                  # 초기식
while i < 10 :         # while 조건식 : True/False 판별
	print('Hello World!')     # 반복할 코드 
	i += 1                    # 변화식
  • % 연산자의 무궁무진한 활용 : 입력받은 음수인 정수를 1까지 출력하는데, 5개씩 탭구분, 그 후 줄바꿈 출력
    • for문으로도 짜보기
    •  
# while문
num = int(input("숫자 입력: "))

num_line = 1
while num <= 1:
    if num_line % 5 != 0: # 나머지 연산자의 용도는 앞으로도 무궁무진함
        print(num, end='\t')
        
    else :
        print(num)
    num_line += 1
    num += 1

# for문
num = int(input("숫자 입력: "))
count = 1
for i in range(num,2):
    print(i, end='\t')
    
    if count % 5 == 0: # count=1로 시작해야 문제의도대로 찍힘
        print()
    count += 1
  • 나머지 연산자를 활용한 다른 케이스
# 나머지 연산자를 활용한 다른 케이스
i = 0
while i < 10:
    print((int(random.random()*10)%6)+1) # 여기서도 나머지값을 활용했네
    i += 1
  • random.random()과 함께 while문 실습
    • 이거 진짜 디버깅 엄청 했음…while문 밖에서 사용자입력을 받는 바람에 꼬여버렸음…
import random

rst = random.randint(1,30)
#print(rst)
#num = int(input("숫자 입력: ")) # 여기서부터 받으면 처음에 숫자를 맞추든 못맞추든 print되는 게 없음
num = 0

while num != rst :
    num = int(input("숫자 입력: "))
    if num > rst :
        print("너무 큽니다") 
    elif num < rst:
        print("너무 작습니다")
    else:
        print("정답입니다")
  • 무한루프와 break
    • 무한루프는 조건문으로 break하는 시점을 줘야 하는 구조
    • break는 break가 속한 가장 가까운 루프(for, while)에서 나감
    • continue는 그 밑의 코드를 싹 무시하고, continue를 포함하고 있는 가장 가까운 반복문(for, while)의 시작점(콜론이 있는 라인)으로 돌아감
"""
1. 불필요한 코드를 줄이는 연습이 필요
-> if i < 73: 을 쓸 필요가 없음

2. 문자열이 너무 익숙해서 수학적인 접근에 약함
"""

i = 0
while True:
    #if i < 73:
        #if str(i)[-1] != '3':
    if i%10 != 3: # 3으로 끝나게 하려면 이렇게 쓰면 되는군
        i += 1
        continue
  
    if i > 73:
        break
    print(i, end=' ')
    i += 1

⌘ 중첩된 for문

  • 5개의 별이 5줄 출력
for i in range(5):
    for j in range(5):
        print("*", end='')
    print()
  • 왼쪽이 직각인 삼각형 출력
for i in range(10):
    for j in range(i+1): # i가 아니라 i+1이었어야 함
        print("*", end='')
    print()

# 위와 같은 결과가 나오지만 for문 안에 if문을 사용
for i in range(5):
    for j in range(5):
        if j <= i:           # 이 부분
            print("*", end='')
    print()
  • 입력된 높이만큼 산 모양으로 별을 출력
"""
bbbb*
bbb***
bb*****
b*******
"""

height = int(input())
blank = height - 1 # 빈칸 = 높이 - 1


for i in range(height): # 높이
    for j in range(height+i): # 가로 길이(가변)
        if j < blank:
            print(" ", end='')
        else:
            print('*', end='')
    print()
    blank -= 1

 

정리

별찍는 문제는 기초 때 다루는 거라고 하지만 그런거 치고는 마지막 문제는 어려웠다.

항상 string으로 접근하는 방식이 익숙해서인지 저 문제도 string으로 풀고 싶었지만 연산측면에서 숫자가 빠를테니 더 고민해서 인덱스를 사용하는게 더 좋은 방법이란 생각은 했다. 다만, blank와 별을 섞으니 눈에 잘 안보여서 가로 줄이 가변이라고 생각을 못해서 더 어려웠다.

더불어 나머지 연산자도 유용하게 쓰이는 걸 보면서 기초수학임에도 너무 익숙하지 않은 접근 방식이란 생각을 몇 문제 풀면서 계속 생각했다. 다행인건 이게 어렵거나 이해가 힘든 문제는 아니라는 점이다.

또 문제를 제대로 이해하지 않고 짜면서 문제를 파악하는 건 고치기 참 힘들단 생각이 들었고, 코드를 누더기처럼 짜기 보다는 되도록 불필요한 부분은 없애가며 만들어야겠단 생각도 여러 번 했다.

독학만 했었지 이렇게 배우는 건 처음인데 이번 기회에 while, while True가 덜 어렵게 느껴졌고, 막연히 알던 for문과 다른 쓰임새 등도 개념적으로 정리가 되었다. 물론 같은 반복문이니까 while로 짤 수 있는 코드면 for문으로도 짤 수 있으므로 실습을 그렇게 양쪽 다 해 보긴 했지만...개념 차이는 확실히 알겠다.

 

 
728x90
반응형