Day38. 자료문풀 (2)

Junghwan Park·2023년 5월 27일
0

스터디노트

목록 보기
38/54

[연습문제] 튜플(01)

  • [연습문제] 튜플(01)
  • 자주 접속하는 웹사이트 비번을 튜플에 저장해보자!
passwds = ('password1234', 'abc123', 'qwerty', 'letmein', 'welcome00')
print(type(passwds))
  • 대학생 길동이의 1, 2, 3학년의 성적은 다음과 같다.
    졸업할 때 4.0이상의 학점을 받기 위해 길동이가 받아야 하는 4학년 1 2학기의 최소 학점을 구해보자!
scores = ((3.7, 4.2), (2.9, 4.3), (4.1, 4.2))
total = 0

for s1 in scores:
          for s2 in s1:
              total += s2

avg = round((total / 6), 1)

print(f'3학년 총학점 : {round(total, 1)}')
print(f'3학년 평균 : {avg}')

grade4TargetScore = round((4.0 * 8 - total), 1)
print(f'4학년 목표 총학점 : {grade4TargetScore}')

minScore = round((grade4TargetScore / 2), 1)
print(f'4학년 한 학기 최소학점 : {minScore}')

scores = list(scores)
scores.append((minScore, minScore))
print(f'scores : {scores}')

scores = tuple(scores)
print(f'scores : {scores}')

[연습문제] 튜플(02)

  • [연습문제] 튜플(02)
  • 다음 2개의 튜플에 대해서 합집합과 교집합을 출력해보자!


    tuple1 = (1, 3, 2, 6, 12, 5, 7, 8)
    tuple2 = (0, 5, 2, 9, 8, 6, 17, 3)

방법1

### 방법1 ###
tuple1 = (1, 3, 2, 6, 12, 5, 7, 8)
tuple2 = (0, 5, 2, 9, 8, 6, 17, 3)

tempHap = list(tuple1)  # 수정을 위해 튜플을 리스트로 변경해 준다!
tempGyo = list()

for n in tuple2:
    if n not in tempHap:
        tempHap.append(n)
    else:
        tempGyo.append(n)

tempHap = tuple(tempHap)  # 수정이 완료 되었으니 다시 튜플로 변경해 준다!
tempGyo = tuple(tempGyo)

print('합집합(중복X)\t: {}'.format(tempHap))
print('교집합\t: {}'.format(tempGyo))

방법2

### 방법2 ###
tuple1 = (1, 3, 2, 6, 12, 5, 7, 8)
tuple2 = (0, 5, 2, 9, 8, 6, 17, 3)

tempHap = tuple1 + tuple2   # + 로 합집합!
tempGyo = list()

tempHap = list(tempHap)

print(f'tempHap : {tempHap}')
print(f'tempGyo : {tempGyo}')

idx = 0

while True:

    if idx >= len(tempHap):
        break

    if tempHap.count(tempHap[idx]) >= 2:    # 2개 이상이라는 것은 중복이라는 것!
        tempGyo.append(tempHap[idx])
        tempHap.remove(tempHap[idx])
        continue

    idx += 1

print(f'tempHap : {tempHap}')
print(f'tempHap : {tuple(sorted(tempHap))}')   # 정렬 + 튜플로 변환

print(f'tempGyo : {tuple(sorted(tempGyo))}')

[연습문제] 튜플(03)

  • [연습문제] 튜플(03)
  • 다음 튜플을 요구 사항에 맞춰 아이템을 슬라이스하자!


    Index 0부터 3까지
    Index 2부터 4까지
    Index 3부터 끝까지
    Index 2부터 뒤에서 -2까지
    Index 0부터 끝까지 3단계
numbers = (8.7, 9.0, 9.1, 9.2, 8.6, 9.3, 7.9, 8.1, 8.3)

# Index 0부터 3까지
print(numbers[0:4])

# Index 2부터 4까지
print(numbers[2:5])

# Index 3부터 끝까지
print(numbers[3:])

# Index 2부터 뒤에서 -2까지
print(numbers[2:-2])
print(numbers[2:-1])    # -2까지니까 -1로 해야한다!

# Index 0부터 끝까지 3단계
print(numbers[::3])


# 최소값과 최대값을 구할 때!
print(f'최소값 : {min(numbers)}')  # min()함수 사용!
print(f'최대값 : {max(numbers)}')  # max()함수 사용!

# 최고값과 최대값의 인덱스를 알고 싶을 때!
print(f'최소값 인덱스 : {numbers.index(min(numbers))}')  # index() 함수 사용!
print(f'최대값 인덱스 : {numbers.index(max(numbers))}')  # max()함수 사용!
  • 시험 점수를 입력한 후 튜플에 저장하고 과목별 학점을 출력해보자!
korScore = int(input('국어 점수 입력 : '))
engScore = int(input('영어 점수 입력 : '))
matScore = int(input('수학 점수 입력 : '))
sciScore = int(input('과학 점수 입력 : '))
hisScore = int(input('국사 점수 입력 : '))

scores = ({'kor':korScore},
          {'eng':engScore},
          {'mat':matScore},
          {'sci':sciScore},
          {'his':hisScore}
          )

print(scores)

