전공정리/알고리즘

[알고리즘] 파이썬 기초

HU_717 2023. 2. 3. 16:25

문제 1 ) 10개의 수를 입력받아 리스트(list)에 저장하시오.

  • 리스트의 원소를 역순(reverse)으로 출력하시오
  • 10개의 수 중 최댓값을 찾고 최댓값의 위치(인덱스)를 출력하시오
#10개 숫자 입력 및 리스트로 생성
num_list = list(map(int, input().split()))
print(" list :", num_list)

#10개 숫자 역순으로 출력
reverse_list=num_list[::-1]
print("reverse :",reverse_list)

#최댓값 및 인덱스 출력
count=0
for num in num_list:
    if count < num:
        count = num

for num_index in range(0,len(num_list)):
    if num_list[num_index] == count:
        print('max :', count, ', index :',num_index)

문제 2 ) 0부터 100사이의 수를 입력 받은 후, 등급을 출력하시오.


print("0부터 100 사이의 수를 입력하시오")
score=int(input())

if 100>=score>=90:
    print('등급 : A')

elif 90>score>=80:
    print('등급 : B')

elif 80>score>=70:
    print('등급 : C')

else:
    print('등급 : D')

문제 3 ) 0부터 100사이의 임의의 정수 50개를 생성한 후, 동일한 값의 존재 유무를 확인하는 알고리즘을 구현하시오.

#random 모듈 사용
import random

#0부터 100사이의 임의의 정수 50개 생성
random_num = []

for i in range(1,50):
    num=random.randint(0,101)
random_num.append(num)
print('임의 정수 50개 :',random_num)

#set함수 사용, 처음과 두번째 비교하는 반복문을 사용했더니 바로 옆에 있는 것들끼리 비교됨
#동일한 값 존재 유무 확인
if len(random_num)==len(set(random_num)):
    print(" 동일 값 유무 : X")
else:
    print(" 동일 값 유무 : O")

문제 4 ) 입력 받은 임의의 양의 정수가 정수가 소수인지 아닌지 판별하는 알고리즘을 구현하시오.

#양의 정수 입력 받기
a = int(input("양의 정수를 입력하시오 : "))

#리스트 생성하기
list_a=[]

#입력 받은 수의 약수 구하기
for i in range(1,a+1):
    if a%i == 0:
        list_a.append(i)

#약수가 2개만 존재할시 소수
if len(list_a) == 2:
    print("해당 수는 소수입니다.")

#약수가 2개가 아닌 수만큼 존재할 시 소수가 아님
else:
    print("해당 수는 소수가 아닙니다.")

문제 5 ) for문을 사용하여 다음과 같이 출력하시오.

![[스크린샷 2022-10-11 오전 11.33.34.png]]

#삼각형 만들기
for top in range(6):
    print(" "*(5-top)+"*"*((2*top)-1))

for down in range(5):
    print(" "*(down)+"*"*(9-(2*down)))

문제 6 ) 패턴을 압축하는 알고리즘을 구현하시오.

  • 예시 : aabbaabbcaabc -> a2b2a2b2c1a2b1c1
#패턴 입력
i_pattern = input("문자열을 입력하시오 : ")

#패턴 리스트로 변환
l_pattern = list(i_pattern)
p_pattern = ""
c_pattern = 1

#패턴 리스트 index 0부터 바로 옆 비교하면서 count해주기
for i in range(1, len(l_pattern)):
    if l_pattern[i-1] == l_pattern[i]:
        c_pattern = c_pattern+1

elif l_pattern[i-1] != l_pattern[i]:
    p_pattern = p_pattern + l_pattern[i-1] + str(c_pattern)
    c_pattern = 1

if i == len(l_pattern) -1 :
    p_pattern = p_pattern + l_pattern[i] + str(c_pattern)

p_pattern

문제 7 ) 키보드로부터 다음의 조건을 만족하도록 문자를 입력 받고, 대소문자를 변환하는 알고리즘을 구현하시오

  • 문자열에는 반드시 특수문자, 소문자, 대문자, 숫자가 포함되어야 한다.
  • 위의 조건을 하나라도 만족하지 못하는 경우, 만족할 때까지 재입력을 받는다 -- 무한루프
  • 특수문자 및 숫자는 그대로 놔두고, 소문자는 대문자로, 대문자는 소문자로 변환하여 출력한다.
  • 단, lower(), upper()등의 문자열 메서드(method)는 사용하지 말고, ASCII Code표를 참고하여 대소문자 관계를 활용하여 직접 구현하시오.
#무한루프
while True:
#문자 입력하기
#대문자, 소문자 변환
    text = input("문자를 입력하시오 : ")
    print(" 변환된 값 : ", end='')

    for data in range(len(text)) :    
        if 65<=ord(text[data])<=90:
            print(chr(ord(text[data])+32), end='')
        elif 97<=ord(text[data])<=122:
            print(chr(ord(text[data])-32), end='')
        else:
            print(text[data], end='')

    #변수 선언
    count_1=0
    count_2=0
    count_3=0
    count_4=0

#대문자, 소문자, 특수문자, 소문자인 경우 break
    for find in text:
        if ord(find)>=48 and ord(find)<=57:
            count_1 =+ 1
        elif ord(find)>=65 and ord(find)<=90:
            count_2 =+ 1
        elif (1|2|3|4|5|6|7|8|9|0):
            count_3 =+ 1

    if count_1 >= 1:
        if count_2 >= 1:    
            if count_3 >= 1:
break
#ascii 소문자랑 대문자 차이 숫자 간격(32) 확인하면 될듯
#ord : ASCII코드 값으로 변환
#chr : ASCII코드를 문자로 변환

문제 8 ) 1부터 100사이의 자연수가 적힌 N장의 카드가 있습니다. 같은 숫자의 카드가 여러 장 있을 수 있습니다.

  • 이 중 3장을 뽑아 각 카드에 적힌 수를 합한 값의 모든 경우의 수를 기록합니다.
  • (중복된 합한 값은 1개의 값으로 기록한다.)
  • 이 중 K번 째로 큰 수를 출력하세요.
import random
from itertools import combinations

#1부터 100사이의 자연수가 적힌 N장의 카드 & K번째 입력
N = int(input("카드 갯수 : "))
K = int(input("K번 째 카드 : "))

#N장의 카드 랜덤 추출
random_num = []
for i in range(0,N):
    num=random.randint(1,101)
    random_num.append(num)
print("카드 추출 :",random_num)

#3개씩 합치는 경우의 수(조합)
num_3 = list(combinations(random_num,3))
result_num = []
sum = 0

for i in range(0,len(num_3)):
    for j in num_3[i]:
        sum = sum+j
    result_num.append(sum)

print("카드 합 모든 경우의 수 :",result_num)
#K번 째로 큰 수
count_k=K-1
print(K,"번 째로 큰 수 :",result_num[count_k])