ASAC 빅데이터 분석가 7기/ASAC 일일 기록

ASAC 빅데이터 분석가 과정 7일차 - 2 (24.12.12)

junslee 2024. 12. 12. 16:21

04_cotest

12_탐색_선수내용_while_재귀_SQ

탐색 --> 최단거리

 

선수내용1. while 반복문!

 

# while은 조건 중심으로 반복을 하는 것!!!
- 특정 조건이 만족할 때 까지 롤링!!!!!
  참고 : for ( 값/ 갯수 중심 )
             while( 조건 중심!!!!)
--> 빠져나갈 조건에 대해서 값/ 조건상황!!!! 직접 본인이 설계!!!
**** 빠져나갈 구조적인 부분을 꼭!! 설계 해야 함!!!


# 예) 1부터 20까지 출력하자!!!!

====> for문 관점 : range(1,21,1) 롤링

for i in range(1,21,1):
    print(i)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

# while 관점 : 조건 중심으로 바라봐야 함!!!

 

# m1) 값을 늘리는 방향으로 설계!!!!!

i = 1 # --> 출력을 위한 변수.
while i<21:
    print(i)
    i += 1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

 

# m2) 다른 설계 방식 : 값을 줄이는 스타일로,,,

i = 20
while i>0:
    print(21 - i)
    i -= 1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

 

# m3) 명확하게 때려치자!!!!

i= 1
while True: # 주구장장 돌아가는 무한루프!!! ---> 제어문에서 break
    print(i)
    i+= 1
    if i ==21:
        break
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

 

# m4) 구조에 미묘한 차이에 따라서 조건 값, 구조가 다를 수 있음!!!

i= 1
while True: # 주구장장 돌아가는 무한루프!!! ---> 제어문에서 break
    print(i)
    if i ==20:
        break
    i+=1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

# 정리 : for--> 주어진/필요한 값 중심 롤링!!
             while --> 특정 조건이 만족할 때 까지 롤링!!!!
                     +++ 빠져나갈 조건 설계!!!!!
                     : 탐색, 최단거리..........
++++ pass, continue, break + if 같이 잘 사용해야 함!!!!


# 사전 내용2) 자료구조형 --> 스케줄링 Stack, Queue

 

기본적인 내용 : 값을 처리하는 방식!!!! ---> 스케줄러 사용방식!!!
===> 새롭게 해야할 일을 추가....
===> 한 것들은 지우거나/제거한다

Stack : 지하철 --> 제일 늦게 탄 사람이 제일 먼저 내린다!!!
             Last In First Out : LIFO
             비유 : 지하철의 출입!!!

              ==> 새로운 것 : 뒤로 쌓아둠 --> .append()

              ==> 처리할 것 : 맨 뒤에서부터 뽑아서 처리 --> .pop()

Queue : 놀이공원매표소 --> 제일 먼저 온 사람이 먼저 들어간다!!!!
              First In First Out : FIFO
              비유 : 놀이공원에서 매표소에서 처리하는 방식!!!!!!    

              ==> 새로운 것 : 뒤로 쌓아둠 --> .append()

              ==> 처리할 것 : 맨 앞에서부터 뽑아서 처리 --> .pop()


a = [1,2,3,4,5]
a
[1,2,3,3,4,5]
a.append(7)
a.append(8)
a
[1,2,3,4,5,7,8]

# 할 일을 추출해서 해결 : ==> stack --> 맨 뒤부터 차출

a.pop()
8
a
[1,2,3,4,5,7]
a.pop()
[1,2,3,4,5]

# 큐

a.append(7)
a.append(8)
a
[1,2,3,4,5,7,8]
a.pop(0)
1
a
[2,3,4,5,7,8]
a.pop(0)
2
a
[3,4,5,7,8]

# 참고) 파이썬의 대표적인 자료형인 리스트로 큐를 구현!!!!

 ====> 파이썬의 언어 종특상 거의 속도 이슈가 걸림!!!!!!
이유 : 제일 앞의 있는 원소 pop(0)
     --> 코테에서는 파이썬으로 queue를 하기 위해서는
          무조건 deque 패키지를 불러서 사용하면 됨!!!
    ==> 코테에서 정규식처럼 거의 그냥 가져다 쓸 수 있는 패키지 중 하나1!!
