새소식

Python/Basics

@ 로직과 순서도 - 반복구조 + 리스트

  • -

모든 문제에 순서도 함께 만드세요. 모르는 문제는 넘어가셔도 좋아요.

 

diagrams.net Link

 

Flowchart Maker & Online Diagram Software

Flowchart Maker and Online Diagram Software draw.io is free online diagram software. You can use it as a flowchart maker, network diagram software, to create UML online, as an ER diagram tool, to design database schema, to build BPMN online, as a circuit d

app.diagrams.net

 

연습문제

 

 

예제37

1부터 10까지의 수를 리스트에 저장하고 출력하기

i가 1부터 시작해 1씩 증가하며 10까지 반복하며 i 값을 리스트 a[ i-1 ]에 저장한다. 결국 a[ 0 ]에는 1, a[ 1 ]에는 2, a[ 2 ]에는 3, ..., a[ 9 ]에는 10이 저장된다.

 

# 실행결과

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

 

더보기

# 로직 참고
01 빈 리스트 a를 생성한다.
02 리스트 a에 i 값을 추가한다.
03 리스트 a를 출력한다.

 

 

 

예제38

10, 20, 30, ..., 100 저장하고, 거꾸로 출력하기

i가 1부터 1씩 증가하며 10이 될 때까지 반복하며 i*10을 a[i-1]에 저장한다. 그리고 i가 9부터 1씩 감소하며 0이 될 때까지 반복하며 a[i] 값을 출력한다.

 

# 실행결과

100 90 80 70 60 50 40 30 20 10

 

더보기

# 로직 참고

01 빈 리스트 a를 생성한다.
02 리스트 a에 10, 20, 30, ..., 100을 추가한다.
03 리스트 a에 저장된 값을 뒤에서부터 출력한다. 결국 100, 90, 80, ..., 10이 출력된다.

 

 

 

예제39

리스트 요소 거꾸로 뒤집기

i가 0부터 1씩 증가하며 4가 될 때까지 반복하며 a(i)와 a(9-i)를 교환한다. 결국 a[0]과 a[9]가, a[1]과 a[8]이, a[2]와 a[7]이, a[3]과 a[6]이, a[4]와 a[5]가 교환된다.

 

a 값과 b 값을 교환하는 절차는 다음과 같다.

temp = a

a = b

b = temp

 

# 실행결과

[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]

 

더보기

# 로직 참고

a[i]와 a[9-i]를 교환한다.

 

# 내장 함수 참고 (알아만 두세요, 함수를 배우면 내장함수를 만들 수 있어야 합니다.)

reverse 함수를 이용해서 리스트 요소를 거꾸로 뒤집을 수 있다.

a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
a.reverse( )
print(a)

 

 

 

 

예제40

리스트 a 요소 리스트 b에 거꾸로 저장하기

리스트 a 요소를 거꾸로 해서 리스트 b에 저장한다.

i가 0부터 1씩 증가하며 9가 될 때까지 반복하며 a[9-i]값을 b[i]에 저장한다. 결국 b[0]에는 a[9] 값이, b[1]에는 a[8] 값이, ..., b[9]에는 a[0] 값이 저장된다.

 

# 실행결과

[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]

 

더보기

# 로직 참고

리스트 b에 a[9], a[8], ..., a[0]을 추가한다.

 

 

 

예제41

리스트 요소 왼쪽←으로 한 칸씩 원형으로 이동하기

리스트 요소를 왼쪽으로 한 칸씩 원형으로 이동하는 동작 전후 구조는 다음과 같다.

temp에 a[0] 값을 저장하고, i가 0부터 1씩 증가하며 8이 될 때까지 반복하며 a[i+1] 값을 a[i]에 저장한다. 그리고 temp 값을 a[9]에 저장한다.

 

# 실행결과

[2, 3, 4, 5, 6, 7, 8, 9, 10, 1]

 

더보기

# 로직 참고

01 temp 변수에 a[0] 값을 저장한다.
02 i 값이 0부터 1씩 증가하며 8이 될 때까지 a[i]에 a[i+1] 값을 저장하는 동작을 반복한다.
03 a[9]에 temp 값을 저장한다.

 

 

 

