[Programmers/Lv. 0] 코딩테스트 입문 Day 4 - 수학, 배열 (Python)

2023. 3. 11. 19:54Algorithm

1. 피자 나눠 먹기 (1)


피자를 나눠먹을 사람의 수가 주어졌을 때, 이 모든 사람이 한 조각 이상 먹기 위해 필요한 피자의 수를 구하라는 문제다.
단, 한 피자는 일곱 조각으로 잘라준다.

(내가 생각한 풀이 과정)

1부터 7까지는 1판, 8부터 14까지는 2판, 15부터 21까지는 3판... 이런 식으로 7의 배수를 기준으로 반환값이 구분된다.
즉, n값을 7로 나누었을 때 그 결괏값을 참고한다면 문제를 해결할 수 있을 것 같았다.

7을 7로 나누면 1이지만, 1부터 6사이의 값을 7로 나누면 0이 나오니 +1을 시켰다.
마찬가지 14를 7로 나누면 2이지만, 8부터 13 사이의 값을 7로 나누면 1이 나오니 +1을 시켰다.
이런 식으로 7의 배수인 값과 그 이전의 값을 구분해서 결괏값을 따로 반환시켰다.

 

(코드)

더보기

💡 내 코드

def solution(n):
    if n%7==0: return n/7
    else: return n//7+1

 

💡 다른 사람의 풀이 코드

내가 생각한 방법을 코드 한 줄로 작성할 수도 있었다.
나처럼 조건문으로 구분을 한 게 아니라 n-1을 사용해 값을 기준에 맞춰주는 방법이었다.

def solution(n):
    return (n - 1) // 7 + 1

 


2. 피자 나눠 먹기 (2)


한 판은 여섯 조각으로 나누며,
n명이 주문한 피자는 모두 같은 수의 피자 조각을 먹어야 할 때 최소 몇 판을 시켜야 하는지 구하라는 문제다.

 

(내가 생각한 풀이 과정)

6과 n의 최소공배수를 찾아, 6으로 다시 나눠주면 해결할 수 있을 것이다.

이때, 최소공배수를 찾는 방법은 6과 n이 같아질 때까지, 계속 배수를 시켜주면 된다.
다시 말해, 6과 n을 비교하여 두 수가 같지 않을 경우에 더 작은 수를 배수 시킨 후 다시 두 수가 같은지 비교하는 방식으로 반복하는 방법이다.

 

(코드)

더보기

💡 내 코드

def solution(n):
    m = 6
    let_n, let_m = n, m

    while n != m:
        if n > m: m+=let_m
        else: n+=let_n

    return n/6

 

💡 다른 사람의 풀이 코드

최소공배수를 구하는 다른 방법을 제시해준다.

두 수를 곱한 후, 두 수의 최대 공약수로 나누어주면 최소공배수를 구할 수 있다고 한다.
최대 공약수는 math 라이브러리의 gcd 메서드를 이용할 수 있다.

import math

def solution(n):
    return (n * 6) // math.gcd(n, 6) // 6

 


3. 피자 나눠 먹기 (3)


피자 조각 수와 피자를 먹는 사람의 수가 주어진다고 할 때, n명의 사람이 최소 한 조각 이상 먹으려면 최소 몇 판의 피자를 시켜야 하는지를 구하라는 문제이다.
피자가게에서는 피자를 원하는 조각 수 (2~10 조각 사이)로 잘라준다고 한다.

(내가 생각한 풀이 과정)

피자 나눠 먹기 (1) 문제의 아이디어를 참고하면 쉽게 해결할 수 있는 문제이다.
사람 인원수를 조각수로 나누고 더하기 1을 하면 필요한 피자 판수가 나온다. 단, 피자 나눠 먹기 (1) 문제처럼 인원수와 피자 조각수가 같을 경우가 문제가 되는데, 이때는 -1과 +1을 이용하여 값에 차이를 두는 방식으로 해결할 수 있었다.

 

(코드)

더보기

💡 내 코드

def solution(slice, n):
    return (n-1)//slice+1

 


4. 배열의 평균값


정수 배열이 주어질 때 이 배열 원소의 평균값을 구하라는 문제이다.

 

(내가 생각한 풀이 과정)

파이썬 내장함수 sum(합산)과 len(문자열 길이 구하기)을 이용하면 해결할 수 있다.

 

(코드)

더보기

💡 내 코드

def solution(numbers):
    return sum(numbers)/len(numbers)