728x90

728x90

arr 라는 리스트에 n개의 정수를 입력 받을때

1. 가장 원시적인 방법 (temp 변수에 받아 리스트에 append.)

for i in range(n):
    a = int(input())
    arr.append(a)

2. 바로 배열에 입력(append의 매개 변수로 input()전달)

for _ in range(n):
    arr.append(int(input()))

 

3.  For 문이 내포된 리스트 입력

arr = [int(input()) for _ in range(int(n))]

 

*4. For 문이 내포된 2차원 입력 (2차원 배열)

n = int(input())
a = [[*map(int, input().split())] for _ in range(n)]

 

C 언어스러운 사고방식을 버리고 Python스러운 코드작성을 위해 노력하는중.

728x90

1. max(0, n) : 최대값 함수를 이용해 0과 비교하면 양수는 그대로 나오고 음수는 0으로 대체되어 나온다.

 

2. (abs(n) + n )/2 : 절대값 n 과 n을 더한뒤 2로 나누면, 양수는 그대로 나오고 음수는 0으로 대체되어 나온다.

728x90
from typing import Any, Sequence


def bin_search(a: Sequence, key: Any) -> int:
    a.sort()  # 이진 탐색은 정렬된 배열을 탐색할때 가장 빠르다. 받아온 배열을 정렬.
    pl = 0  # p left 는 인덱스 0 에서 부터 시작
    pr = len(a) - 1  # p right 는 가장 마지막 인덱스 에서 시작

    while True:
        pc = (pl + pr) // 2  # p center은 가운데 인덱스 에서 시작
        if a[pc] == key:  # 검색값이 a배열의 중앙 요소와 같으면
            return 1  # 1 반환
        elif a[pc] < key:  # 검색값이 a배열 중앙 요소 보다 작으면
            pl = pc + 1  # 새로운 p left 인덱스를 중앙인덱스 보다 오른쪽으로 옮겨줌 (우측 탐색)
        else:
            pr = pc - 1  # 검색값이 a배열 중앙 요소 보다 크면, 새로운 p right 인덱스를 중앙인덱스 보다 왼쪽으로 옮겨줌 (좌측 탐색)
        if pl > pr:  # p left 인덱스와, p right 인덱스가 교차하면, 배열안에 검색값이 없다는 뜻
            return 0


num = int(input('원소 수를 입력하세요 : '))
x = [None] * num

print('배열 데이터 입력')

for i in range(num):
    x[i] = int(input(f'x[{i}] : '))

ky = int(input('검색 할 값을 입력하세요 : '))

idx = bin_search(x, ky)

if idx == 0:
    print('검색값을 갖는 원소가 존재하지 않습니다.')
else:
    print(f'검색값이 있습니다.')

 

이진 탐색의 조건 : 탐색 대상의 데이터가 정렬된 상태여야 한다.

 

이진 탐색의 종료 조건

    1.  a[중앙인덱스] == key 일때

    2. 검색 범위가 더 이상 없을 경우 : p left 와 p right 가 크로스 될 경우

728x90
import copy


def seq_search(seq, key):
    print("검색 함수 호출됨!")
    a = copy.deepcopy(seq)
    a.append(key)  # 보초키를 추가 (검색할 값을 마지막 인덱스에 추가)
    print(f'복사되어 보초값 추가된 배열 by.deepcopy : {a}')

    k = 0
    while True:  # k 값을 추가 시키면서 탐색 대상 배열 순회
        # print("seq_search : While Loop 진입")
        print(f'탐색중인 인덱스 : {k}')
        if a[k] == key:
            break
        k += 1
    return -1 if k == len(seq) else k
    # 있으면 해당 값의 인덱스 값을 반환 (배열 길이와 비교하여 나온 값이 보초키값일 경우는 -1 반환)


num = int(input("원소 수를 입력하세요 : "))
x = [None] * num  # 원소 수가 num인 배열을 생성

for i in range(num):
    x[i] = int(input(f'x[{i}] : '))

ky = int(input('검색할 값을 입력하세요 : '))

idx = seq_search(x, ky)

if idx == -1:
    print("검색값을 갖는 원소가 존재하지 않습니다.")
else:
    print(f"검색값은 x[{idx}]에 있습니다.")

 

선형 탐색은 탐색시 마다 2가지 종료 조건을 체크 하게 된다

    1. 검색값이 없을 때 : 즉 검색 대상 배열의 끝 도달

    2. 검색 값이 있을 때

 

보초법(Sentinel Method)를 사용하면, 검색할 키값을 대상 배열의 끝에 미리 추가 해둔뒤

원본 검색 대상 배열의 원래 인덱스 크기 보다 검색된 키 값이 있는 배열의 인덱스 크기가 더 크면

검색값이 없는 것으로 취급하는 방법으로 매 탐색 if 분기중 검색값이 없을때를 제외시킴으로 검색 비용을 감소 시킬 수 있다

728x90

728x90

728x90

728x90

728x90

728x90

728x90

728x90

728x90

 

크래프톤 정글 1주차 알고리즘 커리큘럼에 들어가기 앞서 파이썬 문법에 대해 조금 더 공부해야겠다는 생각이 들었다.

 

대다수 동기들은 코딩 학원이나 여타 교육기관을 통해 "파이썬"을 어느정도 공부하고 들어온 분들이 대다수였다.

 

 

전공자로서 파이썬을 다뤄보지 않은 것은 아니지만,

 

학부 3,4학년 즈음 신설된 데이터분석시각화,빅데이터 시스템 설계 등의 과목에서

 

pandas 와 matplotlib, numpy 등의 라이브러리를 사용해보고

 

졸업작품에서 OpenCV 기반의 얼굴인식 프로그램을 위해 간략하게 다뤄본것이 전부였기 때문에

 

파이썬 전반의 자세한 문법과, 함수사용법, 자료형에 대해 익숙하지 않았기에 파이썬 기본서를 찾아보게 되었다.

 

 

그러던 중 찾게 된 서적은 한빛미디어, 윤인성 저의 혼자 공부하는 파이썬.

 

https://bit.ly/3fjh70m

 

혼자 공부하는 파이썬(개정판)

어쩌다가 책을 집필/번역하기 시작해서 지금까지 계속해서 집필/번역하고 있다. 현재 직업 특성상 집에서 나갈 이유가 없다는 것에 매우 만족하고 있다. 커피와 홍차를 즐겨 마신다. 요리, 피아

books.google.co.jp

 

Google 도서에서 15,840원에 구매 할 수 있으며

 

기본적인 파이썬 공부 환경 세팅 부터 시작하여

 

1. 자료형

2. 조건문

3. 반복문

4. 함수

5. 예외 처리

6. 모듈

7. 클래스

 

로 구성된 큰 챕터로 중간중간 파이썬 코딩에 대한 꿀팁과 리스트, 딕셔너리, 튜플과 각종 반복문/조건문을 조합하여

 

"파이썬" 스러운 코드를 짜는 방법을 자연스럽게 알려주는 책이다.

 

C언어와 같은 기본적인 프로그래밍 언어에 대한 기초 지식과 파이썬을 간단하게나마 다루어 보았던 사람이라면

 

3~4일정도면 완독이 가능할 듯 하며

 

피보나치 수열, 팩토리얼, 하노이의 탑 등 파이썬을 이용한 기본적인 알고리즘 문제들도

 

챕터 내용 사이에 자연스럽게 녹여둔 서적으로

 

파이썬을 공부하는 사람이라면 소장하고 있으면 앞으로 몇번씩은 되짚어볼 서적이라고 생각된다.

 

+ Recent posts