[알고리즘] 파이썬 프로그래머스

김선은·2024년 3월 20일

알고리즘 문제

목록 보기
1/4

항해 99 취업 리부트 코스에 참여!

알고리즘과 자료구조를 보다 익히기 위해 파이썬으로 문제를 푸는 시간을 가졌다.

1. 하샤드의 수

생각한 접근 방식

  1. x(0~10000)로 입력받는 값을 문자열로 바꿔서 리스트에 담고, 쪼개기
  2. 쪼갠 값을 정수로 바꾸고 합계를 구하기
  3. 합계를 x로 나눈 나머지 값이 0인지 확인하기
def solution(x):
    nums = [int(number) for number in str(x)]
    
    total = sum(nums)
    return x % total == 0

리스트 컴프리헨션은 파이썬에서 간결하게 리스트를 생성하는 방법 중 하나이다.

2. 두 정수 사이의 합

접근하기

  1. a와 b 사이의 정수 값들을 범위로 접근해야 함.
  • 정수 a와 b 사이의 모든 정수를 구하려면 range(a, b+1)을 사용할 수 있다.
a = 3
b = 5

# a와 b 사이의 모든 정수를 출력
for num in range(a, b + 1):
    print(num)
  • a=3이고 b=5라면, range(3, 6)을 사용하여 3부터 5까지의 정수를 생성할 수 있다.
numbers = list(range(3, 6))
print(numbers)  # [3, 4, 5]

풀이

def solution(a, b):
    
    # a와 b가 같으면 아무 수나 리턴
    if a == b:
        return a

    # a와 b 중 큰 값 찾기
    min_value = min(a,b)
    max_value = max(a,b)
    
    # a와 b 사이의 범위값 구하기
    result = range(min_value, max_value+1)
    
    return sum(result)

3. 콜라츠의 추측

접근하기

  1. 주어진 num의 나머지 값으로 짝수 홀수를 구분하고
  2. 그에 따라 if로 분기해서 콜라츠의 추측에 따라 작업을 하기
  3. 그 작업마다 count를 1씩 증가시켜서 몇번 콜라츠의 추측의 작업을 했는지 알아내기.

4. 서울에서 김서방 찾기

접근하기

  1. 문자열 배열을 받는데 그 중에 "Kim" 찾기가 관건이다.
  2. 그게 어느 인덱스에 있는지 알아야 뽑아낼 수 있다.
def solution(seoul):
    i = seoul.index("Kim")
    return "김서방은 " + str(i) + "에 있다"

다른 방법

enumerate() : 배열의 각 요소와 해당 요소의 인덱스를 순회할 때 유용하게 사용

def solution(seoul):
    for idx, name in enumerate(seoul):
        if name == "Kim":
            return "김서방은 " + str(idx) + "에 있다"

5. 나누어 떨어지는 숫자 배열

접근하기

  1. 주어진 배열의 요소들을 divisor로 나누어 떨어지는 요소를 찾기
  2. 나누어 떨어지는 요소들의 배열을 오름차순으로 정렬하기
  3. 나누어 떨어지는 요소가 없다면 [-1] 리턴하기 → count = 0 두고 나머지 값이 0이 아닐때를 카운트하려 했는데 뒤집어서 생각하면 나머지값이 0일 때 넣는 배열의 길이가 0인 경우를 보면 됨.
def solution(arr, divisor):
    result = []
    
    for num in arr:
        if num % divisor == 0:
            result.append(num)
            
    result.sort()
    
    if len(result) == 0:
        result = [-1]

    return result

6. 수박수박수

접근하기

n이 4면은 수박수박, n이 8이면 수박수박수박수박.

“수박” 곱하기 n/2 를 하면 되지만 정수값이 필요하기에 // 연산자를 사용한다.

n이 홀수일 때는 “수” 만 추가해주기.

def solution(n):
    pattern = "수박" * (n//2)
    if n % 2 != 0:
        pattern += "수"
    return pattern

좋아보였던 풀이

def water_melon(n):
    # 함수를 완성하세요.

    return "수박" * (n//2) + "수" * (n%2)

7. 내적

접근하기

a 리스트의 i번째와 b리스트의 i 번째를 곱하고, 그 다음 i 번째의 곱과 합산해야 함.

i번째 끼리 곱한 값을 새 리스트에 넣고, sum으로 전부 더하자.

def solution(a, b):
    i = 0
    answer = []
    while i < len(a):
        answer.append(a[i] * b[i])
        i += 1
        
    return sum(answer)

zip과 리스트 컴프리헨션 활용하기

def solution(a, b):

	return sum([x*y for x,y in zip(a,b)])

8. 약수의 개수와 덧셈

• 1 ≤ left ≤ right ≤ 1,000 left와 right 사이의 숫자들이 각각 약수가 짝수인지 홀수인지 찾기

짝수인 숫자는 더하고 홀수인 숫자는 빼서 합계 구하기.

a = 13
b = 17

total = 0

for num in range(a,b+1):
    count = 0 # 짝홀 판별할 약수의 개수
    for i in range(1, num+1):
       if num % i == 0: # True로 나오는 게 약수
           count += 1
    if count % 2 == 0: # 약수가 짝수인 경우
        total += num
    else:
        total -= num
print(total) # 43

9. 문자열 내림차순

조건: s에 나타나는 문자를 큰것부터 작은 순으로 정렬해 새로운 문자열을 리턴하기

접근: 정렬 메소드 알아보기. 문자열에 사용해야하고, reverse 도 가능한지 봐야함

def solution(s):
    answer = ''.join(sorted(s, reverse=True))
    return answer

포인트: reverse는 리스트에서 사용하고 문자열에서 하려면 sotred 내부에서 reverse를 사용해서 처리해야함.

sorted는 리스트로 변환시키기에 join 으로 일반 문자열로 다시 바꿔준다.

10. 부족한 금액

price = 3
money = 20
count = 4

# 3x1 3x2 3x3 3x4 1부터 카운트까지 가격 증가

total = 0
for num in range(1, count+1):
    total += price * num
if money - total < 0:
    print(total - money)
else:
    print(0)

if문 짧게 쓰는 방법

for x in range(1, count + 1):
        allPrice += x * price
    
return allPrice - money if money - allPrice < 0 else 0
    #참일때 할 식 if 조건문 else 거짓일때 할 식
profile
기록은 기억이 된다

0개의 댓글