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

프로그래머스 코딩테스트 입문 day2 : 사칙연산, 조건문, 배열

by yelimu 2024. 6. 21.

1. 두 수의 나눗셈

num1을 num2 로 나눈 값에 1000을 곱한 값의 정수부를 반환하는 함수 

 

[내 풀이]

def solution(num1, num2):

    answer = 0

    answer = int(num1 / num2 * 1000) 

    return answer

 

[다른 풀이 방법]

(1)

def solution(num1, num2) :

    return int( num1 / num2 * 1000) 

ㄴ 변수 answer를 사용하지 않음. : 변수를 저장하기 위해선 비용이 든다. 비용이 늘면 시스템 성능 저하가 올 수 있다.

ㄴ 또한 함수화된 코드는 굳이 변수에 담지 않더라도 return 값으로 주면 차후에 x = solution(something)같은 형태로 불러와서 사용이 가능하므로, 재사용이 없는 함수 내 지역변수는 굳이 변수에 담지 않는것을 추천한다 

 

(2)

def solution(num1, num2):

    answer = 0

    answer = (num1 / num2) * 1000

    return answer//1

: 1로 나눈 값의 몫만 반환 = 정수부

 

(3) 

solution = lambda x, y : 1000 * x // y

: 순서가 중요하겟군.. 

1000 * 10 // 3 = 3333

10 // 3 * 1000 = 3000

 

(4) 

import math

 

def solution(num1, num2):

    return math.trunc(num1 / num2 * 1000)

 

math.trunc (트렁크) 소수점 이하 자릿수를 버리고 정수 부분만 반환하는 함수

 

(5)

import math

 

def solution(num1, num2):

    answer = math.floor(num1 / num2 * 1000)

    return answer

 

**

math.trunc() 와 math.floor() 는 모두 소수점 이하를 제거한 값을 반환한다.

그러나 음수를 파라미터로 받을때 

math.trunc()는 0을 향해 소수점 이하를 버리지만

math.floor()는 더 작은 정수로 내림하여 반환한다. 

 

 

  • math.trunc(-2.3)는 -2를 반환합니다.
  • math.floor(-2.3)는 -3을 반환합니다.

2. 숫자 비교하기 

 

 

[내 풀이]

def solution(num1, num2):

    answer = 0

 

    if num1 - num2 == 0:

        answer = 1

    else:

        answer = -1

    return answer

 

:여기선 다름아닌 들여쓰기가 헷갈렸다;

 

[다른 풀이]

(1)

def solution(num1, num2) :

    return 1 if num1 == num2 else -1

(2)

def solution(num1, num2):

    answer = -1

 

    if num1 == num2 :

        answer = 1

    return answer

 

(3) 

def solution(num1, num2):
    return sum([num1 == num2]) * 2 - 1

 

True : 1 *2 - 1 = 1

False : 0 * 2 - 1 = -1


3. 분수의 덧셈

[내 풀이 ] - 첫번째 : 테스트 결과 정확성 33.3로 통과 못함.

 

