개발일기 [Python 파이썬]

[파이썬] AI 알고리즘 문제 : 기초 함수 02

neullo 2024. 3. 5. 12:09

코딩 알고리즘 01 풀어보기

 

코딩테스트 준비 문제 [알고리즘] 함수 문제 02

Questions. 알고리즘 문제 DAY 02ㅊ def solution(numbers): total = sum(numbers) average = total / len(numbers) return round(average) # 반올림하여 반환 numbers1 = [3, 17, 1, 39, 8, 41, 2, 32, 99, 2] numbers2 = [22, 8, 5, 123, 7, 2, 63, 7, 3, 46]

neulo.tistory.com

 


 

 코딩 알고리즘 02 풀어보기

 

1. 배열의 평균값 total = sum(numbers) average = total / len(numbers)

정수 배열 numbers가 매개변수로 주어집니다. numbers의 원소의 평균값을 return 하도록 solution 함수를 완성해 주세요. 

def solution(numbers):
    # 주어진 배열의 원소들의 합을 계산합니다.
    total = sum(numbers)
    # 배열의 길이로 나누어 평균을 구합니다.
    average = total / len(numbers)
    # 평균값을 반환합니다.
    return average

# 테스트를 위한 입력값
numbers = [1, 2, 3, 4, 5]
# 함수 호출 및 결과 출력
print(solution(numbers))

 

입출력 예

numbers result

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 5.5
[89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99] 94.0

입출력 예 설명

입출력 예 #1

  • numbers의 원소들의 평균값은 5.5입니다.

입출력 예 #2

  • numbers의 원소들의 평균 값은 94.0입니다.

 

def solution(numbers):
    total = sum(numbers)
    average = total / len(numbers)
    return round(average)  # 반올림하여 반환

numbers1 = [3, 17, 1, 39, 8, 41, 2, 32, 99, 2]
numbers2 = [22, 8, 5, 123, 7, 2, 63, 7, 3, 46]
numbers3 = [6, 63, 2, 3, 58, 76, 21, 33, 8, 1]

print(solution(numbers1))
print(solution(numbers2))
print(solution(numbers3))

 


파이썬 평균값 구하기 심화: 함수를 구하는 것에서 나아가 소수점 반올림, 소수점 버리기 등을 이용해 실제 사용자가 어떤 값을 몇번이나 입력해도 자동으로 구해줄 수 있는 코딩은 아래에서 더 공부할 수 있습니다. 

 

[파이썬 평균값 구하기] 초급 중급 심화: 반올림 소수점 버리기

