티스토리 뷰

Data Science

파이썬을 이용한 알고리즘

호기심 많은 직장인 2022. 6. 7. 11:25


728x90

요즘은 취업난에 코딩 테스트도 많고 정말 힘든 시기 인듯하다...

그래도 스스로 노력하고, 준비한다면 언젠가 기회는 찾아올 것이라 생각된다!

모두들 화이팅 하자는 의미로 몇 가지 알고리즘에 대해서 준비해보았다.


첫 번째

1부터 n까지의 합 구하기

  • 합을 기록할 변수를 만들고 0을 저장
  • n을 1부터 1씩 증가하면서 반복
  • 반복문 안에서 합을 기록할 변수에 1씩 증가된 값을 더함
  • 반복이 끝나면 합을 출력
# O(n)
def sum1(n):
    total = 0
    for i in range(1, n+1):
        total += i
    
    return total

# 시간측정
import time

start_time = time.time()

sum1(10000000) # 5050

end_time = time.time()
print("time : ", end_time - start_time)

 

time :  0.45471787452697754

# n(n+1)/2
# O(1)

def sum2(n):
    return int(n*(n+1)/2)

start_time = time.time()

sum2(10000000)

end_time = time.time()
print("time : ", end_time - start_time)

 

time :  0.0

 

하나의 문제로 두 개의 해답을 작성해보았다.

같은 결과를 내는 해답이라도 속도의 측면에서 차이가 있다.

여러분도 서로 비교해가면서 문제를 해결해나가면 좋을 것 같다.


두 번째

중복 데이터 삭제

다음의 결과를 도출해내시오.

names = ["Dave", "David", "Anthony", "David", "Dave"]
find_same_name(names)
결과 : ["Dave", "David", "Anthony"]

  • set 자료형 사용하지 않기
  • del names[인덱스]
# O(n^2)
def find_same_name(name_list):
    for idx, name in enumerate(name_list):
        for idx2 in range(idx+1, len(name_list)):
            if(name == name_list[idx2]):
                del name_list[idx2]
                
    return name_list

 

# O(n)
def find_same_name1(name_list):
    nlist = []
    for i in name_list:
        if i not in nlist:
            nlist.append(i)
    return nlist
 
names = ["Dave", "David", "Anthony", "David", "Dave"]
namelist = find_same_name1(names)
print("결과 : ", namelist)

 

결과 :  ['Dave', 'David', 'Anthony']

세 번째

최댓값 구하기, 최대값 위치 구하기

# O(n)
def find_max(n):
    max_val = n[0]
    length = len(n)
    
    for i in range(1, length):
        if n[i] > max_val:
            max_val = n[i]
    
    return max_val

data = [17, 92, 18, 33, 58, 7, 33, 42]
print(find_max(data))

 

92

 

 
# 위치 구하기

def find_max_idx(n):
    max_idx = 0
    length = len(n)
    
    for i in range(1, length):
        if n[i] > n[max_idx]:
            max_idx = i
    
    return max_idx

data = [17, 92, 18, 33, 58, 7, 33, 42]
print(find_max_idx(data))

 

1

 


네 번째

숫자 야구 프로그램

  • 술래(컴퓨터)는 임의의 숫자 3개를 준비
  • 숫자는 절대 중복되어서는 안된다.
  • 숫자는 1~9까지로 한다.
"""
숫자 야구 게임을 시작합니다.!!!
--------------------------------
정답 : 369
숫자 3자리 입력 : 123
결과 : [0] 스트라이크 [1] 볼 : 123

숫자 3자리 입력 : 345
결과 : [1] 스트라이크 [0] 볼 : 345

숫자 3자리 입력 : 127
결과 : 아웃 :127

숫자 3자리 입력 : 369
결과 : 축하합니다.
횟수 : 3
걸린시간 : 10초
"""

 

import random

number = set()
while len(number)<3:
    number.add(random.randint(1,9))

print(number)
    
listnum = list(number)
com = 100*listnum[0]+10*listnum[1]+listnum[2]

count = 0
strike = 0
ball = 0

print("숫자야구게임을 시작합니다 !!!")
print("---------------------------")

start_time = time.time()

while (strike < 3):
    num = str(input("숫자 3자리를 입력하세요 : "))

    strike = 0
    ball = 0

    for i in range(0, 3):
        for j in range(0, 3):
            if (num[i]==str(listnum[j]) and i==j):
                strike+=1
            elif (num[i] == str(listnum[j]) and i != j):
                ball+=1

    if(strike==0 and ball==0):
        print("결과 : 아웃 : ", num)
    else:
        print("결과 : Strike [",strike, "] Ball : [",ball, "] ", num)
    
    count += 1
print("---------------------------")

end_time = time.time()
print("횟수 : ",count)
print("걸린시간 ", int(end_time - start_time), "초")

 

{9, 2, 3}
숫자야구게임을 시작합니다 !!!
---------------------------
숫자 3자리를 입력하세요 : 923
결과 : Strike [ 3 ] Ball : [ 0 ]  923
---------------------------
횟수 :  1
걸린시간  6 초