** 해결책 : deque 패키지를 불러서 deque 자료형을 하면 됨!!!
[ ] ---> deque([])
참고 : 데이터를 처리할 떄 리스트보다 deque 속도가 빨라요!!!


# 사전 지식3 : 재귀 함수!!!!

==> 일반적인 코드, 데이터 분석에서 거의 사용하지 않는 스타일!!!
==> 코테에서는 종종~~~사용됨!!!! 무조건 알아야 함!!!
       why?
       구조적인 반복을 코드화 하기에 유용함!!!!!! --> 코테 코드가 심플!!!!
       DP / DFS ==> 기능 중심으로 심플하게 코드!!!!!!
==> 구조적으로 뭔가 기능이 반복될 때!!!!!!!

 

# 참고) 파이썬에 재귀함수 limit 걸려있음!!!
# ===> whule 종료 조건을 설계!!!!!!!

def recursive_func():
    print("재귀함수에요~~~~")
    recursive_func()
recursive_func()
재귀함수에요~~~~
재귀함수에요~~~~
재귀함수에요~~~~
재귀함수에요~~~~
재귀함수에요~~~~
재귀함수에요~~~~
재귀함수에요~~~~
...
//RecursionError

# 재귀함수 예 ) 4!


# m1) 직접 계산하는 과정 : 4! = 4 * 3 * 2 * 1

 

# 1) for

n = 4
fact = 1
for i in range(1, n+1,1):
    fact *= i
    #print(i)
print(fact)
24

 

# 2) while

n = 4
fact = 1

cnt = 1 # <---- while 빠져나갈 기능적인 세팅!!!!
while cnt <= n:
    fact *= cnt
    cnt += 1 # <--- 종료를 위한 변수 & 필요한 동작.......
print(fact)
24

# 할 일 : 정의가 아니라 기능 중심으로 바라보자!!!
===> 점화식!!
          n! =  n* (n-1)!   // a_n = n * a_n-1       ,1! =1
===> "기능 중심"의 규칙!!!!!!!
===> 바로 코드화!!!

def my_fact(n):
    # 호출 되는 체크
    print("My_Face호출"+ str(n))
    if n<=1:
        return 1 # 1! = 1
    else:
        return n * my_fact(n-1)

==> 기능적인 규칙성을 그냥 코드화 작업이 가능함!!!!
       코드가 상당히 직관적으로 작성이 됨!!!!
==> 규칙성이 있는 것들에 대한 관계 중심으로 코드를 작성하는게 유용!!
       퀵정렬, 탐색(dfs), dp, 규칙적인 부분 구현 : 코테용!!!

my_face(4)
My_Face호출4
My_Face호출3
My_Face호출2
My_Face호출1
24


# 재귀 함수 정리 : Stack처럼 처리를 한다!!!!
                    관점 : 기능 중심의 관계/규칙성을 간단한게 코드화!!!!

# 재귀 함수 : 자기 자신을 계속 호출하는 구조를 사용을 함!!!
                     해결의 순서는 맨 마지막에 호출된 친구부터
                     해결이 순차적으로 이루어져야 문제를 해결할 수 있음!!
              ==> DFS탐색은 Stack형식을 사용해서 탐색을 진행 Algo
                      DFS의 정의대로 구현 or 재귀함수로도 구현이 가능함!!!

               ==> BFS탐색은 Queue형식을 사용해서 탐색을 진행 Algo
                      BFS 정의대로 구현 but 재귀함수로 하면 XXX
                      파이썬에썬에서는 deque


# 사전 지식 4 : 그래프에 대한 코드화 작업


# 기본적인 대상 : 지도, 네트워크 ,연결성
==> 현실적인 현상/대상을 점/선을 추상화!!!!
==> 추상화 되어 있는 그래프들을 어떻게 "코드화"(코드로 표현 방식!!)
1) 행렬 방식으로 표현!!!
2) 리스트 방식으로 표현!!!!


# 탐색 문제 : 모든 경우들을 다 체크하는 문제!!
           ==> 수학적으로 모든 경우의 수를 푸는 문제*****
           ==> 지도가 있는 경우 좀 명확한 문제 유형!!!!
           ==> 그 외 : 평면, 미로, 다양한 유형......