평균값 초급 1. 배열의 평균값 total = sum(numbers) average = total / len(numbers) 정수 배열 numbers가 매개변수로 주어집니다. numbers의 원소의 평균값을 return 하도록 solution 함수를 완성해 주세요. def solution(nu

neulo.tistory.com


 

2. 머쓱이보다 키 큰 사람 taller_count 

머쓱이는 학교에서 키 순으로 줄을 설 때 몇 번째로 서야 하는지 궁금해졌습니다. 머쓱이네 반 친구들의 키가 담긴 정수 배열 array와 머쓱이의 키 height가 매개변수로 주어질 때, 머쓱이보다 키 큰 사람 수를 return 하도록 solution 함수를 완성해보세요.

 

def solution(array, height):
    # 키가 큰 사람의 수를 저장할 변수를 초기화합니다.
    taller_count = 0
    
    # 주어진 배열(array)을 순회하면서 머쓱이보다 키가 큰 사람의 수를 세어봅니다.
    for person_height in array:
        if person_height > height:
            taller_count += 1
    
    # 키가 큰 사람의 수를 반환합니다.
    return taller_count

# 테스트를 위한 입력값
array = [160, 165, 170, 155, 175]
height = 162
# 함수 호출 및 결과 출력
print(solution(array, height))

입출력 예

array height result

[149, 180, 192, 170] 167 3
[180, 120, 140] 190 0

입출력 예 설명

입출력 예 #1

  • 149, 180, 192, 170 중 머쓱이보다 키가 큰 사람은 180, 192, 170으로 세 명입니다.

입출력 예 #2

  • 180, 120, 140 중 190보다 큰 수는 없으므로 0명입니다.

 

3. 배열 원소의 길이 list(map(len,strlist))

문자열 배열 strlist가 매개변수로 주어집니다. strlist 각 원소의 길이 (알파벳이 글자마다 몇개 들어있는지) 를 담은 배열을 retrun하도록 solution 함수를 완성해주세요.

def solution(strlist):
    answer = list(map(len, strlist))
    return answer

**list(map(len, strlist))는 strlist의 각 원소(s)에 대해 len(s)를 계산하여 그 값을 리스트에 저장하는 것입니다. 따라서 최종적으로 각 문자열의 길이가 담긴 리스트가 반환됩니다.

or

def solution(strlist):
    answer = [len(i) for i in strlist]
    return answer

 

or

def solution(strlist):
    # 문자열의 길이를 담을 리스트를 초기화합니다.
    result = []
    
    # 주어진 문자열 배열을 순회하면서 각 문자열의 길이를 구하여 result 리스트에 추가합니다.
    for s in strlist:
        result.append(len(s))
    
    # 결과 리스트를 반환합니다.
    return result

# 테스트를 위한 입력값
strlist1 = ["We", "are", "the", "world!"]
strlist2 = ["I", "Love", "Programmers."]
# 함수 호출 및 결과 출력
print(solution(strlist1))  # [2, 3, 3, 6]
print(solution(strlist2))  # [1, 4, 12]

 

**왜 []사용? result = []는 빈 리스트를 초기화하는 구문

**Return result 안넣으면 어떻게 될까? return result를 생략하면 함수가 아무런 값을 반환하지 않게 됩니다. 함수가 값을 반환하도록 하기 위해서는 return 문을 사용하여 그 값을 명시적으로 반환해야 합니다.

***여기서 for s in strlist:strlist에 있는 각 문자열을 s로 가져온다는 것을 의미합니다. 따라서 s는 반복문을 통해 strlist에 있는 각 문자열을 한 번에 하나씩 가져오게 됩니다. 그리고 result.append(len(s))는 현재 가져온 문자열 s의 길이를 계산하여(len(s)) 그 값을 result 리스트에 추가하는 것입니다. append() 메소드는 리스트에 새로운 요소를 추가하는데, 이때 len(s)가 추가됩니다. 따라서 반복문을 통해 strlist의 각 문자열의 길이를 계산하고 그 값을 result 리스트에 차례대로 추가하는 것입니다.

입출력 예

strlist result

["We", "are", "the", "world!"] [2, 3, 3, 6]
["I", "Love", "Programmers."] [1, 4, 12]

입출력 예 설명

입출력 예 #1

  • ["We", "are", "the", "world!"]의 각 원소의 길이인 [2, 3, 3, 6]을 return합니다.

입출력 예 #2

  • ["I", "Love", "Programmers."]의 각 원소의 길이인 [1, 4, 12]을 return합니다.

4. 배열 뒤집기

정수가 들어 있는 배열 num_list가 매개변수로 주어집니다. num_list의 원소의 순서를 거꾸로 뒤집은 배열을 return하도록 solution 함수를 완성해주세요.

 

def solution(num_list):
    num_list.reverse()
    return num_list
def solution(num_list):
    # 주어진 리스트의 순서를 거꾸로 뒤집습니다.
    num_list.reverse()
    # 뒤집은 리스트를 반환합니다.
    return num_list

# 테스트를 위한 입력값
num_list1 = [1, 2, 3, 4, 5]
num_list2 = [1, 1, 1, 1, 1, 2]
num_list3 = [1, 0, 1, 1, 1, 3, 5]

# 함수 호출 및 결과 출력
print(solution(num_list1))  # [5, 4, 3, 2, 1]
print(solution(num_list2))  # [2, 1, 1, 1, 1, 1]
print(solution(num_list3))  # [5, 3, 1, 1, 1, 0, 1]

입출력 예 설명

입출력 예 #1

  • num_list가 [1, 2, 3, 4, 5]이므로 순서를 거꾸로 뒤집은 배열 [5, 4, 3, 2, 1]을 return합니다.

입출력 예 #2

  • num_list가 [1, 1, 1, 1, 1, 2]이므로 순서를 거꾸로 뒤집은 배열 [2, 1, 1, 1, 1, 1]을 return합니다.

입출력 예 #3

  • num_list가 [1, 0, 1, 1, 1, 3, 5]이므로 순서를 거꾸로 뒤집은 배열 [5, 3, 1, 1, 1, 0, 1]을 return합니다.

5. 중복된 숫자 개수 return array.count (n)

정수가 담긴 배열 array와 정수 n이 매개변수로 주어질 때, array에 n이 몇 개 있는 지를 return 하도록 solution 함수를 완성해보세요.

def solution(array, n):
    return array.count (n)

*** 배열 array에 정수 n이 몇 개 있는지를 반환하는 solution 함수를 작성할 수 있습니다.

***위 코드에서 array.count(n)는 배열 array에서 정수 n이 몇 개 있는지를 반환합니다. 이를 이용하여 배열 array에 포함된 정수 n의 개수를 구할 수 있습니다.

def solution(array, n):
    # 배열 array에서 정수 n의 개수를 반환합니다.
    return array.count(n)

# 테스트를 위한 입력값
array1 = [1, 1, 2, 3, 4, 5]
array2 = [0, 2, 3, 4]
n1 = 1
n2 = 1

# 함수 호출 및 결과 출력
print(solution(array1, n1))  # 2
print(solution(array2, n2))  # 0

 

이렇게 array.count(n)은 리스트 array에서 원소 n이 몇 번 등장하는지를 계산하는 리스트 메서드입니다. 따라서 solution 함수는 배열 array에서 정수 n의 등장 횟수를 반환합니다. 예를 들어, array = [1, 2, 3, 1, 1, 4, 5]이고 n = 1인 경우, array.count(1)은 1이 등장하는 횟수인 3을 반환합니다. 따라서 solution(array, n)은 3을 반환합니다.

def solution(array, n):
    count = 0
    # 배열을 순회하면서 정수 n과 일치하는 원소를 찾습니다.
    for num in array:
        if num == n:
            count += 1
    # 정수 n의 개수를 반환합니다.
    return count

# 테스트를 위한 입력값
array1 = [1, 1, 2, 3, 4, 5]
array2 = [0, 2, 3, 4]
n1 = 1
n2 = 1

# 함수 호출 및 결과 출력
print(solution(array1, n1))  # 2
print(solution(array2, n2))  # 0

 

 

입출력 예

array n result

[1, 1, 2, 3, 4, 5] 1 2
[0, 2, 3, 4] 1 0

입출력 예 설명

입출력 예 #1

  • [1, 1, 2, 3, 4, 5] 에는 1이 2개 있습니다.

입출력 예 #2

  • [0, 2, 3, 4] 에는 1이 0개 있습니다.

 

6. 배열 자르기 retrun numbers [num1:num2+1]

정수 배열 numbers와 정수 num1, num2가 매개변수로 주어질 때, numbers의 num1번 째 인덱스부터 num2번째 인덱스까지 자른 정수 배열을 return 하도록 solution 함수를 완성해보세요. 

num1은 시작 인덱스를 의미하고, num2는 종료 인덱스를 의미합니다.

old_list = [1, 2, 3, 4, 5]
new_list = old_list[1:4]
print(new_list)  # 출력: [2, 3, 4]


old_list[1:4]는 [2, 3, 4]를 반환합니다. 여기서 1은 시작 인덱스이고 4는 종료 인덱스입니다. 시작 인덱스부터 종료 인덱스 이전까지의 요소를 선택합니다.
old_list[1:4+1]는 [2, 3, 4, 5]를 반환합니다. 4에 1을 더해주어 종료 인덱스를 포함하게 됩니다.

**리스트 슬라이싱은 [start:end] 형식으로 start 인덱스부터 end-1 인덱스까지의 요소를 포함하는 부분 배열을 반환하면 start 인덱스는 포함되고 end 인덱스는 포함되지 않습니다.

*** numbers[num1:num2+1] numbers 리스트에서 num1번째 인덱스부터 num2번째 인덱스까지의 부분 배열을 반환합니다. 여기서 num2+1을 사용하는 이유는 num2까지만 슬라이싱을 하면 num2번째 요소는 포함되지 않기 때문에, num2까지 포함하여 부분 배열을 구하기 위해서입니다.

**위 코드에서 numbers[num1:num2+1]은 배열 numbers에서 num1번째 인덱스부터 num2번째 인덱스까지의 부분 배열을 반환합니다. 주의해야 할 점은 슬라이싱(slice)을 할 때, num2까지의 인덱스에 포함되지 않는다는 것입니다. 따라서 num2까지 포함하려면 num2+1까지의 범위를 지정해야 합니다.

def solution(numbers, num1, num2):
    # numbers 배열에서 num1번째부터 num2번째까지의 부분 배열을 반환합니다.
    return numbers[num1:num2+1]

# 테스트를 위한 입력값
numbers1 = [1, 2, 3, 4, 5]
numbers2 = [1, 3, 5]
num1_1, num2_1 = 1, 3
num1_2, num2_2 = 1, 2

# 함수 호출 및 결과 출력
print(solution(numbers1, num1_1, num2_1))  # [2, 3, 4]
print(solution(numbers2, num1_2, num2_2))  # [3, 5]

 

 

입출력 예

numbers num1 num2 result

[1, 2, 3, 4, 5] 1 3 [2, 3, 4]
[1, 3, 5] 1 2 [3, 5]

입출력 예 설명

입출력 예 #1

  • [1, 2, 3, 4, 5]의 1번째 인덱스 2부터 3번째 인덱스 4 까지 자른 [2, 3, 4]를 return 합니다.

입출력 예 #2

  • [1, 3, 5]의 1번째 인덱스 3부터 2번째 인덱스 5까지 자른 [3, 5]를 return 합니다.

 

7. 문자열 뒤집기

문자열 my_string이 매개변수로 주어집니다. my_string을 거꾸로 뒤집은 문자열을 return하도록 solution 함수를 완성해주세요.

 

이때는 문자열 슬라이싱을 사용하여 쉽게 거꾸로 뒤집을 수 있습니다. my_string[::-1]은 문자열을 거꾸로 뒤집는 방법입니다. [시작:끝:방향]이니 [::-1]startend를 모두 생략하고 step만을 사용하여 리스트나 문자열을 뒤집습니다. -1step은 거꾸로 간격을 나타내므로 리스트나 문자열을 거꾸로 뒤집는 효과를 가집니다. [::-1]은 시작 인덱스와 종료 인덱스를 생략하고, 간격을 -1로 지정하여 문자열을 뒤집습니다. 따라서 최종적으로 거꾸로 뒤집힌 문자열이 반환됩니다.

def solution(my_string):
    return my_string[::-1]

# 테스트를 위한 입력값
my_string = "Hello, World!"

# 함수 호출 및 결과 출력
print(solution(my_string))  # 출력: "!dlroW ,olleH"

 

OR 물론 리버스로도 바꿀 수 있습니다. 

def solution(my_string):
    return ''.join(list(reversed(my_string)))
  1. reversed(my_string): reversed() 함수는 인자로 전달된 시퀀스(리스트, 튜플, 문자열 등)를 거꾸로 뒤집는 이터레이터(iterator)를 반환합니다. 여기서는 문자열 my_string을 거꾸로 뒤집는 이터레이터를 생성합니다.
  2. list(reversed(my_string)): reversed(my_string)으로 반환된 이터레이터를 리스트로 변환합니다. 이는 거꾸로 뒤집은 문자열을 리스트로 만드는 과정입니다.
  3. ''.join(list(reversed(my_string))): join() 메서드는 리스트의 요소들을 하나의 문자열로 연결해주는 메서드입니다. 여기서는 거꾸로 뒤집은 문자열을 리스트로 변환한 후, 리스트의 각 요소들을 빈 문자열('')을 구분자로 사용하여 하나의 문자열로 연결합니다.
  4. return ''.join(list(reversed(my_string))): 마지막으로, 이렇게 연결된 문자열을 반환합니다.

입출력 예

my_string return

"jaron" "noraj"
"bread" "daerb"

입출력 예 설명

입출력 예 #1

  • my_string이 "jaron"이므로 거꾸로 뒤집은 "noraj"를 return합니다.

입출력 예 #2

  • my_string이 "bread"이므로 거꾸로 뒤집은 "daerb"를 return합니다.

8. 편지

머쓱이는 할머니께 생신 축하 편지를 쓰려고 합니다. 할머니가 보시기 편하도록 글자 한 자 한 자를 가로 2cm 크기로 적으려고 하며, 편지를 가로로만 적을 때, 축하 문구 message를 적기 위해 필요한 편지지의 최소 가로길이를 return 하도록 solution 함수를 완성해주세요.

 

def solution(message):
	return len(message)*2

***len(message)는 주어진 메시지 문자열의 길이를 구하는 것을 의미. len(message)를 사용하여 메시지의 길이를 문자 수로 구하고, 이를 가로 길이로 변환하여 반환해야 합니다.

입출력 예

message result

"happy birthday!" 30
"I love you~" 22

입출력 예 설명

입출력 예 #1

  • message의 글자 수가 15개로 최소 가로 30cm의 편지지가 필요합니다.

입출력 예 #2

  • message의 글자 수가 11개로 최소 가로 22cm의 편지지가 필요합니다.

 

9. 점의 위치 구하기

사분면은 한 평면을 x축과 y축을 기준으로 나눈 네 부분입니다. 사분면은 아래와 같이 1부터 4까지 번호를매깁니다.

 

 

  • x 좌표와 y 좌표가 모두 양수이면 제1사분면에 속합니다.
  • x 좌표가 음수, y 좌표가 양수이면 제2사분면에 속합니다.
  • x 좌표와 y 좌표가 모두 음수이면 제3사분면에 속합니다.
  • x 좌표가 양수, y 좌표가 음수이면 제4사분면에 속합니다.

x 좌표 (x, y)를 차례대로 담은 정수 배열 dot이 매개변수로 주어집니다. 좌표 dot이 사분면 중 어디에 속하는지 1, 2, 3, 4 중 하나를 return 하도록 solution 함수를 완성해주세요.

 


 

def solution(dot):
    x, y = dot
    if x > 0 and y > 0:
        return 1
    elif x < 0 and y > 0:
        return 2
    elif x < 0 and y < 0:
        return 3
    elif x > 0 and y < 0:
        return 4

# 테스트를 위한 입력값
dot1 = [5, 5]
dot2 = [-3, 7]
dot3 = [-2, -3]
dot4 = [4, -1]

# 함수 호출 및 결과 출력
print(solution(dot1))  # 출력: 1
print(solution(dot2))  # 출력: 2
print(solution(dot3))  # 출력: 3
print(solution(dot4))  # 출력: 4

or

def solution(dot):
    quad = [(3,2),(4,1)]
    return quad[dot[0] > 0][dot[1] > 0]

or

def solution(dot):
    a, b = 1, 0
    if dot[0]*dot[1] > 0:
        b = 1
    if dot[1] < 0:
        a = 2
    return 2*a-b

or 양수와 음수 두개의 성질을 가지고 (양수 x양수= 양수) (양수 x음수=음수)(음수x음수=양수) 곱해서 0보다 크거나 작은지 이용해서 더 간결하게 구현 가능

def solution(dot):
    x,y = dot
    if x*y>0:  #0보다 크게 나오는 경우의 수는 둘다 음수이거나 양수인 경우
        return 1 if x>0 else 3  
        #x가0보다 크면 둘다 양수니까 1번이고 0보다 작으면 둘다 음수니까 3 
        #1은 둘다 양수 3은 둘다 음수
    
    else:
        return 4 if x>0 else 2
        #2는 음수양수(-,+), 4는 양수음수 (+,-)
        #즉 x가 0보다 크면 4에 속하고 x가 0보다 작으면 2에 속함
  1. x, y = dot: dot에서 x 좌표와 y 좌표를 각각 x와 y 변수에 할당합니다.
  2. if x * y > 0:: 두 좌표의 곱이 양수인 경우, 즉 두 좌표가 모두 양수이거나 모두 음수인 경우를 확인합니다. 이 경우 해당 좌표는 1사분면 또는 3사분면에 속합니다.
    • return 1 if x > 0 else 3: 만약 x 좌표가 양수이면 1사분면에 속하고, 음수이면 3사분면에 속합니다. 따라서 이를 반환합니다.
  3. else:: 두 좌표의 곱이 음수인 경우, 즉 한 좌표는 양수이고 다른 좌표는 음수인 경우를 확인합니다. 이 경우 해당 좌표는 2사분면 또는 4사분면에 속합니다.
    • return 4 if x > 0 else 2: 만약 x 좌표가 양수이면 4사분면에 속하고, 음수이면 2사분면에 속합니다. 따라서 이를 반환합니다.

입출력 예

dot result

[2, 4] 1
[-7, 9] 2

입출력 예 설명

입출력 예 #1

  • dot이 [2, 4]로 x 좌표와 y 좌표 모두 양수이므로 제 1 사분면에 속합니다. 따라서 1을 return 합니다.

입출력 예 #2

  • dot이 [-7, 9]로 x 좌표가 음수, y 좌표가 양수이므로 제 2 사분면에 속합니다. 따라서 2를 return 합니다.

10. 문자열안에 문자열

문자열 str1str2가 매개변수로 주어집니다. str1 안에 str2가 있다면 1을 없다면 2를 return하도록 solution 함수를 완성해주세요.

 

간단하게 in 키워드를 사용하여 주어진 문제를 해결가능하다. str2을 str1에서 찾으면 return 1 해줘. 아니면 2

def solution(str1, str2):
    return 1 if str2 in str1 else 2

# 테스트를 위한 입력값
str1 = "hello world"
str2 = "world"

# 함수 호출 및 결과 출력
print(solution(str1, str2))  # 출력: 1

 

입출력 예

str1 str2 result

"ab6CDE443fgh22iJKlmn1o" "6CD" 1
"ppprrrogrammers" "pppp" 2
"AbcAbcA" "AAA" 2

입출력 예 설명

입출력 예 #1

  • "ab6CDE443fgh22iJKlmn1o" str1에 str2가 존재하므로 1을 return합니다.

입출력 예 #2

  • "ppprrrogrammers" str1에 str2가 없으므로 2를 return합니다.

입출력 예 #3

  • "AbcAbcA" str1에 str2가 없으므로 2를 return합니다.