예제42

리스트 요소 중 최댓값 구하기

a[0] 값을 max에 저장하고, i가 1부터 1씩 증가하며 9가 될 때까지 반복하며 a[i] 값이 max 값보다 크면 a[i] 값을 max에 저장한다.


# 실행결과

[91, 90, 78, 35, 65, 9, 97, 54, 62, 90]
최댓값: 97

 

더보기

# 로직 참고

01 리스트에 임의로 값을 10개 입력하거나,

# import random #random.randint를 사용하기 위해 random 모듈을 포함시킨다.

# random.randint(1, 100) # random.randint(1,100)은 1부터 100까지의 정수 중 하나를 무작위로 선택한다.
02 1부터 100까지의 임의의 정수 10개를 생성해서 리스트 a에 추가한다.
03 m이 a[i]보다 작으면 a[i]를 m에 저장한다.

 

 

# 내장 함수 참고 (알아만 두세요, 함수를 배우면 내장함수를 만들 수 있어야 합니다.)

# max 함수를 이용해서 최댓값을 구할 수 있고, min 함수를 이용해서 최솟값을 구할 수 있다.

#print("최댓값:", max(리스트 변수명))
#print("최솟값:", min(리스트 변수명))

 

 

 

예제43

에라토스테네스의 체 (선택 문제)

그리스의 수학자이자 지리학자인 에라토스테네스가 고안한 소수를 찾는 방법이다.

 

이 방법으로 소수를 찾으려면 2부터 시작해 자연수를 차례로 쓴 다음,

2 이외의 2의 배수,

3 이외의 3의 배수,

5 이외의 5의 배수의 순서로 수를 지워나가면, 끝에 남는 수가 소수이다.

그러면 체로 친 것처럼 끝에 남는 수가 있다.

 

자신과 1 이외의 다른 수로 는 나누어떨어지지 않는 소수이고, 위와 같이 소수를 찾는 방법을 에라토스테네스의 체라고
한다. 에라토스테네스의 체를 이용해서 2부터 20까지의 소수를 찾는 예를 살펴보자.

1부터 100까지의 소수를 위 방법으로 구현하라.

 

# 실행결과

# 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97

더보기

01리스트 a에 101개의 0을 추가한다.
02 j 값이 i*2부터 i씩 증가하며 100이 될 때까지 a[j]에 1을 저장한다.
03 a[i]가 0이면 소수인 i를 출력한다.

 

 

 

예제44

10진수를 2진수로 변환하여 리스트에 저장하기

(문제를 못 풀더라도, 2진수 개념은 알아둡시다.)

10진수를 2진수로 변환하는 과정을 이해하려면 진법의 개념을 먼저 이해해야 한다.

진법이란 사용할 수 있는 숫자의 개수와 위치 값을 정의해주는 수 체계이다.

한 자리에 사용할 수 있는 숫자의 개수는 해당 진법과 같으며, 사용할 수 있는 숫자는 0에서 시작해서 해당 진법의 수보다 1적은 수까지 가능하다.

그러므로 10진법에서 사용할 수 있는 숫자는 0, 1, 2, …, 8, 9로 10개가 되고, 2진법에서는 0과 1로 2개를 사용할 수 있다.


16진법과 같이 10진법보다 큰 진법의 경우에는 0부터 9까지의 수 외에도 다른 수가 더 필요한데 이런 경우에 A, B, C, D, E, F를 사용한다. 16진법의 A는 10진수 10을, B는 10진수 11을, …, F는 10진수 15를 의미한다.

 

컴퓨터에서 많이 사용되는 10진수, 2진수, 8진수 16진수의 관계를 표로 나타내면 다음과같다.

10진수 2진수 8진수 16진수
0 0 0 0
1 1 1 1
2 10 2 2
3 11 3 3
4 100 4 4
5 101 5 5
6 110 6 6
7 111 7 7
8 1000 10 8
9 1001 11 9
10 1010 12 A
11 1011 13 B
12 1100 14 C
13 1101 15 D
14 1110 16 E
15 1111 17 F
16 10000 20 10

 

