info) 서브세션 3주차


[문제 1] While문을 활용하여 달러, 원화, 유로의 환산표를 만드는 프로그램을 작성하시오.

참조) • 1$당 환율 : 1443원(원화), 1.02€(유로)

from IPython.display import Image
Image("screenshot.png", width = 300)

[풀이]

import numpy as np

print("-" * 30)
print("달러($)  원화(원)  유로(€)")
print("-" * 30)
d = 10
while d <= 100:
    print("{}       {}        {}".format(d, d*1440, np.round((d*1.02), 1)))
    d = d + 10
print("-" * 30)

[문제2] 세 정수를 입력받아 중앙값을 리턴하는 함수를 작성하시오.

median3(a, b, c)

[풀이1]

def median3(a, b, c):
    num_list = []
    num_list.append(a)
    num_list.append(b)
    num_list.append(c)
    num_list.sort()
    result = num_list[1]
    return result
median3(245, 23, 198)

[풀이2]

def median(a, b, c):
    if a >= b:
        if b >= c:
            return b
        elif a <= c:
            return a
        else:
            return c
    elif a >= c:
        return a
    elif b <= c:
        return b
    else:
        return c
median(9, 7, 8)

[문제3] 리스트내에서 중앙값을 리턴하는 함수를 작성하시오.

median_list(num_list)

< 검증 데이터 >

even_len = [8, 46, 9, 83, 20, 37, 3, 43, 19, 96]
odd_len = [49, 5, 67, 39, 61, 92, 71, 57, 58, 2, 89]

median_list(even_len) 결과 ⇒ 28.5
medain_list(odd_len) 결과 ⇒ 58

[풀이]