===> 여러 유형의 문제들을 많이 풀고 / 유형 정리!!!!!******
        ( 왜 이 문제가 탐색의 문제인지 파악!!!!)
        ( 여러 탐색의 알고리즘 중에서 어떤 방식이 좋은가 선택!!!)
++++ 중간에 컷 : 백트레킹...


# 무한을 표현 : 연결이 없습니다!!!!

# 방법1) 그냥 엄청 큰 수를 직접 입력!!!
INF = 999999999999999999999999
# 방법2) 명시적으로 파이썬의 무한대 인식!!!! ****
INF = float("inf")
INF
int


m = [
       [0, 7, 5],
       [7, 0, INF],
       [5, INF, 0]
]
m
[[0, 7, 5], [7, 0, inf], [5, inf, 0]]

 

# =--> 0번 도시에서 1번 도시 연결되었나요?

m[0][1]
7

 

# =--> 2번 도시에서 1번 도시 연결되었나요?

m[2][1]
inf

==> 행렬로 표현을 한다면 : 가로줄 --> srtart : 지도[인덱스]
                                             세로줄 --> end    : 지도[st][end]
==> 쌩파이썬의 입장에서 지도를 표현하는 인접행렬방식으로
      :지도[출발점][종료점]

cf) 명시적인 2차원 numpy array, pandas DF, tensor : 다른패키지
    : 지도[출발점, 종료점]


# 인접 리스트 방식 : 연결성만 바라보고 구성--> 컴팩트하게!!!


# --> 인접리스트를 코드화 : 리스트 활용!!!!

g_1 = [
    [(1,7), (2,5)], # --> 0번 도시의 연결 리스트
    [(0,7)],        # --> 1번 도시의 연결 리스트
    [(0,5)]         # --> 2번 도시의 연결 리스트
]
g_1
[[(1, 7), (2, 5)], [(0, 7)], [(0, 5)]]

 

==> 0번 도시하고,1번 도시가 연결이 되어 있나요??????? 얼마인가요?

g_1[0][0][1]

==> 구체적인 연결성에 대한 질문에 있어서는 직접 탐색!!!
       행렬로 표현하는 방식보다는 직관성이 떨어질 수 있음!!!!!

7

# 인접리스트방식으로 코드화 : Dict

g_dict = {
    "0":[ ("1",7), ("2",5)],
    "1":[("0",7)],
    "2":[("0",5)]
}
g_dict
{'0': [('1', 7), ('2', 5)], '1': [('0', 7)], '2': [('0', 5)]}

 

# ==> 0번도시에서 1번 도시가 연결되었나요????

g_dict["0"][0][1]
# --> 연결이 엄청 많고, 도시도 엄청 많다면,,,,, Dict 빠르지 않을까...
7

# 참고) 인접리스트 방식으로 리스트 자료형으로 코드화!!!!!
==> 0번 도시가 없을 수 있음!!!!
       실제 문제 상 도시는 1~3번까지
       : 1-->0, 2-->1, 3--->2
==> 가상의 0번도시를 있다고 가정하고 많이 함!!!!!!

 


g_2 = [
    [],            # --> 가상의 0번 도시를 세팅!!!!
    [(2,7),(3,5)], # --> 1번 도시의 연결 리스트업
    [(1,7)],       # --> 2번 도시의 연결 리스트업
    [(1,5)]        # --> 3번 도시의 연결 리스트업!!!
]
g_2
[[], [(2, 7), (3, 5)], [(1, 7)], [(1, 5)]]
g_1[1-1]
[(1, 7), (2, 5)]
g_2[1]
[(2, 7), (3, 5)]


13_DFS

# DFS 예제 !!

0) 탐색을 지도에서 해야하므로 --> 지도를 코드화!!!!
==> 인접리스트 방식 표현을 하자!!!!
    1) 파이썬 리스트 vs 2) 파이썬 Dict
---> 선택 : 파이썬 리스트!!!!!!
            1번 도시부터네;;;

graph_list = [
    [], # <--- 가상의 0번 도시가 있따고 가정,
    [2,3,8], # <--- 1번 도시의 연결된 도시(직접)
    [1,7],
    ....
    ...
    ....
    ...

]

*** 기본 코테의 앞에 유형에 대한 연습!!

--> 재귀 함수

--> S/Q

--> 지도에 대한 표현!!

 

==> 20일(세미나), 수업!!

*** 퇴실 버튼 체크!!