def solution(numer1, denom1, numer2, denom2):
    answer = []
    
    if denom1 % denom2 == 0 or denom2 % denom1 == 0:
        if denom1 > denom2 :
            num2 = denom1
            num1 = numer1 + (numer2 * denom1 // denom2)
        else : 
            num2 = denom2
            num1 = numer2 + (numer1 * denom2 // denom1)
            
    else : 
        num2 = denom1 * denom2
        num1 = denom1* numer2 + denom2 * numer1
        
    
    answer.append(num1)
    answer.append(num2)
    
    return answer

whyrano~~~~~~~~~~

[내 풀이] 2차시... 

import math
def solution(numer1, denom1, numer2, denom2):
   
    #분모의 최소공배수 구하기
    lcm = math.lcm(denom1, denom2)
   
    #분모를 최소공배수로 바꿔주고 분자도 그에 맞게 값 바꿔주기
    num1 = (lcm//denom1) * numer1 + (lcm//denom2) * numer2
    num2 = lcm
   
    return [num1, num2]

print (solution(1,2,3,4))

vs 에서 잘만 돌아가는데 왜 안된다는겁니까..

 

파라미터 4개를 모두 같은 값으로 받았을 때 2/1 로 기약분수 형태로 나와야하는데 약분이 안되는것이 문제쓰~ 

    if num1 % num2 == 0 or num2 % num1 == 0:
        num1 = int(num1/num2)
        num2 = int(num2//num2)

    return [num1, num2]

기약분수로 했는데도!! 아직도..~!! 반례가 남았다니

정확성: 46.7
한번만 나눠주면 안된다고 한다. ..ㅇㅋ 
 

[내 풀이 ] final             
def solution(numer1, denom1, numer2, denom2):    
    
    #분모가 서로 약수 관계이면 
    if denom1 % denom2 == 0 or denom2 % denom1 == 0:
        #더 큰 값에 맞추어 통분한다 
        if denom1 > denom2 :
            num2 = denom1
            num1 = numer1 + (numer2 * denom1 // denom2)
        else : 
            num2 = denom2
            num1 = numer2 + (numer1 * denom2 // denom1)
    # 약수관계가 아니면 각 분자에 다른 분모를 곱한 값을 더하기 -> 근데 이러면 너무 값이 커질수있단말이지 이러나 저러나 약분 시켜야댐
    else : 
        num2 = denom1 * denom2 
        num1 = denom1 * numer2 + denom2 * numer1
    
    # 소수 i로 약분하기 

    # 더 큰 값을 x로 넣기 
    if num1 >= num2:
        x = num1
    else : x = num2
    for i in range (2, x ):
        while num1 % i == 0 and num2 % i== 0: 

# (같은 i 로 두 숫자에 대하여) 자기 자신까지 숫자 중에 나눠서 0으로 떨어지는 것들이 있으면 나눠버려라~ 
            num1 //= i
            num2 //= i

    return [num1, num2]

 

 

드뎌 풀어따 😘🎉
math.gcd 으로 최대공약수 쓰고싶었으나 사용이 안되오.. 
다들 참 풀이가 심플하시네 ㅠ 부럽다 ㅋ ... 

4. 배열 두배 만들기 

 

[내 풀이]

def solution(numbers):
    answer = []
    for i in numbers:
        answer.append(i * 2)
    return answer

 

[다른 풀이]

 

(1) 

def solution(numbers):

    return [num*2 for num in numbers]

: 리스트 컴프리헨션 [ 표현식 for 반복가능객체 if 조건문 ]

 

(2) 

def solution(numbers):

    return list(map(lambda x : x*2, numbers))

: 하지만 댓글을 보니  map이랑 lambda 는 같이 쓰면 느려진다규?

map > list comprhension > map + lambda > for loop 순으로 빠르다 

 

(3) 

import numpy as np

 

def solution(numbers):

    answer = []

    answer = np.array(numbers)*2

    answer = answer.tolist()

 

    return answer

 

** numpy 란 : Numerical Python 다차원 배열을 다루는데 특화된 라이브러리 

더보기

 

  1. 다차원 배열 (ndarray):
    • numpy의 핵심 데이터 구조는 ndarray로, N차원의 배열을 제공합니다. 이 배열은 모든 원소가 동일한 데이터 타입을 가지며, 데이터 접근이 빠르고 효율적입니다.
  2. 배열 연산:
    • numpy는 배열을 사용하여 벡터 및 행렬 연산을 지원합니다. 예를 들어, 배열 간의 요소별 연산, 선형 대수 연산 (행렬 곱셈 등)을 쉽게 수행할 수 있습니다.
  3. 브로드캐스팅 (Broadcasting):
    • numpy는 서로 다른 모양의 배열 간에도 산술 연산을 수행할 수 있도록 도와주는 브로드캐스팅 기능을 제공합니다. 이는 코드를 간결하게 작성할 수 있게 해줍니다.
  4. 유니버설 함수 (Universal Functions, ufuncs):
    • numpy는 배열의 각 요소에 대해 적용할 수 있는 다양한 수학 함수를 제공합니다. 예를 들어, 삼각 함수, 지수 함수, 로그 함수 등이 이에 해당합니다.
  5. 속도와 메모리 효율성:
    • numpy 배열은 C로 구현되어 있어 빠른 연산 속도와 효율적인 메모리 사용을 보장합니다. 특히 대용량 데이터 처리에 적합합니다.

numpy의 유용성

numpy는 데이터 분석, 과학적 계산, 머신러닝, 이미지 처리 등 다양한 분야에서 널리 사용됩니다. 주요 사용 사례는 다음과 같습니다:

  • 데이터 분석: 대용량 데이터의 처리 및 분석을 위한 배열 연산과 통계 함수 제공.
  • 과학적 계산: 수치 해석, 시뮬레이션, 통계적 모델링 등을 위한 강력한 도구로 사용.
  • 머신러닝: 데이터 전처리, 모델 학습, 예측 등에서 numpy 배열을 통해 데이터를 효율적으로 관리하고 계산을 수행.
  • 이미지 처리: 이미지 데이터의 다차원 배열로 변환하여 필터링, 변환, 분석 등을 수행.

numpy 배열 vs. 일반 Python 리스트

numpy 배열:

  • 다차원 배열: numpy의 핵심 데이터 구조로, N차원의 배열을 표현합니다.
  • 고성능: C 언어로 구현되어 있어 데이터 접근과 연산이 빠르고 메모리 사용이 효율적입니다.
  • 동일한 데이터 타입: 모든 요소가 동일한 데이터 타입을 가져야 하며, 이는 메모리 사용의 효율성을 높이는 장점이 있습니다.
  • 벡터화 연산: 배열의 각 요소에 대해 벡터화 연산을 지원하여 코드를 간결하게 작성할 수 있습니다.
  • 유니버설 함수 (ufuncs): 배열의 요소에 대해 적용할 수 있는 다양한 수학 함수를 제공합니다.

일반 Python 리스트:

  • 동적 타입 지원: 리스트는 다양한 데이터 타입을 포함할 수 있으며, 동적으로 크기가 조정될 수 있습니다.
  • 일반적인 데이터 구조: 간단한 데이터 저장 및 처리에 유용합니다.
  • 느린 속도: 대용량 데이터 처리나 수치 연산에서는 numpy 배열보다 성능이 떨어질 수 있습니다.

numpy 배열을 일반 리스트로 변환하는 방법

numpy 배열을 일반 Python 리스트로 변환하는 방법에는 여러 가지가 있습니다:

1. tolist() 메서드 사용:

  • numpy 배열 객체의 tolist() 메서드를 사용하여 리스트로 변환할 수 있습니다.

2. 내장리스트 생성자 사용:

  • list() 생성자를 사용하여 numpy 배열을 변환할 수도 있습니다.

3. 다차원 배열의 경우:

  • 위의 예시는 1차원 배열을 변환하는 경우입니다. 다차원 배열의 경우에도 동일한 방법으로 변환할 수 있으며, tolist() 메서드는 다차원 배열에서도 동작합니다.

 

(4) 

def solution(numbers):

    answer = []

    for i in range(len(numbers)):

         answer.append(numbers[i]*2)

    return answer