[Python] 파이썬 코딩테스트 왕기초 쌓기 (with 프로그래머스)

송히·2024년 4월 25일
0
post-thumbnail

프로그래머스 코딩테스트 입문 Python3 - Lv0 풀이 모음

언어 제한 때문에 자바스크립트로 코딩테스트를 볼 수 없는 경우가 너무 많아서 파이썬 코딩테스트도 연습하기로 했습니다😂 (언어 여러 개 익히고 오히려 좋아~~ㅋㅎㅋㅎ)

저같은 경우가 많을 것 같아서 블로그를 작성하게 되었습니다 ㅎㅎ
제가 느끼기에 낯설었던 파이썬의 내장 함수, 조금씩 다른 문법 등문제와 함께 정리해두었으니, 서브 코테 언어를 준비하시는 분들께 도움이 되기를 바라봅니당 😎

또, 프로그래머스에서는 언어에서 파이썬 2와 파이썬 3을 선택할 수 있는데 저는 파이썬3을 사용했습니다!
(파이썬 2는 2020년에 개발이 중지되었다고 합니당~ [Python] 파이썬 2와 파이썬 3의 차이점)

추천 참고 블로그: [Python] 코딩테스트에서 자주 사용되는 주요 라이브러리 | ⭐️ 코딩 테스트를 위한 파이썬 알고리즘 문법


🔍 분수의 덧셈

클릭해서 문제 전체 보기🔼

📖 풀이 코드

import math

