자료구조_List() 문제풀이

jaam._.mini·2023년 11월 18일
0

📒Python 기초 수학

목록 보기
38/46
post-custom-banner

Python을 공부한지 3주차가 되어 간다🤓

처음엔 모든 것들이 어렵게 느껴졌지만 꾸준히 복습하며 모르는 부분들을 조금씩 보완해 가고 있다.

특히 [자료구조]는 다양한 예제들을 통해 결과 값을 직접 도출해내면서 이전 보다 x3 배로 재미를 느끼는 중이다!!

😂Python...아직은 어렵지만...역시나 재밌다..!

그동안 열심히 학습한 List()를 예제로 복습해보자!



(1) 약수, 소수


Q >
1부터 사용자가 입력한 숫자까지의 약수와 소수를 리스트에 각각 저장하고 이것을 출력하는 프로그램을 만들자

inputNum = int(input('1보다 큰 정수 입력: '))
listA = []
listB = []

for n in range(1, inputNum+1):
    if n == 1:
        listA.append(n)
    else:
        if inputNum % n == 0:
            listA.append(n)

for number in range(2, inputNum+1):
        flag = True
        for n in range(2, number):
            if number % n == 0:
                flag = False
                break

        if flag:
            listB.append(number)

print('약수: {}'.format(listA))
print('소수: {}'.format(listB))        
사용자 입력
약수 저장장소
소수 저장장소

1부터 입력수+1 까지
    1은 모든 수의 약수이기 때문에
        append로 추가
    2서 부터
        사용자 입력수를 n으로 나눠 나머지가 0이면
            inputNum의 약수니까 append로 추가

	2부터 입력수+1
        True로 반복 명령
        2서 부터 number 까지 반복
            이때 n으로 나눠서 나머지가 0이되면(=소수가 아님, 약수가 1과 자기자신 외에는 없는게 소수이기 때문)
                False를 주고
                break를 줘서 빠져나옴

        약수가 아예 없는 경우는 소수이니까
            listB에 append 해준다

약수: [1, 2, 5, 10, 25, 50]
소수: [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47]




(2) random.sample_짝수,홀수


Q >
1부터 100사이에 난수 10개를 생성한 후 짝수와 홀수를 구분해서 리스트에 저장하고 각각의 개수를 출력하는 프로그램을 만들어보자

import random

randomList = random.sample(range(1, 101), 10)
evens = []
odds = []

for n in randomList:
    if n % 2 == 0:
        evens.append(n)
    else:
        odds.append(n)

print('짝수 : {}개'.format(len(evens)))
print('홀수 : {}개'.format(len(odds)))
1. 난수 발생이 필요하므로 random모듈 사용
2. random모듈에서 sample()함수 사용 ; 범위 & 갯수 지정이 가능 
★ 이때 반환 형태 ; list[] type으로 반환

import random

random.sample(range(시작 숫자, 끝 숫자), 갯수)
짝수 리스트
홀수 리스트

반복문을 실행하는데
    2로 나눴을 때 나머지가 0이면 짝수
        짝수 리스트에 추가
    0이 아니면 홀수
        홀수 리스트에 추가

짝수 출력
홀수 출력

짝수 : 6개
홀수 : 4개




(3)random.randint 난수


Q >
다음은 공원 이방료를 나타내내 표이다. 1일 총 입장객이 10명이라고 할때 1일 전체 입장 요금을 구하는 프로그램을 만들자.
단, 입장 고객의 나이는 난수를 이용한다.

import random

visitors = []

for n in range(100):
    visitors.append(random.randint(1,100))

group1, group2, group3, group4, group5 =0,0,0,0,0,
for age in visitors:

        if age >= 0 and age <= 7:
            group1 += 1
        elif age >= 8 and age <= 13:
            group2 += 1
        elif age >= 14 and age <= 19:
            group3 += 1
        elif age >= 20 and age <= 64:
            group4 += 1
        else:
            group5 += 1

group1Price = group1 * 0
group2Price = group2 * 200
group3Price = group3 * 300
group4Price = group4 * 500
group5Price = group5 * 0

print('-'*25)

print('영유아 {}명 : {}원'.format(group1,group1Price ))
print('어린이 {}명 : {}원'.format(group2,group2Price ))
print('청소년 {}명 : {}원'.format(group3,group3Price ))
print('성인 {}명 : {}원'.format(group4,group4Price ))
print('어르신 {}명 : {}원'.format(group5,group5Price ))

print('-'*25)

sum = group1Price + group2Price + group3Price+ group4Price+ group5Price
print('요금 합계 : {}'.format(sum))

print('-'*25)
100회 반복
1~100 사이 숫자를 랜덤으로 뽑아줘

그룹 변수 선언 = 0으로 초기화
각 사람의 연령대 별 나열