import random 
import time


def num_bb():
    start_time = time.time()
    r_num01 = str(random.randrange(1,10))
    r_num02 = str(random.randrange(1,10))
    r_num03 = str(random.randrange(1,10))
    
    while (r_num01 == r_num02):
        r_num02 = int(random.randrange(1, 10))
    while (r_num01 == r_num03 or r_num02 == r_num03):
        r_num03 = int(random.randrange(1, 10))

#여기까지 중복안되게 난수생성하는 문제 해결        
    l_rn= [r_num01, r_num02, r_num03]
    
    t_c, s_c, b_c = 0, 0, 0
    
    print (r_num01, r_num02, r_num03)
    print("숫자야구게임을 시작하겠습니다!!!")
    print("---------------------------")
    
    
    while s_c<3 :
        s_c, b_c = 0, 0
        i_n = str(input("숫자 세자리를 입력하세요 : "))
        for i in range(0,3):
            for j in range(0,3):
                
                if i_n[i] == str(l_rn[j]) and i == j:
                    
                    s_c += 1
                elif i_n[i] == str(l_rn[j]) and i != j:
                    
                    b_c += 1

        print("결과 : [", s_c, "] 스트라이크 [", b_c, "] 볼", "입력숫자 : ", i_n )
        t_c += 1
        
    print("---------------------------")
    end_time= time.time()
    print(t_c, "번 만에 정답을 맞추셨습니다. 끝날때까지 걸린 시간은 ", end_time - start_time )
        

    
num_bb()

 

8 1 7
숫자야구게임을 시작하겠습니다!!!
---------------------------
숫자 세자리를 입력하세요 : 123
결과 : [ 0 ] 스트라이크 [ 1 ] 볼 입력숫자 :  123
숫자 세자리를 입력하세요 : 456
결과 : [ 0 ] 스트라이크 [ 0 ] 볼 입력숫자 :  456
숫자 세자리를 입력하세요 : 817
결과 : [ 3 ] 스트라이크 [ 0 ] 볼 입력숫자 :  817
---------------------------
3 번 만에 정답을 맞추셨습니다. 끝날때까지 걸린 시간은  34.036991119384766

import random

# 난수 생성
num = [1, 2, 3, 4, 5, 6 ,7, 8 ,9]

ran1 = random.randint(0,8)
num1 = str(num.pop(ran1))

ran2 = random.randint(0,7)
num2 = str(num.pop(ran2))

ran3 = random.randint(0,6)
num3 = str(num.pop(ran3))

number = [num1, num2, num3]
print(number)

# 값 초기화
try_cnt = 0 
strike_cnt = 0 
ball_cnt = 0 

print("숫자야구게임을 시작합니다")
print("---------------------------")
start_time = time.time()
while(strike_cnt < 3):
    num_input = str(input("숫자 3자리 입력 : "))
    
    strike_cnt = 0
    ball_cnt = 0
    
    for i in range(0, 3):
        for j in range(0, 3):
            if num_input[i] == str(number[j]) and i == j: #Strike 카운터
                 strike_cnt += 1
            
            elif num_input[i] == str(number[j]) and i !=j: #Ball 카운터
                ball_cnt += 1
        
    print("결과:", "[", strike_cnt, "]","Strike", "[", ball_cnt, "]", "Ball")
    try_cnt += 1 


print(try_cnt, "번 만에 맞추셨습니다!")
end_time = time.time()
print("걸린 시간", round(end_time - start_time), "초")

 

['2', '4', '7']
숫자야구게임을 시작합니다
---------------------------
숫자 3자리 입력 : 123
결과: [ 0 ] Strike [ 1 ] Ball
숫자 3자리 입력 : 742
결과: [ 1 ] Strike [ 2 ] Ball
숫자 3자리 입력 : 247
결과: [ 3 ] Strike [ 0 ] Ball
3 번 만에 맞추셨습니다!
걸린 시간 22

# 0이 나오면 안됨
import random
import time

numlist = list(range(0, 9))
com = random.sample(numlist, 3)
print(com)

trynum = 0

start_time = time.time()

while True :
    answer = int(input("서로 다른 세 개의 숫자를 입력하세요! "))
    fst_ans = answer // 100
    snd_ans = (answer-fst_ans*100) // 10 
    trd_ans = answer % 10
    ans_list = [fst_ans, snd_ans, trd_ans]
    strike = 0
    ball = 0
    trynum += 1

    if ans_list == com :
        print(answer, " : 정답♥")
        print("시도 횟수 : ", trynum, "회")
        break
    else :
        for i in range(0, 3) :
            if ans_list[i] == com[i] :
                strike += 1
            elif ans_list[i] in com :
                ball += 1
    
    if strike+ball > 0 :
        print(answer, " : ", strike, "스트라이크", ball, "볼")  
    else :
        print(answer, " : ", "아웃")

