본문 바로가기
개발 공부 일지/Python

프로그래머스 코딩테스트 입문 day4 : 수학 : 배열

by yelimu 2024. 6. 23.

1. 피자 나눠먹기1 : 피자를 나눠먹을 사람의 수 n이 주어질 때, 모든 사람이 피자를 한 조각 이상 먹기 위해 필요한 피자의 수를 return

 

[나의 풀이 ]

def solution(n):
    answer = 0


    a = n // 7 
    b = n % 7
    if n <= 7:                       사람 수가 7 이하이면 피자는 1판
        answer = 1
    elif b == 0 :                   사람수가 7로 나눠떨어지면 피자는 (사람 수를 7로 나눈값)판
        answer = a
    else : answer = a + 1   사람수가 7로 나눠떨어지지않으면 (사람수를 7로 나눈값 + 1) 판


    return answer

 

[나의 다른 풀이]

def solution(n):
    x = 0
    while x * 7 // n < 1:       피자 조각수 를 사람 수로 나눈 몫이 1 이상이 될때까지 피자 수 +1 반복 
        x += 1

    return x

 

[다른 풀이]

(1) 

def solution(n):

    return (n-1) // 7 + 1         (사람 수 - 1 )* 를 7로 나눈 값 +1 판 

 

* 7의 배수를 나눴을때의 출력값을 정확히 받을수 있다. 

 

(2) 

def solution(n):

    return (n + 6) // 7 

 

(3) 

import math

 

def solution(n):

    return math.ceil(n / 7)

 

math.ceil() : 주어진 숫자를 올림 하여 정수 반환

 

(4) 

def solution(n):

    return -(-n // 7)

 

// 는 소수점을 버림 = 내림 (ex. -1 // 7 = - 0.14 -> -1로 반환)

n의 음수값을 7로 나누고 내림 수행

다시 음수로 바꿈으로써 올림 효과


2. 피자 나눠먹기 2 : 피자를 여섯 조각으로 잘라 줍니다. 피자를 나눠먹을 사람의 수 n이 매개변수로 주어질 때, 

n명이 주문한 피자를 남기지 않고 모두 같은 수의 피자 조각을 먹어야 한다면 최소 몇 판을 시켜야 하는지를 return

 

[나의 풀이 ]

def solution(n):
    pizza = 1


    for pizza in range(1, n + 1):       피자 판의 수 1~ n 까지 
        if (pizza * 6) % n != 0:            피자 조각 수 를 사람수로 나눈 나머지가 0이 아니면 피자 + 1
            pizza += 1
        else : 
            break

    return pizza

 

[나의 다른 풀이]

def solution(n):
    pizza = 1
    
    while (pizza * 6) % n > 0:          피자 조각 수를 사람수로 나눈 나머지가 0 이상이면 피자+= 1
        pizza += 1
    
    return pizza

 

정해진 범위가 없이 무한히 증가시키고 싶을때는 while 이 더 적합하다.

for 반복문은 주로 정해진 범위나 이터러블 객체에서 반복하고싶을때 사용 

 

[다른 풀이]

(1) 

import math 

 

def solution(n):

    return (n * 6) // math.gcd(n, 6) // 6 

 

최대공약수를 사용한 방법 


3. 피자나눠먹기 3 : 피자를 두 조각에서 열 조각까지 원하는 조각 수로 잘라줍니다. 피자 조각 수 slice와 피자를 먹는 사람의 수 n이 매개변수로 주어질 때, n명의 사람이 최소 한 조각 이상 피자를 먹으려면 최소 몇 판의 피자를 시켜야 하는지를 return

 

[나의 풀이 ]

def solution(slice, n):
    x = 0
    while (x * slice) // n < 1 :       전체 피자 조각 수 를 사람 수로 나눈 몫이 1보다 작으면 피자 한판ㄷ ㅓ~
            x += 1
    
    return x

 

 

[다른 풀이]

(1) 

def solution (slice, n):

    return ((n-1) // slice) +1 

 

(2) 

def solution(slice, n):
    d, m = divmod(n, slice)       n명을 slice 로 나눈 (몫,  나머지) 반환 
    return d + int(m != 0)           

m  != 0 조건문을 만족하면 True, 거짓이면 False  반환 , -> 이걸 다시 int 로 변환해서1 , 0을 받아낸다 

 

나머지가 0이 아니면  1을 더한다


4. 배열의 평균값 :정수 배열 numbers가 매개변수로 주어집니다. numbers의 원소의 평균값을 return

 

[나의 풀이 ]

def solution(numbers):
    answer = 0
    answer = sum(numbers) / len(numbers)
    return answer

 

반복문으로 요소를받아와서 sum을 만들어줘야하나 하다가

메소드인지 함수인지도 모르겠어서 일단 다 써보니까 되긴 했다;;헷; 

 

[다른 풀이]

(1) 

import numpy as np

def solution(numbers):

    return np.mean(numbers)

 

다들 넘파이는 사기야(최고야) 등 반응이 뜨겁네 

ㅠ 난 떠올리지도 못함 

 

(2)

import statistics

def solution(numbers):

    answer = 0

    return statistics.mean(numbers)

 

numpy 알아보기 : 다차원 배열에서 유용 

더보기

import numpy as np

# 리스트를 배열로 변환
arr1 = np.array([1, 2, 3, 4, 5])

# 범위로 배열 생성
arr2 = np.arange(0, 10, 2)  # 0부터 10 미만까지 2씩 증가하는 배열 생성: [0, 2, 4, 6, 8]

# 0으로 초기화된 배열 생성
arr3 = np.zeros((2, 3))  # 2x3 배열, 모든 요소는 0

# 1로 초기화된 배열 생성
arr4 = np.ones((3, 3))   # 3x3 배열, 모든 요소는 1

# 랜덤한 값으로 배열 생성
arr5 = np.random.rand(2, 2)  # 2x2 배열, 랜덤한 값으로 채워짐

 

배열 연산

numpy를 사용하여 배열 간의 연산을 빠르고 효율적으로 수행할 수 있습니다:

import numpy as np

# 배열 연산
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])