def solution(numer1, denom1, numer2, denom2):
    denomGcd = math.gcd(denom1, denom2)
    multiple1 = denom2 // denomGcd
    multiple2 = denom1 // denomGcd
    denom = denom1 * multiple1
    numer = (numer1 * multiple1) + (numer2 * multiple2)
    
    finalGcd = math.gcd(denom, numer)
    return [numer // finalGcd, denom // finalGcd]

📢 풀이 설명
파이썬은 내장 함수가 잘 되어있어서 최대공약수를 일일이 구현하지 않아도 된다.
미리 살펴보지 않고 냅다 구현하느라 시간을 많이 썼어요,, 내장 함수에 뭐가 있는지 잘 살펴보는 것도 중요함을 느꼈습니다 ^^...

  • math.gcd(숫자들): 최대공약수 함수, 입력받은 숫자들의 최대공약수를 반환함(정수 형태)
    -> 파이썬 3.9 버전 이상만 1개 이하 혹은 3개 이상의 숫자들 가능 (3.8 이하는 인자 2개만 계산 가능, 프로그래머스 파이썬3은 2개만 가능해용 !)

  • math.lcm(숫자들): 최소공배수 함수, 입력받은 숫자들의 최소공배수를 반환함(정수 형태)
    => 인자 중 하나라도 0이면 0 반환
    -> 파이썬 3.9 버전 이상에서만 지원함

import math

math.gcd(3, 6) #최대공약수인 3 반환
math.lcm(3, 6) #최소공배수인 6 반환

🔍 배열 두 배 만들기

클릭해서 문제 전체 보기🔼

📖 풀이 코드

def solution(numbers):
    return [number * 2 for number in numbers]

📢 풀이 설명

  • 리스트 컴프리헨션: [] 안에서 for문, if문을 사용해 조건을 만족하는 대상만 리스트로 생성하는 것
    => 대괄호 안에서 조건에 수식, 함수, if-else문까지 사용 가능
    -> 한 줄로 표현 가능하면서 직관적이며 속도까지 빠름
# 단순 반복
[i for i in range(5)] # [0, 1, 2, 3, 4]

# 함수 넣기
def func(a):
	a = print(a, "번째")
    return a
    
[func(i) for i in range(5)] # [0 번째, 1 번째, 2 번째, 3 번째, 4 번째]

# if문 -> 조건문을 오른쪽에 씀, if문 여러 개 사용 가능
[표현식 for 항목 (in 반복가능객체) if]
[i for i in range(5) if i % 2 == 0 if i % 4 == 0] # [0, 4]

# if- else문 -> 조건문을 왼쪽에 씀
[표현식 if-elsefor 항목 (in 반복가능객체)]
[i if i % 2 == 0 else "odd" for i in range(5)] # [0, "odd", 2, "odd", 4]

[Python의 꽃] 리스트 컴프리헨션(List Comprehension)


🔍 최빈값 구하기

클릭해서 문제 전체 보기🔼

📖 풀이 코드

def solution(array):
    if len(array) == 1:
        return array[0]
    
    uniqueArray = list(set(array))
    
    if len(uniqueArray) == 1:
        return array[0]
    
    arrayCount = [[num, array.count(num)] for num in uniqueArray]
    arrayCount.sort(key = lambda x: x[1], reverse = True)
    
    return arrayCount[0][0] if arrayCount[0][1] != arrayCount[1][1] else -1
    

📢 풀이 설명
정렬의 2가지 방법

  • sorted(요소 배열): 원본을 바꾸지 않고 정렬한 값을 반환함
    -> 리스트 뿐만 아니라 튜플, dict, str 모두 사용 가능

  • 요소배열.sort(): 원본 리스트 자체를 정렬하여 바꾸고, 반환값음 없음

이중 리스트에서의 정렬

# [[a1, b1], [a2, b2], [a3, b3]] 형태
array = [[1, "가"], [4, "다"], [3, "라"], [2, "나"]]

# `a(앞 인자)`를 기준으로 정렬
sorted(array, key = lambda x: x[0]) # [[1, "가"], [2, "나"], [3, "라"], [4, "다"]]
array.sort(key = lambda x: x[0]) # [[1, "가"], [2, "나"], [3, "라"], [4, "다"]]

# `b(뒷 인자)`를 기준으로 정렬
sorted(array, key = lambda x: x[1]) # [[1, "가"], [2, "나"], [4, "다"], [3, "라"]]
array.sort(key = lambda x: x[1]) # [[1, "가"], [2, "나"], [4, "다"], [3, "라"]]

[python] sorted(), sort(), key 사용법 | 파이썬 (Python) - (정렬 총정리) ~


🔍 배열의 평균값

클릭해서 문제 전체 보기🔼

📖 풀이 코드 1

from functools import reduce

def solution(numbers):
    sum = reduce(lambda acc, cur: acc + cur, numbers)
    return sum / len(numbers)

📢 풀이 설명 1

  • reduce(lambda acc, cur: (acc와 cur를 이용한 연산식), (반복할 배열), (초기값 => 필수 아님)): 데이터 집합(리스트, 문자열, dict, ...) 요소들을 연산하여 누적된 값을 반환
    -> 파이썬 3부터는 내장 함수가 아니게 되었기 때문에 import 필수 !
from functools import reduce

array = [1, 3, 5, 7, 9]
reduce(lambda acc, cur: acc * cur, array, 1) # 945

📖 풀이 코드 2

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

📢 풀이 설명 2
충격적 메서드를 봤다. 바로 sum.,,
reduce를 이용할 필요없이 그냥 sum 함수만으로도 총합을 구할 수 있다니... 너무 충격이다

  • sum(반복할 배열, (초기값 => 필수 아님)): 숫자로만 이루어진 데이터 집합(리스트, 튜플)의 요소들을 모두 더한 값을 반환
    -> 숫자만으로 이루어지지 않았으면 에러 발생
    -> 비어있는 인자를 넣으면 0 반환(초기값 0 + 비어있으니 총 합 0 = 0)
array = [1, 3, 5, 7, 9]
sum(array) # 25
sum(array, 100) #125

🔍 자릿수 더하기

클릭해서 문제 전체 보기🔼

📖 풀이 코드 1

def solution(n):
    result = 0
    for i in str(n):
        result += int(i)
        
    return result

📢 풀이 설명 1
이 문제에서 봐야할 포인트는 2가지라고 생각한다.

  1. 정수에서 for문을 돌기 위해서는 앞에 str을 붙여서 문자열로 만들기
    -> for문은 iterable한 데이터에서만 돌 수 있기 때문에 리스트, 문자열, 튜플 등 반복 가능한 데이터에서만 사용해야한다. 정수는 숫자 한덩어리이기 때문에 for을 쓸 수 없음 !
  2. 문자열 값을 숫자로 만들기 위해서는 앞에 int를 붙여야함

📖 풀이 코드 2

def solution(n):
    return sum(int(i) for i in str(n))

📢 풀이 설명 2
다른 사람의 풀이를 보다가 더 간단히 작성할 수 있다는 걸 깨달았다. 파이선을 잘 쓰려면 진짜 내장함수를 야무지게 이용해야겠다 !!


🔍 피자 나눠 먹기 (3)

클릭해서 문제 전체 보기🔼

📖 풀이 코드

def solution(slice, n):
    dividing, remain = divmod(n, slice)
    return dividing if remain == 0 else dividing + 1

📢 풀이 설명

  • divmod(): 2개의 숫자를 매개변수로 받고, 몫과 나머지를 튜플로 반환함
    -> 작은 숫자를 다룰 때는 //이나 %보다 느림 (큰 숫자일 수록 유리함)

🔍 문자 반복 출력하기

클릭해서 문제 전체 보기🔼

📖 풀이 코드

def solution(my_string, n):
    return "".join([i*n for i in my_string])

📢 풀이 설명

  • "구분자".join(리스트): 구분자를 기준으로 리스트를 연결시켜줌

    arr = ["가", "나", "다"]
    
     "".join(arr)  # 가나다
     "_".join(arr)  # 가_나_다
     "^^^".join(arr)  # 가^^^나^^^다

🔍 가장 큰 수 찾기

클릭해서 문제 전체 보기🔼

📖 풀이 코드

def solution(array):
    maxNum = max(array)
    return [maxNum, array.index(maxNum)]

📢 풀이 설명

  • 특정 문자의 첫 번째 idx 찾는 메서드

    • index(찾을 문자, (찾기 시작할 idx, 끝낼 idx)): 찾을 문자의 첫 번째 idx를 반환함
      -> 찾을 문자가 없는 경우 -1 반환
      -> 문자열에서만 사용 가능 (리스트, 튜플, dict 사용 불가)

    • find(찾을 문자, (찾기 시작할 idx, 끝낼 idx)): 찾을 문자의 첫 번째 idx를 반환함
      -> 찾을 문자가 없는 경우 ValueError 에러 발생
      -> 문자열, 리스트, 튜플에서 사용 가능 (dict 사용 불가)

  • 특정 문자의 모든 idx 찾는 방법
    - filter 메서드 사용

    arr = [1, 2, 3, 1, 1, 4]
    
    		allIdx = list(filter(lambda x: arr[x] == 1, range(len(arr))))  # [0, 3, 4]

🔍 숨어있는 숫자의 덧셈 (1)

클릭해서 문제 전체 보기🔼

📖 풀이 코드

def solution(my_string):
    return sum(int(i) for i in my_string if i.isdigit())

📢 풀이 설명

  • isdigit(): 모든 문자열이 숫자로만 이루어져있는지 판단 후 불린값 반환
    -> -, . 이런 기호들도 전부 문자로 판단하기 때문에 양의 정수만 가능
    ```python
    str = "123abc-45"
    
    # 정의된 문자열 갖다 쓰기
    str.isdigit()  ## False
    
    # 문자열 직접 쓰기
    isdigit("1234567890")  # True
    ```

🔍 암호 해독

클릭해서 문제 전체 보기🔼

📖 풀이 코드 1

def solution(cipher, code):
    return "".join([i for idx, i in enumerate(cipher) if (idx + 1) % code == 0])

📢 풀이 설명 1

  • enumerate(): 순서가 있는 데이터를 (idx, 값) 형태의 튜플로 반환함
    arr = [0, 1, 2]
     list(enumerate(arr))  # [(0, 0), (1, 1), (2, 2)]

📖 풀이 코드 2

def solution(cipher, code):
    return cipher[code-1::code]

📢 풀이 설명 2
다른 사람 풀이를 보다보니 [::] 형태가 있길래 찾아봤다. 알고보니 내가 슬라이싱이라고 알고 있던 것의 원본이었다..!

  • data.[start(기본값 0):stop(기본값 데이터 길이(크기)):step(기본값 1)]: 일정한 간격으로 요소들을 선택하는 슬라이싱 연산자
    -> 각 요소들은 다 생략 가능 (생략되면 기본값 적용됨)
    => start에서부터 stop까지 step단위로 선택하겠다는 뜻

    str = "0123456789"
    
     str[1:8:3]  # 147
     str[:8:3]  # 25, start 생략된 것
     str[1::3]  # 147, stop 생략된 것
     str[1:7]  # 123456, step 생략된 것

🔍 배열의 유사도

클릭해서 문제 전체 보기🔼

📖 풀이 코드

def solution(s1, s2):
    return len(set(s1) & set(s2));

📢 풀이 설명

  • 집합 자료형의 연산
    1. a | b: A와 B의 합집합 (A U B)
    2. a & b: A와 B의 교집합 (A n B)
    3. a - b: A와 B의 차집합 (B - A도 가능)

🔍 세균 증식

클릭해서 문제 전체 보기🔼

📖 풀이 코드

def solution(n, t):
    return n << t

📢 풀이 설명

  • 비트 쉬프트 연산: 정수를 2배로 곱하거나 나누어 계산함
    -> 컴퓨터는 2진수로 값이 저장되기 때문에, 비트를 왼쪽 / 오른쪽으로 밀면 값이 1/2배 / 2배
    -> <<: 2배, >>: 1/2배 (반토막)

    num = 10
    
     num << 1  # 20, (10 * 2)임
     num << 5  # 320, (10 * 2 * 2 * 2 * 2 * 2)임
     num >> 1  # 5, (10 // 2)임
     num >> 2  # 2, (10 // 2 // 2)임
profile
데브코스 프론트엔드 5기

0개의 댓글

관련 채용 정보