다음으로 진수 변환을 알아보자. 먼저 10진수를 2진수 또는 8진수로 변환하는 내용에 대해 살펴보자.
10진수를 다른 진수로 변환하려면 10진수를 변환하고자 하는 진수로 몫이 0이 될 때까지계속해서 나누고 나머지를 역순으로 나열한 값이 변환한 값이 된다.


예를 들어 37을 2진수로 변환하려면 다음과 같이 37을 2로 계속해서 나눈다. 그리고 나머지를 역순으로 배열하면 100101이 되는데 이 값이 10진수 37을 2진수로 변환한 값이 된다.

 

또 다른 예로 10진수를 8진수로 변환하는 과정은 다음과 같다. 10진수 87을 8진수로 변환
하면 127이다.

10진수를 2진수로 변환하려면 10진수를 2로 나누어 나머지를 구하고, 몫을 2로 다시 나누어 나머지를 구하는 동작을 반복한다. 몫이 0이 되면 반복을 중단하고, 구한 나머지를 역순으로 나열한 값이 결과 값이 된다.

 

10진수를 입력받아, 2진수로 출력하는 프로그램을 개발하세요.

 

# 실행결과

# 10진수 : 42
# 1 0 1 0 1 0

 

더보기

# 로직 참고

01 n이 0이 아닌 동안 04~05를 반복해서 실행한다.
02 n을 2로 나눈 나머지를 b에 추가한다.
03 n을 2로 나눈 몫을 n에 저장한다.
04 리스트 b에 저장된 값을 거꾸로 출력한다.
05 len(b)는 리스트 b의 길이, 즉 b에 저장된 값의 개수를 의미한다.

 

 

 

예제 45

배열에 저장된 2진수를 10진수로 변환하기

2진수를 10진수로 변환하는 내용에 대해 살펴보자.
수 체계에 있어서 중요한 개념 중 하나는 자리 값인데, 모든 수의 각 숫자는 자리 값을가지고 있다.

각 숫자의 자리 값은 그 위치가 의미하는 제곱수를 해당 진법에 적용하면되는데, 각 위치가 의미하는 제곱수는 가장 오른쪽이 0이고 왼쪽으로 가면서 1을 더한 값이 된다.


예를 들면, 2진수 11001은 다음과 같은 절차를 거쳐 10진수 25가 된다.

이와 같이 2진수를 10진수로 변환할 때는 2진수 각 자리를 10진수로 변환하여 모두 더하면 된다. 

단, 2진수는 5자리라 가정한다.

 

2진수를 한자리  10진수를 출력하는 프로그램을 만드세요.

 

# 실행결과

# 25 # (2진수 리스트가 b = [1,1,0,0,1] 일 때)

 

 

더보기

# 로직 참고

# 2진수 b[i]를 10진수로 변환해서 n에 누적한다. 2**(4-i)는 2의 4-i승 (2 4-i)을  의미한다.

 

 

 

 

과제

과제 28

20부터 1까지 수를 차례로 리스트에 저장하고 출력하는 순서도와 파이썬 프로그램을 작성하여라.

 

과제 29

리스트 요소를 오른쪽으로 한 칸씩 원형으로 이동하는 순서도와 파이썬 프로그램을 작성하여라.

 

과제 30

임의의 10개의 수를 저장하고 있는 리스트에서 최솟값을 구하는 순서도와 파이썬 프로그램을 작성하여라.

 

과제 31

입력 받은 10진수를 8진수로 변환하여 출력하는 순서도와 파이썬 프로그램을 작성하여라.

 

과제 32

리스트에 저장된 8진수를 10진수로 변환하는 순서도와 파이썬 프로그램을 작성하여라.

 

 

 

 

 

 

 


이후는 선택 문제 입니다.

코드만 구현하는 이유는, 한번쯤 공부하면서 명칭을 기억만 해도 좋겠다는 의도입니다. (순서도 제공)

 

연습문제

예제46

선형 탐색 알고리즘

탐색이란 컴퓨터에 저장된 데이터 집합에서 어떤 조건이나 성질을 만족하는 데이터를 찾는것이다.


