알고리즘 기초 - 반복하는 알고리즘

ID짱재·2021년 5월 11일
0

Algorithm

목록 보기
1/20
post-thumbnail

🌈 알고리즘 기초 - 반복하는 알고리즘

🔥 별을 n개 출력하되, w개 마다 줄바꿈하기

🔥 10~99 사이의 난수 n개 생성하기

🔥 넓이가 area인 사각형의 변의 길이 나열하기

🔥 별로 왼쪽 아래가 직각인 이등변 삼각형 출력하기

🔥 별로 오른쪽 아래가 직각인 이등변 삼각형 출력하기


1. 별을 n개 출력하되, w개 마다 줄바꿈하기

  • n=10, w=3 이라면, 아래 if문을 통해 i값을 3으로 나눈 값의 나머지가 2일 때마다 줄바꿈 발생
  • i는 n이 10이기 때문에 0부터~9까지 반복되기 때문에 i값이 2, 5, 8일 때 if문이 작동함
  • i값이 2,5,8인데 *(별)이 3개씩 찍히는 것은 i값이 0부터 시작하기 때문에 실제로는 3번째, 6번째, 9번째에 if문(줄바꿈)이 일어나기 때문임
# 풀이1
print('*을 출력합니다.')
n = int(input('총 몇 개를 출력할까요?')) 
w = int(input('몇 개마다 줄바꿈할까요?'))  
for i in range(n):
  print('*', end='')
  if i % w == w - 1:
    print()
if n % w:
  print()
  • 위 코드는 반복문이 실행될 때마다 if문이 실행되서 if문이 참인지 거짓인지 판단해야하기 때문에 비효율적임
  • 아래 코드가 보다 효율적인 코드임
  • n이 10이고, w가 3이라면, 10를 3으로 나눈 몫인 3을 *(별)에 곱하여 출력하고, 출력횟수도 이 몫만큼 반복하여 출력함
  • 단, 위에서 나눈 나머지만큼 마지막줄에 *(별)을 출력해야하기 때문에, 마지막 if문을 통해 1번 출력
print('*을 출력합니다.')
n = int(input('총 몇 개를 출력할까요?')) 
w = int(input('몇 개마다 줄바꿈할까요?'))  
for i in range(n // w):
  print('*' * w)
tail = n % w
if tail:
  print('*' * tail)

2. 10~99 사이의 난수 n개 생성하기

  • random 내장 라이브러리 사용
  • randint() ⇢ 파라미터로 시작숫자와 끝숫자를 받고, 이 범위 안에서 난수를 돌려줌
  • 이를 반복문을 통해 숫자를 뽑고, 줄바꿈을 없앰(end='')
import random
n = int(input('난수의 갯수를 입력하세요. : '))
for i in range(n):
  r = random.randint(10, 99)
  print(r,"", end='')

3. 넓이가 area인 사각형의 변의 길이 나열하기

  • i x i 가 사격형의 넓이인 area를 초과하면 반복문을 빠져나가고, area를 i로 나눈 나머지가 있다면 무시하고 반복문을 계속 진행하게함
area = int(input('사각형의 넓이를 입력하세요 : '))
for i in range(1, area+1):
  if i * i > area: break  # i * i 가 넓이를 초과하면 반복문 종료
  if area % i: continue   # area를 i로 나눈값의 나머지가 존재한다면 무시하고 반복문 계속 진행
  print(f'{area}가 넓이인 사각형의 변의길이 : {i} x {area // i}')
  • 위에 코드 중 정사각형을 제외하고 싶다면, if문을 추가하면됨
area = int(input('사각형의 넓이를 입력하세요 : '))
for i in range(1, area+1):
  if i * i > area: break  # i * i 가 넓이를 초과하면 반복문 종료
  if area % i: continue   # area를 i로 나눈값의 나머지가 존재한다면 무시하고 반복문 계속 진행
  if i * i == area: continue  # 정사각형은 무시하고 반복문 계속 진행
  print(f'{area}가 넓이인 직사각형의 변의길이 : {i} x {area // i}')

4. 별로 왼쪽 아래가 직각인 이등변 삼각형 출력하기

  • n이 5일 때, i가 0부터 4까지 5회 반복되기 때문에 총 별(*)이 5줄로 배치
  • i가 0일 때, 내부 for문이 작동하면 for j in range(1)이 되어 *(별)이 1개 생성되고 줄바꿈 발생
  • i가 1일 때, 내부 for문 for j in range(2)은 j가 0과 1일 때 2번 작동하기 때문에 *(별)이 2개 찍힘
  • 이런식으로 0부터 4까지 i가 증가하기 때문에 *(별)은 1개, 2개, 3개, 4개, 5개씩 찍히면 줄바꿈을 함
print('왼쪽 아래가 직각인 이등변 삼각형을 출력합니다.')
n = int(input('짧은 변의 길이를 입력하세요. : '))
for i in range(n):
  for j in range(i + 1):
    print('*', end='')
  print()

5. 별로 오른쪽 아래가 직각인 이등변 삼각형 출력하기

  • n이 10이라면, 최초 for문에서 i는 0부터 9까지 반복되기 때문에 10개의 줄로 내부 for문이 작동
  • for _ in range(n - i - 1): 에서 n은 10으로 고정이지만, i가 0부터 9까지 증가하기 때문에 range의 값은 9부터 0까지 변화함
  • 이를 줄바꿈없이 표시하기 때문에 공백이 첫줄에는 9개, 마지막줄에는 0개 생성
  • 줄바꿈없이 아래 for문에서 *(별)을 찍어주기 때문에 별은 1개부터 10개까지 증가
    • 1줄 : [공백*9번 반복]+[별*1번]
    • 2줄 : [공백*8번 반복]+[별*2번]
    • n줄 : [공백*(n-i-1)번 반복]+[별*(i+1)번]
print('왼쪽 아래가 직각인 이등변 삼각형을 출력합니다.')
n = int(input('짧은 변의 길이를 입력하세요. : '))
for i in range(n):
  for _ in range(n - i - 1):
    print(' ', end='') # 공백 줄바꿈없이 출력
  for _ in range(i + 1):
    print('*', end='')
  print()
profile
Keep Going, Keep Coding!

0개의 댓글