def median_list(num_list):
    num_list.sort()
    if len(num_list) % 2 == 0:
        result = (num_list[len(num_list) // 2] + num_list[(len(num_list) // 2) - 1]) / 2
    else:
        result = num_list[len(num_list) // 2]
    return result
even_len = [8, 46, 9, 83, 20, 37, 3, 43, 19, 96]
odd_len = [49, 5, 67, 39, 61, 92, 71, 57, 58, 2, 89]

print("np.median() 사용: ", np.median(even_len))
print("median_list() 사용: ", median_list(even_len))
print("")
print("np.median() 사용: ", np.median(odd_len))
print("median_list() 사용: ", median_list(odd_len))

[문제4] 문자열의 위치를 바꾸는 함수를 작성하시오. 조건은 다음과 같습니다.

shiftStringLeft(string)

return 값 : 문자열에 속한 글자의 위치가 다음처럼 변경된 새로운 문자열 하나

  • 입력 파라메타로 받은 문자열의 맨 왼쪽의 글자는 새로운 문자열에서 맨 오른쪽으로 이동함
  • 입력 파라메타로 받은 문자열 중 맨 왼쪽의 글자가 아닌 경우는, 왼쪽으로 한칸씩 이동함
  • 예를 들어, 입력파라메타로 ‘ABCDEF’를 받으면, return 값은 ‘BCDEFA’임
def shiftStringLeft(string):
    new_string = ''
    for i in range(1, len(string)):
        new_string += string[i]
    new_string += string[0]
    return new_string        
string = 'ABCDE'
shiftStringLeft(string)
 

[문제5] 리스트 내에서 최대값을 반환하는 함수를 작성하시오.

num_max(num_list)

단, max(), np.max() 등의 함수를 사용하는 것이 아니며, 제어문으로 작성해야 합니다.

[풀이 1]

def num_max(num_list):
    max = num_list[0]
    for num in num_list:
        if max < num:
            max = num
    return max
num_list = [2,3,6,107,24,53,44,3,7,8,1]
num_max(num_list)
 
 

[풀이 2]

def num_max1(num_list):
    max = num_list[0]
    idx = 1
    while idx <= (len(num_list)-1):
        if max >= num_list[idx]:
            max
        else:
            max = num_list[idx]
        idx += 1
    return max
num_list = [2,3,6,107,24,53,44,3,70,8,1]
num_max1(num_list)
 

[문제6] 리스트의 길이를 반환하는 함수를 작성하시오.

length(num_list)

단, len() 등의 함수를 사용하는 것이 아니며, 제어문으로 작성해야 합니다.

def length(num_list):
    count = 0
    for i in num_list:
        count += 1
    return count
num_list = [2,3,6,7,24,543,2342,3,7,8,1]
print("len() 사용: ", len(num_list))
print("length() 사용: ", length(num_list))

'BACS > 서브세션' 카테고리의 다른 글

[BACS] 서브세션 2주차  (0) 2022.10.01
[BACS] 서브세션 1주차  (0) 2022.09.27

info) 서브세션 2주차


[문제4]

  • 문제3의 calcTwoCharactersFromString()을 수정하여, calcTwoCharactersFromStringV2()를 작성합니다.
  • 수정된 동작은, 입력 파라메타 중 두번째와 세번째 글자가 같은 경우, result를 정수 -1로 리턴 합니다.

[풀이]

# calcTwoCharactersFromStringV2함수 정의
def calcTwoCharactersFromStringV2(iString, iCh1, iCh2):
    if iCh1 == iCh2: 
        return -1 #iCh1과 iCh2가 같은 경우 -1 반환
    else:
        #iString에서 iCh1의 개수를 카운트
        iCh1_count = iString.count(iCh1)
        #iString에서 iCh2의 개수를 카운트
        iCh2_count = iString.count(iCh2)
        return iCh1_count + iCh2_count 
        
#2,3번째 글자가 다른 경우
calcTwoCharactersFromStringV2("You only live once", 'o', 'Y')

#2,3번째 글자가 같은 경우
calcTwoCharactersFromStringV2("You only live once", 'o', 'o')
 

[문제5]

  • 문제3의 calcTwoCharactersFromString()을 수정하여, calcTwoCharactersFromStringV3()를 작성합니다.
  • 다른 동작은 동일하며, 문제3에서는 두 개의 글자를 iCh1와 iCh2로 입력 받았으나,이번 문제에서는 두 번째 입력 파라메타(iChList)가 글자들로 이루어진 리스트로 바뀐 사항만 다릅니다.

[풀이]

def calcTwoCharactersFromStringV3(iString:str, iChList:list):
    sum = 0
    for c in iChList:
        sum += iString.count(c)
    return sum
    
#리스트 원소가 2개인 경우
calcTwoCharactersFromStringV3("You only live once", ['o', 'Y'])

#리스트 원소가 4개인 경우
calcTwoCharactersFromStringV3("You only live once", ['o', 'Y', 'c', 'on'])

 

[문제6]

  • 입력 파라메타 2개를 받아서 result 값을 리턴하는 함수 mergeAndSortTwoList()를 작성합니다.
  • 입력 파라메타는 정수를 element로 갖는 리스트 입니다.
  • 리턴 값인 result는 입력 받은 두 개의 리스트에 포함된 모든 정수들을 합쳐서 하나의 리스트로 만들며, 중복된 정수는 하나만 포함되도록 하고,작은 숫자가 앞쪽에 있고 큰 숫자가 뒤쪽에 있도록 정렬된 형태로 만들어진 리스트 입니다.

[풀이]

#mergeAndSortTwoList()함수 정의
def mergeAndSortTwoList(list1, list2):
    #리스트를 '+'연산자로 합친 후 set(집합) 타입으로 중복을 제거하고 
    #다시 리스트 타입으로 변환
    result = list(set(list1 + list2)) 
    result.sort() #sort()를 통해 오름차순 정렬
    return result
    
#리스트 2개를 변수에 설정
list1 = [10, 30, 24, 36, 93, 78, 32, 56]
list2 = [83, 6, 24, 36, 93, 10, 44]

#함수 결과 출력
mergeAndSortTwoList(list1, list2)

 

[문제7]

  • 문제 6의 내부 동작을 수정하여 다음의 mergeAndSortTwoListReverse()를 작성합니다.
  • 수정된 동작은 문제6의 리턴 값인 result 리스트의 정렬 순서가 반대로 바뀌는 것으로,리턴 값인 result는 큰 숫자가 앞쪽에 있고 작은 숫자가 뒤쪽에 있도록 정렬된 형태로 만들어진 리스트 입니다.

[풀이]

#mergeAndSortTwoList()함수 정의
def mergeAndSortTwoListReverse(list1, list2):
    #리스트를 '+'연산자로 합친 후 set(집합) 타입으로 중복을 제거하고 
    #다시 리스트 타입으로 변환
    result = list(set(list1 + list2)) 
    result.sort(reverse = True) #sort()를 통해 오름차순 정렬
    return result
    
#리스트 2개를 변수에 설정
list1 = [10, 30, 24, 36, 93, 78, 32, 56]
list2 = [83, 6, 24, 36, 93, 10, 44]

#함수 결과 출력
mergeAndSortTwoListReverse(list1, list2)
 

[문제8]

  • 입력 파라메타 2개를 받아서 result 값을 리턴하는 함수 searchMatchedCharacter()를 작성합니다.
  • 첫번째 입력 파라메타는 문자열을 element로 갖는 리스트 이며, 두번째 입력 파라메타는 글자 하나 입니다.
  • 리턴 값인 result는 첫번째 입력 파라메타의 문자열 중, 문자열의 첫번째 글자가 두번째 입력 파라메타와 같은 경우, 해당 문자열들로 만들어진 리스트이며, 문자열의 순서는 alphabet의 순서대로 정렬된 상태 입니다.
  • 예를 들어, 첫번째 문자열이 다음과 같은 경우:
    • kingdoms = ['Bacteria','Protozoa','Chromista','Plantae','Fungi','Animalia']
  • 다음과 같이 두번째 입력 파라메타를 글자 P로 주는 경우:
    • searchMatchedCharacter(kingdoms, 'P')
  • 리턴 값 result는 다음과 같습니다.
    • ['Plantae', 'Protozoa']

[풀이]

def searchMatchedCharacter(list1, str1):
    result = [] #빈 리스트 생성
    for word in list1: #문자열 리스트에서 word 하나씩 for문으로 돌리기
        if word.startswith(str1): #해당 word가 str1으로 시작되면 True 반환
            result.append(word) #True이면 해당 word를 new_list에 추가 
    result.sort()
    return result
    
kingdoms = ['Bacteria','Protozoa','Chromista','Plantae','Fungi','Animalia']
searchMatchedCharacter(kingdoms, 'P')

 

[문제9]

  • 입력 파라메타 없이 정수 10개를 생성하여 리턴하는 함수 makeRandomTenIntegers()를 작성합니다.
  • 리턴 값인 result는 정수 리스트로써, 1부터 10사이의 숫자(1과 10포함)를 랜덤한 순서로 포함 합니다.
  • 따라서 result는 1부터 10사이의 숫자를 모두 포함하는 정수 리스트이며, 정수들의 순서는 규칙없이 랜덤이여야 합니다.

[풀이]

import random
import numpy as np

def makeRandomTenIntegers():
    int10 = list(np.arange(1,11)) #1부터 10까지의 리스트 생성
    result = random.sample(int10, 10) #리스트 내 원소들을 무작위로 섞어주기
    return result
    
makeRandomTenIntegers()

원래는 random.shuffle()을 사용하여 정수 리스트를 랜덤하게 섞어 주었으나 정답 파일과 비교한 결과 오답으로 판정되어 다른 방식을 사용하였습니다. shuffle 대신 random.sample()을 사용하였는데 shuffle과 sample의 차이를 찾아본 결과 둘 다 무작위로 섞어준다는 점은 동일하지만 다음의 차이가 있습니다. shuffle은 리스트 내에서 무작위로 섞어주며 sample의 경우에는 무작위로 섞어준 새로운 리스트를 반환하고 원본은 그대로 두게 됩니다. 또한 sample은 두번째 파라미터 값을 통해 원하는 element 수를 제한할 수 있으며  string, tuple 값들에 대해서도 셔플이 가능합니다.


[문제10]

  • 문제9의 함수를 확장해서 다음의 makeRandomIntegersExtended()를 작성합니다.
  • 첫번째 변경 사항으로 입력 파라메타가 2개 이며, 첫번째 입력 파라메타(iStart)는 랜덤 값의 시작이 되는 정수이고, 두번째 입력 파라메타(iEnd)는 랜덤 값의 마지막이 되는 정수 입니다.
  • 두 개의 입력 파라메타를 받은 함수는 다음의 경우에 대해서 정수 -1을 리턴하고 수행을 중지합니다.
    • iStart 혹은 iEnd가 0보다 작거나 같은 경우
      iStart와 iEnd가 같은 경우
      iStart가 iEnd 보다 작은 경우
  • 정상적인 입력 파라메타를 받은 경우는, 리턴 값인 result를 iStart부터 iEnd사이의 숫자(iStart와 iEnd포함)를 랜덤한 순서로 생성하여 채웁니다.
  • 따라서 result는 iStart부터 iEnd사이의 숫자를 모두 포함하는 정수 리스트이며, 순서는 규칙없이 랜덤이여야 합니다.

[풀이]

def makeRandomIntegersExtended(iStart, iEnd):
    #해당 조건을 condition 변수에 대입
    condition = (iStart <= 0) or (iEnd <= 0) or (iStart == iEnd) or (iStart < iEnd)
    #codition이 True이면 -1 리턴 아니면 result 리턴
    if condition:
        return -1
    else:
        int_list = list(np.arange(iEnd, iStart+1)) #iStart와 iEnd 사이 정수 리스트 생성
        random.sample(int_list, len(int_list)) #무작위로 섞어주기
        result = int_list
        return result
        
#조건에 걸리는 경우
makeRandomIntegersExtended(1, 10)

#조건에 걸리지 않는 경우
makeRandomIntegersExtended(10, 2)

[다른 풀이]

def makeRandomIntegersExtended(iStart, iEnd):
    if (iStart == iEnd) or (iStart < 0) or (iEnd < 0) or (iStart < iEnd):
        return -1
    else:
        randomList = []
        randomInt = random.randint(iEnd, iStart)
        for i in range(int(iStart-iEnd+1)):
            while randomInt in randomList:
                randomInt = random.randint(iEnd, iStart)
            randomList.append(randomInt)
        return randomList
 
 

 

'BACS > 서브세션' 카테고리의 다른 글

[서브세션] 서브세션 3주차  (0) 2022.11.06
[BACS] 서브세션 1주차  (0) 2022.09.27

info) 서브세션 1주차


[문제1]

  • 입력 파라메타 4개를 받아서 result 값을 리턴하는 함수 calculateSecond()를 작성합니다.
  • 입력 파라메타는 모두 정수이며, day는 날짜 수, hour는 시간 수, minute는 분 수, second는 초 수입니다.
  • 리턴 값인 result는 입력 파라메타를 모두 초로 환산하여 합산한 결과인 정수 값 입니다.
  • 예를 들어, calculateSecond(1,1,1,1)을 실행하면, result는 하루(24시간) + 한시간 + 1분 + 1초를 초(second)로 환산한 값으로 90061 입니다.

[풀이]

#calculateSecond 함수 정의
def calculateSecond(day: int, hour: int, minute: int, second: int): # 각 변수에 타입 설정
    result = second + (minute * 60) + (hour * 60 ** 2) + (day * 24 * 60 ** 2) # 계산식을 통해 초 변환
    return int(result)
    
#calculateSecond(1,1,1,1) 결과 출력
calculateSecond(1,1,1,1)

[문제2]

  • 입력 파라메타 1개를 받아서 result 값을 리턴하는 함수 reverseString()를 작성합니다.
  • 입력 파라메타는 문자열이며, 길이의 제한은 없습니다.
  • 리턴 값인 result는 입력 파라메타의 문자열에 속한 글자들의 순서를 뒤집은 문자열 입니다.
  • 예를 들어, reverseString("Hello World!")을 실행하면, result는 !dlroW olleH를 저장한 문자열이 됩니다.

[풀이]

Sol1) 문자열 슬라이싱을 활용하여 역순 출력