탐색하고자 하는 데이터는 무작위로 섞여있는 데이터와 특정한 규칙에 따라 정렬된 데이터로 구분할 수 있다. 데이터의 유형에 따라 적합한 탐색 방법이 있는데, 우선 무작위로 섞여있는 데이터를 탐색하는 방법인 선형 탐색에 대해 살펴보자.


선형 탐색은 순차 탐색이라고도 하는데, 주어진 데이터 집합에서 원하는 데이터를 처음부터 순차적으로 비교하면서 찾는 방법이다.


다음 데이터 집합에서 선형 탐색을 이용해서 데이터 7을 탐색하는 과정을 알아보자.

① 첫 번째 데이터인 15와 7을 비교한다. 값이 다르므로 다음으로 이동한다.

② 두 번째 데이터인 19와 7을 비교하는데, 다르므로 다음으로 이동한다.

③ 세 번째 데이터인 5와 7을 비교하는데, 다르므로 다음으로 이동한다.

④ 네 번째 데이터인 7과 찾고자 하는 3이 같으므로 원하는 데이터를 찾고 탐색을 종료한다.

만약 마지막까지 찾는 데이터가 없으면 탐색 실패를 알려주고 끝내야 한다.

 


 

임의의 숫자를 10개를 요소로 가지는 리스트를 만들고, 키 값을 입력했을 때 인덱스를 찾아 출력하는 선형 탐색 알고리즘을 구현하라.

 

#실행결과

# 키: 11
# 6 에서 탐색 성공 (a = [26, 27, 39, 63, 57, 75, 11, 76, 80, 18] 리스트 일 때)

 

# 순서도 참고

# 로직 참고

더보기

 

01 cnt가 10보다 작은 동안 비교 작업을 반복해서 실행한다.
02 key와 a[cnt]가 같으면 “탐색 성공”을 출력하고 break에 의해 반복 구조를 빠져나온다.
03 cnt가 10과 같으면 “탐색 실패”를 출력한다.

 

# 참고 (알아만 두세요, 위처럼 직접 만들 수 있어야 합니다.)

in과 index를 이용해서 리스트에서 탐색을 할 수 있다. key in a는 리스트a에 key가 있는지 확인하는 것이고, a.index(key)는 리스트 a에서 key의 위치를 의미한다.

 

 

예제47

이진 탐색 알고리즘

이진 탐색은 정렬된 데이터 집합을 이분화하면서 탐색하는 방법이다.
다음 데이터 집합에서 이진 탐색을 이용해서 데이터 9를 탐색하는 과정을 알아보자.


 

임의의 숫자를 10개를 요소로 가지는 리스트를 만들고, 키 값을 입력했을 때 인덱스를 찾아 출력하는 이진 탐색 알고리즘을 구현하라.

 

#실행결과

# 키: 39
# 4 에서 탐색 성공 (a = [11, 18, 26, 27, 39, 57, 63, 75, 76, 80] 리스트 일 때)

 

# 순서도 참고

# 로직 참고

더보기

01 low 값이 high보다 작거나 같은 동안 비교 작업을 반복해서 실행한다.
02 low와 high 값의 평균을 mid에 저장한다.
03 key와 a[mid]가 같으면 “탐색 성공”을 출력하고, 반복 구조를 빠져나온다.
04 key가 a[mid]보다 작으면 high변수에 mid-1을 저장한다.
05 key가 a[mid]보다 크면 low변수에 mid+1을 저장한다.
06 low 값이 high 값보다 크면 “탐색 실패”를 출력한다.

 

 

예제48

선택 정렬 알고리즘

 

순서에 상관없이 배열된 데이터를 일정 규칙에 따라 배열하는 것을 정렬이라 하는데, 엑셀은 물론이고 글을 비롯한 많은 소프트웨어에 정렬 기능이 있다.


정렬을 하는 방법은 여러 가지가 있는데, 그 중 선택 정렬에 대해 살펴보자.

 

선택 정렬은 정렬되지 않은 데이터들에 대해 가장 작은 데이터를 찾아 가장 앞의 데이터와교환해가는 방식이다. 

그러면 선택 정렬의 동작 과정을 다음 데이터를 이용해서 살펴보자.

 


임의의 리스트에 요소를 원하는 만큼 무작위로 넣고, 선택 정렬 알고리즘을 구현하여 정렬하라

 

