You are on page 1of 20

4주

알고리즘 –
JAVA

Python
</>

반복문
영남대학교 컴퓨터공학과
UX
조행래 교수

연구실: IT관 216호


전화: 053-810-2559
Email: hrcho@yu.ac.kr
이번 주에 배울 내용

# for문 (실습)
# 중첩 반복문 (실습)

-1-
1. for 문 for 문 Sequence range() 함수

 while문과 함께 반복 구조를 구현하는 대표적인 명령어


 for 문
 시퀀스(sequence)에 포함된 항목들의 순서대로 반복문을 수행

for 변수 in 시퀀스 : 명령 1
하나 또는 여러 개의 명령

시퀀스에 항목이
남아있는가?
시퀀스에 항목이 시퀀스에
있으면 다음 항목이
항목을 꺼낸다 없으면
반복될 명령(들)

명령 2

-2-
2. Sequence for 문 Sequence range() 함수

 Sequence란?
 여러 항목을 저장하며, 각 항목은 순서를 갖는 자료 구조

 각 항목은 인덱스를 이용하여 참조할 수 있다.

- 첫번째 항목의 인덱스는 0이며, 이후 1씩 증가


 항목의 데이터 타입이 다른 sequence도 존재 (예: list, tuple)

 대표적인 Sequence
 list: [항목1, 항목2, …] 형태로 저장되며, 항목의 수정도 가능

 예 1: list1 = [10, 20, 30, 40]  list1[0] = 10, list1[1] = 20, …


 예 2: list2 = ["철수", "영희", "민수"], list3 = [2.1, 3, "A"]

 tuple: (항목1, 항목2, …) 형태로 저장되며, 항목의 수정이 불가

 예: t1 = ("사과", "바나나", "체리"), t2 = (1, 2, 3, 4), t3 = (1, 2, "Hello")

 string: ' '나 " "로 묶인 문자들의 모임

 예: s = "Hello"  s[0] = 'H', s[1] = 'e', s[2] = 'l', …

-3-
for 문의 예 – Sequence for 문 Sequence range() 함수

In [1]: fruits = ["사과", "바나나", "체리"]


for x in fruits : # list와 for 문의 조합
print("맛있는 " + x)
Out[1]: 맛있는 사과
맛있는 바나나
맛있는 체리
In [2]: sum = 0
for x in (1, 2, 3, 4, 5, 6, 7) : # tuple과 for 문의 조합
sum = sum + x
print("합계 =", sum)
Out[2]: 합계 = 28

In [3]: for ch in "Hello" : # string과 for 문의 조합


print(ch, end = " ") # ch를 출력한 후, newline 대신에 " "를 출력하라
Out[3]: H e l l o