문자열[시작:끝:규칙]에서 세 번째 숫자를 잘 설정해주면 해당 문자열의 역순을 출력할 수 있다. 세 번째 숫자의 default는 1로 문자열의 인덱스를 순서대로 하여 슬라이싱을 하게 된다. 이를 2로 바꿔주면 한 칸씩 건너뛰며 [0], [2], [4]...인덱스를 슬라이싱하게 된다. 만약, -1를 넣게 되면 뒤에서부터 [-1], [-2]. [-3] 순으로 슬라이싱하게 된다.

# reverseString1() 함수 정의
def reverseString1(string):
    result = string[::-1] #
    return result   
    
reverseString1("Hello World!")

Sol2) for문을 통해 역순 출력

original 문자열의 앞에서부터 하나씩 가져오고 이를 빈 문자열의 앞에 계속 넣어준다. 아래처럼 역순을 반환한다.

'' + 'H'
'e' + 'H'
'l' + 'eH'
'l' + 'leH' 

# reverseString2() 함수 정의
def reverseString2(string):
    reversed_word = ''
    for a in string:
        reversed_word = a + reversed_word
    return reversed_word
    
reverseString2("Hello World!")

 

3) 리스트의 reverse() 함수를 사용해 역순 출력

문자열을 리스트로 변환하여 리스트를 reverse하고 이를 빈 문자열과 join하여 reversed_word로 만들어 준다.

