(네이버 코트 준비) 알고리즘 학습 8일차

주요 포인트

  • 스택/큐와 리스트를 사용하여 문제를 풀 때,
    • 목록에 포함될 조건을 만족하는지 확인합니다.
    • 목록에 채워진 숫자가 항상 순차적으로 채워질 필요는 없습니다. 스택에 남은 값이 없을 때까지 진행할 수 있습니다.
  • functools 가져오기
    • functools.cmp_to_key(func): 정의된 func 함수의 반환 값(1, 0, -1)에 따라 정렬 가능한 키 값 제공
    • sorted_list = 정렬됨(목록, 키=functools.cmp_to_key(n, m))
    • https://wikidocs.net/109303

  • int 유형의 목록을 문자열로 변환
    • 목록(지도(str, 목록))
  • 소수 찾기: 1과 자기 자신 외에 약수가 없는 수.

Python – 소수 알고리즘 구현

코딩 시험을 공부하거나 준비할 때 특정 숫자가 소수인지 아닌지 판단해야 할 때가 있습니다. 소수는 1과 자기 자신 이외의 수로는 나누어지지 않습니다.

coding-of-today.tistory.com

(프로그래머) 소수 찾기 (연습) (python)

(프로그래머) 소수 찾기 (연습) (python) 레벨1 문제 설명 1과 입력한 숫자 n 사이의 소수의 개수를 반환하는 함수 solution을 만드세요. 소수는 1과 자기 자신으로만 나누어집니다.

코딩-lks.tistory.com

(Python) 순열, 조합

Python의 itertools를 사용하면 for 루프 없이 순열 및 조합을 구현할 수 있습니다.

velog.io

1. 뒤에 있는 큰 수 찾기

이 문제에 대한 코드는 간단하지만 아이디어는 단순해 보이지 않습니다.

숫자의 인덱스는 스택에 순차적으로 쌓이고 스택의 마지막 인덱스 값과 현재 인덱스 값을 항상 비교한다.

현재 인덱스가 크면 answer에 값이 저장됩니다.

def solution(numbers):
    stack = ()
    answer = (-1) * len(numbers)

    for i in range(len(numbers)):
        while stack and numbers(stack(-1)) < numbers(i):
            #가장 가까운 뒷 큰수일 때, 해당 자리의 숫자를 answer로 넣어줌. 
            #stack.pop() == stack(-1)
            answer(stack.pop()) = numbers(i)
        stack.append(i)
    
    return answer

2. 가장 큰 숫자

이 문제에 대한 코드도 간단하지만 아이디어는 간단하지 않습니다.

정렬을 위한 새로운 기능을 소개합니다.

import functools

def comp(n, m):
    if int(n+m) < int(m+n):
        return 1
    elif int(n+m) == int(m+n):
        return 0
    else:
        return -1
    
def solution(numbers):
    numbers = list(map(str, numbers))
    sorted_list = sorted(numbers, key=functools.cmp_to_key(comp))
    answer="".join(sorted_list)
    # '0000' -> '0'으로 바꿔주기 위한 코드 
    return str(int(answer))

3. 소수 찾기

이 문제는 수준 1입니다.

  • 어떤 숫자가 n의 제곱근으로 나누어 떨어지는지 확인합니다.
def is_prime(n):
    if n <= 1: return False
    else:
    
        for i in range(2, int(n**(1/2))+1):
            if n % i == 0 :
                return False
        return True

에라토스테네스의 체를 사용할 때 그 원리는 다음과 같다.

  • 2에서 n까지의 정수가 set() 데이터 유형으로 answer에 저장됩니다.
  • for 문은 2부터 n까지를 실행하는데 답에 i가 있으면 n까지의 숫자 중 i의 배수를 모두 제거한다.
  • 답에는 2에서 n까지의 소수만 남습니다.
  • len(answer)을 반환하여 해결했습니다!
def solution(n):
    answer = set(range(2,n+1))
    
    for i in range(2,n+1):
        if i in answer:
            answer -= set(range(i*2,n+1,i))
    return len(answer)

import itertools

def is_prime(n):
    if n <= 1: return False
    else:
    
        for i in range(2, int(n**(1/2))+1):
            if n % i == 0 :
                return False
        return True
    
def solution(numbers):
    # 문자열을 리스트화 
    numbers = list(numbers)
    stack = ()
    answer = 0
    #조합 가능한 모든 경우의 수 구하기 
    for i in range(1, len(numbers)+1):
        for j in list(itertools.permutations(numbers, i)):
            num = int(''.join(j))
            if num not in stack: 
                stack.append(num)
                if is_prime(num):
                    answer += 1
                
    return answer