-------------------
영유아 1명 : 0원
어린이 6명 : 1200원
청소년 7명 : 2100원
성인 49명 : 24500원
어르신 37명 : 0원
-------------------
요금 합계 : 27800
-------------------




(4)오름차순, 내림차순


Q >
사람 5명의 이름을 리스트에 저장하고 오름차순과 내림찬순으로 정렬

리스트명.sort(reverse=True) = 내림차순

friends = []

for i in range(5):
    friends.append(input('친구 이름 입력 : '))

print(f'friends : {friends}')

friends.sort()
print(f'friends(오름차순) : {friends}')

friends.sort(reverse=True)
print(f'friends(내림차순) : {friends}')

친구 이름 입력 : 오재민
친구 이름 입력 : 강호동
친구 이름 입력 : 유재석
친구 이름 입력 : 박지성
친구 이름 입력 : 박찬호
friends : ['오재민', '강호동', '유재석', '박지성', '박찬호']
friends(오름차순) : ['강호동', '박지성', '박찬호', '오재민', '유재석']
friends(내림차순) : ['유재석', '오재민', '박찬호', '박지성', '강호동']




(5)중복 아이템 제거


Q >
리스트에서 중복아이템(숫자)를 제거하는 프로그램을 만들자

💡 while()을 이용해서 삭제하기

numbers = [2,22,7,8,9,2,7,3,5,2,7,1,3]
print(f'numbers : {numbers}')

idx = 0
while True:
    if idx >= len(numbers):
        break

    if numbers.count(numbers[idx]) >= 2:
        numbers.remove(numbers[idx])
        continue

    idx += 1

print(f'numbers : {numbers}')
if idx >= len(numbers):
→ 길이 만큼 순환, 즉 리스트에 있는 모든 숫자를 반복으로 돌려라


if numbers.count(numbers[idx]) >= 2:
→ 인덱스 0번 부터 반복 시 중복되는 숫자가 2개 이상이면

numbers.remove(numbers[idx])
→ 삭제해라

result: [2, 22, 7, 8, 9, 3, 5, 1]

💡 for()을 이용해서 삭제하기

numbers = [2,22,7,8,9,2,7,3,5,2,7,1,3]

result = []
for number in numbers:
    if number not in result:
        result.append(number)

print('result: {}'.format(result))

result: [2, 22, 7, 8, 9, 3, 5, 1]




(6) 순열; 경우의 수 구하기


Q >
4개의 숫자 중 서로 다른 숫자 2개를 선택해서 만들 수 있는 모든 경우의 수를 출력하는 프로그램을 만들자

💡(일반) 풀이

numbers = [4,6,7,9]
result = []

for n1 in numbers:
    for n2 in numbers:
        if n1 == n2:
            continue

        result.append([n1,n2])

print(f'result : {result}')
print(f'result length : {len(result)}')
if n1 == n2:
→ 뽑은 2개의 숫자가 같으면 의미 없으니까
continue
→ 다시 반복해라

result : [[4, 6], [4, 7], [4, 9], [6, 4], [6, 7], [6, 9], [7, 4], [7, 6], [7, 9], [9, 4], [9, 6], [9, 7]]
result length 가지수 : 12

💡(순열 공식) math, factorial 이용

  • 순열 공식 : n1 / (n-r)!
import math

numbers = [4,6,7,9]

purmutation = math.factorial(len(numbers)) / math.factorial(len(numbers) -2 )
print(f'순열, 팩토리얼 : {purmutation}')

순열, 팩토리얼 : 12.0




⭐(7) 순열; 경우의 수 3개 이상 구하기


Q >
4개의 수사 중 서로 다른 숫자 3개를 선택해서 만들 수 있는 모든 경우의 수를 출력하는 프로그램을 만들자

numbers = [4,6,7,9]
result =[]

for n1 in numbers:
    for n2 in numbers:

            if n1 == n2: continue

            for n3 in numbers:
                if n1 == n3 or n2 == n3: continue

                result.append([n1, n2, n3])

print(f'result : {result}')
print(f'result length 가지수 : {len(result)}')

result : [[4, 6, 7], [4, 6, 9], [4, 7, 6], [4, 7, 9], [4, 9, 6], [4, 9, 7], [6, 4, 7], [6, 4, 9], [6, 7, 4], [6, 7, 9], [6, 9, 4], [6, 9, 7], [7, 4, 6], [7, 4, 9], [7, 6, 4], [7, 6, 9], [7, 9, 4], [7, 9, 6], [9, 4, 6], [9, 4, 7], [9, 6, 4], [9, 6, 7], [9, 7, 4], [9, 7, 6]]
result length 가지수 : 24





출처/참고 : 제로베이스 데이터 스쿨
profile
비전공자의 데이터 공부법
post-custom-banner

0개의 댓글