# reverseString3() 함수 정의
def reverseString3(string):
    reversed_word = ''
    string_list = list(string)
    string_list.reverse()
    return reversed_word.join(string_list)
    
reverseString3("Hello World!")

[문제3]

  • 입력 파라메타 3개를 받아서 result 값을 리턴하는 함수 calcTwoCharactersFromString()를 작성합니다.
  • 입력 파라메타 중 첫번째(iString)는 문자열이며, 두번째(iCh1)와 세번째(iCh2)는 각각 글자 하나 입니다.
  • 리턴 값인 result는 iString 문자열 안에 iCh1 글자와 iCh2 글자가 몇 개나 포함되었는지에 대한 정수 입니다.
  • 예를 들어, calcTwoCharactersFromString("You only live once", 'o', 'Y')을 실행하면,result는 문자열내 o의 갯수인 3과 Y의 갯수인 1을 더한 정수 4가 됩니다.

[풀이]

문자열의 count()함수를 통해 해당 문자열이 몇 개 있는지 카운트 한 후 이를 합하여 반환한다.

# calcTwoCharactersFromString함수 정의
def calcTwoCharactersFromString(iString, iCh1, iCh2):
    iCh1_count = iString.count(iCh1)
    iCh2_count = iString.count(iCh2)
    return iCh1_count + iCh2_count 
    
calcTwoCharactersFromString("You only live once", 'o', 'Y')

'BACS > 서브세션' 카테고리의 다른 글

[서브세션] 서브세션 3주차  (0) 2022.11.06
[BACS] 서브세션 2주차  (0) 2022.10.01

+ Recent posts