-4-
3. range() 함수 for 문 Sequence range() 함수

 정수의 sequence를 생성하는 함수


 사용 방법
 range(stop)

 0부터 stop – 1까지의 연속된 정수로 구성된 sequence를 생성

 예: list(range(10)) == [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

 range(start, stop)

 start부터 stop – 1까지의 연속된 정수로 구성된 sequence를 생성

 예: list(range(1, 11)) == [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

 range(start, stop, step)

 start부터 stop – 1까지 step의 간격으로 구성된 sequence를 생성

 예 1: list(range(10, 100, 25)) == [10, 35, 60, 85]

 예 2: list(range(0, -10, -1)) == [0, -1, -2, -3, -4, -5, -6, -7, -8, -9]

-5-
for 문의 예 – range() 함수 for 문 Sequence range() 함수

In [1]: for x in range(0, 10, 2) : # 0부터 9까지 짝수에 대해


print(x, end = " ") # 공백으로 구분하여 출력하라
Out[1]: 0 2 4 6 8
In [2]: # 양의 정수 n을 입력받은 다음, 1부터 n까지의 합을 구하기
n = int(input("양의 정수를 입력하세요: "))
sum = 0
for num in range(1, n+1) :
sum = sum + num
print(f"1부터 {n}까지의 합 = {sum}")
Out[2]: 양의 정수를 입력하세요: 100
1부터 100까지의 합 = 5050
In [3]: my_list = [1, 2, 3, 4, 5]
for i in range(len(my_list)) : # len(my_list): my_list의 항목 수 = 5
my_list[i] = my_list[i] * 10 # my_list의 각 항목 값을 10배 증가
print(my_list)
Out[3]: [10, 20, 30, 40, 50]
-6-
for 문을 이용한 Turtle 그래픽스의 예 for 문 Sequence range() 함수

프로그램 실행 결과

import turtle
star = turtle.Turtle()
for i in range(5) :
star.forward(200)
star.right(144)

import turtle
rectangle = turtle.Turtle()
line_color = ["red", "yellow", "green", "blue"]
for i in range(len(line_color)) :
rectangle.color(line_color[i])
rectangle.forward(200)
rectangle.left(90)
-7-
else, break, in과 for 문의
4. else, break, continue continue not in 연산자 실행 흐름도

 while 문의 동작 과정과 거의 동일
 else – Sequence의 모든 항목들을 처리한 후 실행

 break – Sequence의 나머지 항목들을 skip하고, 반복문 탈출

 continue – 현재 항목의 나머지 명령들을 skip하고, 다음 항목을 실행

 else와 break를 이용한 for 문의 예 – 입력한 수가 소수인지 확인


In [1]: num = int(input("양의 정수를 입력하세요: "))
for i in range(2, num) :
if num % i == 0 :
print("소수가 아닙니다.")
break
else :
print("소수 입니다.")
Out[1]: 양의 정수를 입력하세요: 17
소수 입니다.

-8-
else, break, in과 for 문의
5. in과 not in 연산자 continue not in 연산자 실행 흐름도

 항목이 sequence에 포함되는지 검사하는 연산자


In [1]: x = ["apple", "banana"]
print("banana" in x) # 리스트에 포함되는지 검사
Out[1]: True
In [2]: ch = "yellow"
if ch not in ("red", "green", "blue") : # tuple에 포함되는지 검사
print("빛의 3원색이 아닙니다.")
else :
print("빛의 3원색 입니다.")
Out[2]: 빛의 3원색이 아닙니다.
In [3]: ch = 'E'
if ch in "aeiouAEIOU" : # string에 포함되는지 검사
print("모음입니다.")
else :
print("자음입니다.")
Out[3]: 모음입니다.
-9-
else, break, in과 for 문의
6. for 문의 실행 흐름도 continue not in 연산자 실행 흐름도

이전 명령들 …

for 시퀀스 :

continue
조건이
거짓이면 break

else :

다음 명령들 …

- 10 -
7. 중첩 반복문 중첩 반복문 집합 연산

 반복문 안에 다른 반복문이 존재하는 문장


1,1 실행
결과
x=1 외부 반복문(outer loop) 1,2
while x < 4 : 1,3
y = 1 내부 반복문(inner loop)
2,1
while y < 4 :
2,2
print(x, ",", y)
2,3
y=y+1
3,1
x=x+1
3,2
print("반복문이 끝났습니다.")
3,3
- 11 -
2. while을 이용한 중첩 반복문 중첩 반복문 집합 연산

 예제: -1이 입력될 때까지 여러 개의 양의 정수들을 입력 받은 다음,


각 정수의 factorial을 계산하라.
In [1]: while True : # 외부 반복문에서 여러 개의 정수를 입력
num = int(input("양의 정수를 입력(종료는 -1): "))
if num == -1 : # 외부 반복문을 종료하는 조건
break;
i = factorial = 1;
while i <= num : # factorial 계산은 내부 반복문에서 수행
factorial = factorial * i
i=i+1
print(f"{num}! = {factorial}")
Out[1]: 양의 정수를 입력(종료는 -1): 10
10! = 3628800
양의 정수를 입력(종료는 -1): 15
15! = 1307674368000
양의 정수를 입력(종료는 -1): 7
7! = 5040
양의 정수를 입력(종료는 -1): -1
- 12 -
3. for를 이용한 중첩 반복문 중첩 반복문 집합 연산

 2단부터 9단까지 구구단 출력하기


In [1]: for x in range(2, 10) :: # 2단부터 9단까지
for y in range(1, 10) : # 곱하는 수는 1부터 9까지
print(f"{x}*{y}={x*y:2d}", end = " ")
print()
Out[1]: 2*1= 2 2*2= 4 2*3= 6 2*4= 8 2*5=10 2*6=12 2*7=14 2*8=16 2*9=18
3*1= 3 3*2= 6 3*3= 9 3*4=12 3*5=15 3*6=18 3*7=21 3*8=24 3*9=27
4*1= 4 4*2= 8 4*3=12 4*4=16 4*5=20 4*6=24 4*7=28 4*8=32 4*9=36
5*1= 5 5*2=10 5*3=15 5*4=20 5*5=25 5*6=30 5*7=35 5*8=40 5*9=45
6*1= 6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36 6*7=42 6*8=48 6*9=54
7*1= 7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49 7*8=56 7*9=63
8*1= 8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64 8*9=72
9*1= 9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81

- 13 -
중첩 반복문 – 삼각형 그리기 중첩 반복문 집합 연산

 삼각형 그리기 *
 모두 10개의 줄로 구성 (외부 반복문) **
***
 줄 번호만큼 별을 출력 (내부 반복문) ****
*****
In [1]: for x in range(10) : # 10줄을 출력하자 ******
for y in range(x+1) : # 각 줄에서 출력할 별의 수 *******
print("*", end = "") ********
print() *********
**********
 다른 모양의 삼각형 그리기도 도전해 보자…
********** * **********
********* ** *********
******** *** ********
******* **** *******
****** ***** ******
***** ****** *****
**** ******* ****
*** ******** ***
** ********* **
* ********** *
- 14 -
for를 이용한 중첩 반복문 – Sequence 중첩 반복문 집합 연산

 문장을 입력받아 숫자가 포함되지 않은 단어들을 모두 출력하라.


 문자열에서 단어를 분리할 때는 str.split() 함수를 사용한다.

In [1]: statement = input("문장을 입력: ")


for word in statement.split() :
for digit in "0123456789" :
if digit in word :
break;
else :
print(word, end = " ")
Out[1]: 문장을 입력: 나이는 23세이고, 주소는 A 아파트 12동 205호 입니다.
나이는 주소는 A 아파트 입니다.

- 15 -
4. 집합 연산 중첩 반복문 집합 연산

 문제
 두 개의 리스트에 저장된 데이터들의 교집합/합집합/차집합 구하기

 예: A = [23, 15, 2, 14, 14, 16, 20, 14], B = [2, 48, 15, 14, 26, 32, 47, 14]

 해결 방법
 중첩 반복문

 리스트 함축(list comprehension)

 set 연산

- 16 -
교집합 구하기 중첩 반복문 집합 연산

 입력: 두 개의 리스트
 A = [23, 15, 2, 14, 14, 16, 20, 14], B = [2, 48, 15, 14, 26, 32, 47, 14]

 출력: 공통으로 포함된 항목들로 구성된 새로운 리스트(교집합)


 방법 1: for 문으로 직접 구현
In [1]: C = [] [15, 2, 14, 14, 14]
for item in A :
if item in B :
C.append(item)

 방법 2: 리스트 함축(list comprehension)을 이용하는 방법


In [2]: C = [ x for x in A if x in B] [15, 2, 14, 14, 14]

 방법 3: set 연산을 이용하는 방법  중복 제거


In [3]: C = list(set(A).intersection(B)) [2, 14, 15]
- 17 -
합집합 구하기 중첩 반복문 집합 연산

 입력: 두 개의 리스트
 A = [23, 15, 2, 14, 14, 16, 20, 14], B = [2, 48, 15, 14, 26, 32, 47, 14]

 출력: A와 B의 항목들을 모두 가지고 있는 새로운 리스트 (합집합)


 방법 1: + 연산으로 두 리스트를 합칠 경우?
In [1]: U = A + B [23, 15, 2, 14, 14, 16, 20, 14, 2, 48, 15, 14, 26, 32, 47, 14]

 방법 2: for 문으로 직접 구현
In [2]: U = list(A)
for item in B :
[23, 15, 2, 14, 14, 16, 20, 14, 48, 26, 32, 47]
if item not in U :
U.append(item)

 방법 3: set 연산을 이용하는 방법


In [3]: U = list(set(A).union(B)) [2, 14, 15, 16, 20, 23, 26, 32, 47, 48]

- 18 -
차집합 구하기 중첩 반복문 집합 연산

 입력: 두 개의 리스트
 A = [23, 15, 2, 14, 14, 16, 20, 14], B = [2, 48, 15, 14, 26, 32, 47, 14]

 출력: A에는 있지만 B에는 없는 원소를 가지고 있는 새로운 리스트 (차집합)


 방법 1: in 연산을 이용하여 for 문으로 직접 구현
In [1]: D = [] [23, 16, 20]
for item in A :
if item not in B :
D.append(item)

 방법 2: 리스트 함축(list comprehension)을 이용하는 방법


In [2]: D = [ x for x in A if x not in B] [23, 16, 20]

 방법 3: set 연산을 이용하는 방법


In [1]: D = list(set(A).difference(B)) [16, 20, 23]
- 19 -

You might also like