# 실행결과

# [10, 20, 30, 40, 50, 60]  (a =[20, 50, 30, 10, 60, 40] 리스트 일 때)

 

 

# 순서도 참고

# 로직 참고

더보기

01 i 값이 0부터 1씩 증가하며 4가 될 때까지 반복해서 실행한다.
02 j 값이 i+1부터 1씩 증가하며 5가 될 때까지 교환 작업을 반복해서 실행한다.
03 a[j]가 a[m]보다 작으면 m에 j 값을 저장한다.
04 a[j]와 a[m]을 교환한다.

 

# 내장 함수 참고 (알아만 두세요, 함수를 배우면 내장함수를 만들 수 있어야 합니다.)

#sort 함수를 이용해서 리스트 요소를 정렬할 수 있다.

#a = [20, 50, 30, 10, 60, 40]
#a.sort()
#print(a)

 

 

예제49

버블 정렬 알고리즘

버블 정렬은 서로 이웃한 데이터들을 비교하며 가장 큰 데이터를 가장 뒤로 보내며 정렬하는 방식이다.

 


임의의 리스트에 요소를 원하는 만큼 무작위로 넣고, 버블 정렬 알고리즘을 구현하여 정렬하라

 

# 실행결과

# [10, 20, 30, 40, 50, 60]  (a =[20, 50, 30, 10, 60, 40] 리스트 일 때)

 

# 순서도 참고

 

# 로직 참고

더보기

01 i 값이 0부터 1씩 증가하며 4가 될 때까지 반복해서 실행한다.
02 j 값이 0부터 1씩 증가하며 5-i-1이 될 때까지 교환을 반복해서 실행한다.
03 a[j]가 a[j+1]보다 크면 a[j]와 a[j+1]을 교환한다.

 

 

예제50

병합 정렬 알고리즘


임의의 리스트 2개에 요소를 원하는 만큼 무작위로 넣고, 병 정렬 알고리즘을 구현하여 정렬하라

 

 

# 실행결과

# [1, 3, 3, 4, 5, 7, 8, 10] (a = [1, 3, 5, 7], b = [3, 4, 8, 10])

 

 

# 순서도 참고

# 소스코드, 로직 

더보기
a = [1, 3, 5, 7]
b = [3, 4, 8, 10]
c = []
i = 0
j = 0
while i<4 and j<4:
	if a[i]<b[j]:
		c.append(a[i])
		i = i+1
	else:
		c.append(b[j])
		j = j+1
if i==4:
	while j<4:
		c.append(b[j])
		j = j+1
	else:
		while i<4:
			c.append(a[i])
			i = i+1
print(c)


# 로직 참고

01 i가 4미만이고 j가 4미만인 동안 반복해서 실행한다.
02 a[i]가 b[j]보다 작으면 c에 a[i]를 추가하고 i 값을 1증가시킨다. 그렇지 않으면 c에 b[j]를 추가하고 j 값을 1증가시킨다.
03 i가 4이면 14~16을 실행하고, 그렇지 않으면 18~20을 실행한다.
04 j가 4보다 작은 동안 c에 b[j]를 추가하고 j 값을 1증가시킨다.
05 i가 4보다 작은 동안 c에 a[i]를 추가하고 i 값을 1증가시킨다.

 

 

 

 

 

과제

과제 33

내림차순으로 정렬된 데이터 집합에 대한 이진 탐색을 하는 순서도와 파이썬 프로그램을 작성하여라.

 

과제 34

삽입 정렬은 다음과 같이 이미 정렬된 부분에서 자신의 위치를 찾아 삽입하며 정렬하는 방식이다. 삽입 정렬을 이용해서 정렬하는 순서도와 파이썬 프로그램을 작성하여라

# 순서도, 소스코드

더보기
a = [3, 7, 2, 8, 5, 1, 10, 9, 4, 6]

for i in range(1, 10):
	key = a[i]
	j = i-1
	while j>=0:
		if key<a[j]:
			a[j+1] = a[j]
		else:
			break
		j = j-1
	a[j+1] = key
print(a)

 

 

 

 

 

 

 

 

 

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.