# 덧셈
c = a + b  # [5, 7, 9]

# 곱셈
d = a * b  # [4, 10, 18]

# 행렬 곱셈 (dot product)
e = np.dot(a, b)  # 32

# 배열 요소 접근 및 슬라이싱
arr = np.array([[1, 2, 3], [4, 5, 6]]) => 2행 3열의 배열을 생성

# 요소 접근
print(arr[0, 1])  # 출력: 2               => [행, 열]로 접근

# 슬라이싱
print(arr[:, 1])  # 출력: [2, 5]         => 모든 행에서 두번째 열 (1번 인덱스?) 값에 접근

 

수학 함수

numpy는 다양한 수학 함수를 제공하여 배열 데이터를 효율적으로 처리할 수 있습니다:

 

import numpy as np

arr = np.array([1, 2, 3, 4, 5])

# 평균
mean_val = np.mean(arr)  # 3.0

# 최댓값, 최솟값
max_val = np.max(arr)  # 5
min_val = np.min(arr)  # 1

# 제곱근
sqrt_arr = np.sqrt(arr)  # [1.         1.41421356 1.73205081 2.         2.23606798]

 

statistics 모듈 알아보기 ( Python 3.4 이상)

더보기

mean(): 주어진 데이터의 산술평균을 계산

median(): 주어진 데이터의 중앙값을 계산합니다. 데이터가 홀수개인 경우 중앙에 있는 값을 반환하고, 짝수개인 경우 중앙에 있는 두 값의 평균을 반환

stdev(): 주어진 데이터의 표준편차

variance(): 주어진 데이터의 분산

mode(): 주어진 데이터의 최빈값

harmonic_mean(): 주어진 데이터의 조화평균