for item in scores:
    for key in item.keys():
        if item[key] >= 90:
            item[key] = 'A'
        elif item[key] >= 80:
            item[key] = 'B'
        elif item[key] >= 70:
            item[key] = 'C'
        elif item[key] >= 60:
            item[key] = 'D'
        else:
            item[key] = 'F'

print(scores)   # 튜플안에 있는 딕셔너리의 수정이므로 수정이 가능하다!

[연습문제] 튜플(04)

  • [연습문제] 튜플(04)
  • 다음 튜플의 과일 개수에 대해서 오름차순 및 내림차순으로 정렬해보자!
fruits = ({'수박':8}, {'포도':13}, {'참외':12}, {'사과':17}, {'자두':19}, {'자몽':15})

fruits = list(fruits)   # 튜플은 변경, 수정이 불가하므로 리스트로 변경 해준다!

cIdx = 0    # current Index 현재 비교를 위해 선택되어 있는 녀석!
nIdx = 1    # next Index cIdx 뒤에 위치한 녀석으로 비교할 녀석
eIdx = len(fruits) -1   # 마지막 인덱스 값

flag = True

while flag:
    curDic = fruits[cIdx]   # cIdx가 0 이므로 curDic에 첫번째가 들어간다!
    nextDic = fruits[nIdx]

    # value값으로 비교를 해야하므로 value값을 꺼내보자!
    curDicCnt = list(curDic.values())[0]    # 해당 딕셔너리의 과일 개수
    nextDicCnt = list(nextDic.values())[0]    # 해당 딕셔너리의 과일 개수

    if nextDicCnt < curDicCnt:  # next가 cur보다 작으면 next를 앞으로!
        fruits.insert(cIdx, fruits.pop(nIdx))   # 자리바꿈
        nIdx = cIdx + 1
        continue

    nIdx += 1
    if nIdx > eIdx:  # 끝 인덱스까지 했으면 current Idx를 하나 올려준다!
        cIdx += 1
        nIdx = cIdx + 1

        if cIdx == 5:    # 끝까지 다 했으면 종료!
            flag = False

print(tuple(fruits))


cIdx = 0    # current Index 현재 비교를 위해 선택되어 있는 녀석!
nIdx = 1    # next Index cIdx 뒤에 위치한 녀석으로 비교할 녀석
eIdx = len(fruits) -1   # 마지막 인덱스 값

flag = True

while flag:
    curDic = fruits[cIdx]   # cIdx가 0 이므로 curDic에 첫번째가 들어간다!
    nextDic = fruits[nIdx]

    # value값으로 비교를 해야하므로 value값을 꺼내보자!
    curDicCnt = list(curDic.values())[0]    # 해당 딕셔너리의 과일 개수
    nextDicCnt = list(nextDic.values())[0]    # 해당 딕셔너리의 과일 개수

    if nextDicCnt > curDicCnt:  # next가 cur보다 작으면 next를 앞으로!
        fruits.insert(cIdx, fruits.pop(nIdx))   # 자리바꿈
        nIdx = cIdx + 1
        continue

    nIdx += 1
    if nIdx > eIdx:  # 끝 인덱스까지 했으면 current Idx를 하나 올려준다!
        cIdx += 1
        nIdx = cIdx + 1

        if cIdx == 5:    # 끝까지 다 했으면 종료!
            flag = False

print(tuple(fruits))


# 매우 어렵다 다시 꼭 복습!

매우 어렵다 다시 꼭 복습!


[연습문제] 튜플(05)

  • [연습문제] 튜플(05)
  • 학급별 학생 수를 나타낸 튜플을 이용해서, 요구 사항에 맞는 데이터를 출력하는 프로그램을 만들어보자!


    전체 학생 수
    평균 학생 수
    학생 수가 가장 적은 학급
    학생 수가 가장 많은 학급
    학급별 학생 편차
studentCnt = ({'cls01':18},
              {'cls02':21},
              {'cls03':20},
              {'cls04':19},
              {'cls05':22},
              {'cls06':20},
              {'cls07':23},
              {'cls08':17})

totalCnt = 0
minStdCnt = 0   # 가장 작은 학생수
minCls = ''  # 가장 작은 학생수 학급
maxStdCnt = 0   # 가장 많은 학생수
maxCls = ''  # 가장 많은 학생수 학급
deviation = []  # 편차

for idx, dic in enumerate(studentCnt):  # 인덱스와 딕셔너리 뽑아내기
    for k, v in dic.items(): # 딕셔너리의 아이템에서 key와 value뽑아내기
        totalCnt += v   # 총 학생수

        if minStdCnt == 0 or minStdCnt > v:   # 학생수 가장 작은!  # minStdCnt 초기값이 0이므로 !
            minStdCnt = v
            minCls = k

        if maxStdCnt < v:   # 학생수 가장 많은!
            maxStdCnt = v
            maxCls = k


avgCnt = totalCnt / len(studentCnt)
print(f'전체 학생 수 : {totalCnt}')
print(f'평균 학생 수 : {avgCnt}')
print(f'학생 수가 가장 적은 학급 : {minCls}({minStdCnt})명')
print(f'학생 수가 가장 많은 학급 : {maxCls}({maxStdCnt})명')

# 편차 구하기

for idx, dic in enumerate(studentCnt):
    for k, v in dic.items():
        deviation.append(v -avgCnt)

print(f'학급별 학생 편차 : {deviation}')

profile
안녕하세요 반갑습니다^^

0개의 댓글