end_time = time.time()
print("걸린 시간 : ", int(end_time - start_time), "초")

 

[8, 0, 4]
서로 다른 세 개의 숫자를 입력하세요! 123
123  :  아웃
서로 다른 세 개의 숫자를 입력하세요! 456
456  :  0 스트라이크 1 볼
서로 다른 세 개의 숫자를 입력하세요! 804
804  : 정답♥
시도 횟수 :  3 회
걸린 시간 :  41 초

import random

# 정답 생성
answer = []        
while len(answer) < 3:
    numbers = random.randint(1, 9)
    
    if str(numbers) not in answer:
        answer.append(str(numbers))

print(answer)

user_input = []
strike = 0
ball = 0
cnt = 0
starttime = time.time()

print("   숫자 야구 게임을 시작합니다 !  ")
print("==================================")

# 스트라이크 볼 잡기
while strike < 3:
    
    user_input = str(input("숫자 3자리를 입력하세요 : "))
    
    strike = 0
    ball = 0
    
    for i in range(3):
        for j in range(3):
            if (answer[i] == user_input[j]) and (i == j):
                strike += 1
            elif (answer[i] == user_input[j]) and (i != j):
                ball += 1
    
    # 결과
    if strike == 3:
        print("결과 : 정답입니다 !\n")
    elif strike==0 and ball==0:    
        print("결과: 아웃 !")
    else:
        print("결과 : ",strike, "스트라이크 ",ball,"볼\n"  )
    
        
    cnt += 1

endtime = time.time()
    
print("시도 횟수 : ",cnt,"번")
print("걸린 시간", endtime-starttime)  

 

['8', '1', '2']
   숫자 야구 게임을 시작합니다 !  
==================================
숫자 3자리를 입력하세요 : 123
결과 :  0 스트라이크  2 볼

숫자 3자리를 입력하세요 : 812
결과 : 정답입니다 !

시도 횟수 :  2 번
걸린 시간 7.9829559326171875

import random

com = [i for i in range(3)]

# 중복처리, 임의의 숫자, 1~9
i = 0
while(i < 3):
    com[i] = str(random.randrange(1, 9, 1))
    
    if(i==1):
        if(com[i] == com[i-1]):
            i -= 1
            
    if(i==2):
        if(com[i] == com[i-1] or com[i] == com[i-2]):
            i -= 1
            
    i += 1
    
print(com)

print("숫자 야구를 시작합니다!!")
print("--------------------------")

strike = 0
ball = 0
while(True):
    user = str(input("숫자 3자리 입력 : "))
    strike, ball = 0,0
    
    if(user == ""):
        print("\n다시 입력해 주세요\n")
        continue
        
    if(len(user) != 3):
        print("\n숫자 3자리만 입력하세요\n")
        continue
        
    if(user.isalpha()):
        print("\n숫자만 입력하세요\n")
        continue
    
    for i in range(3):
        if (com[i] == user[i]):
            strike += 1
            
    if(com[0] == user[1] and com[0] == user[2]):
        ball += 1
        
    if(com[1] == user[0] and com[1] == user[2]):
        ball += 1
        
    if(com[2] == user[1] and com[2] == user[0]):
        ball += 1
        
    if strike == 3:
        print("축하합니다.")
        break
    elif strike == 0 and ball == 0:
        print("아웃 : ", user)
    else:
        print("{}스트라이크 {}볼".format(strike, ball))

다양한 방법으로 숫자 야구 프로그램을 만들어보았다.

사람마다 생각하는 부분이 다르기 때문에 코드 또한 천차만별이다.


마지막

피보나치수열

피보나치수열은 0과 1로 시작되며, 다음 피보나치 수는 바로 앞의 두 피보나치 수의 합이 된다.

0 1 1 2 3 5 8 13 21 34 55 ...

def Fibonacci_sequence(n):
    FS = []
    a1, a2=0, 1
    FS.append(a1)
    FS.append(a2)
    
    for i in range(n-2):
        a3 = FS[i] + FS[i+1]
        FS.append(a3)
    print("피보나치 수열 : ", FS)
    
Fibonacci_sequence(15)

 

피보나치 수열 :  [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377]

def Fibo(n):
    F = [0.1]
    a,b = 0,1
    
    for i in range(1,n-1):
        a,b = b, a+b
        F.append(b)
    print("피보나치 수열 : ", F)
    
Fibo(15)

 

피보나치 수열 :  [0.1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377]

a = 0
b = 1

for _ in range(0,10):
    print(a)
    temp = a
    a = b
    b = temp + b

 

0
1
1
2
3
5
8
13
21
34

피보나치수열은 알고리즘에서 많이 나오는 문제라고 들었다.

한 번쯤 들어본 사람도 많이 있을 것이라 생각된다.

간단하게 알고리즘에 대해 풀어보았으니 또 복습하고 새로운 알고리즘에 대해서 학습해야겠다!

그럼 다음 시간에~~ 안녕!!

 

728x90
반응형