sooleeandtomas

[day12] 코딩테스트 알고리즘 - lv.2 완전 탐색 (소수 찾기) python (feat.permutations) 본문

코딩테스트 알고리즘/탐색

[day12] 코딩테스트 알고리즘 - lv.2 완전 탐색 (소수 찾기) python (feat.permutations)

sooleeandtomas 2022. 10. 8. 00:55
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

오늘은 python 문법 폭탄을 맞았다.

python의 set, permutations, 병합 업데이트 연산자 |= vs |, extend vs append  ... 를 배웠다.

하단에 나와있는 문법들을 참고하여 아래 코드를 보자.

 

참고 코드

from itertools import permutations

def solution(numbers):
    answer = 0
    case = makeCase(numbers)
    for n in case:
        if isPrime(n):
            answer += 1
    return answer
    
    
def makeCase(numbers):
    result = []
    for i in range(1, len(numbers) + 1):
        permutated = map(''.join, permutations(numbers, i)) 
        #join으로 ('1','2')의 형태를 '12'문자열로 합쳐줌
        mapped = list(map(int, permutated))
        #'12'문자열을 12 숫자로 형변환
        result.extend(mapped)
        # 반복문을 돌며 각각 생성됬던 배열들을 하나로 합쳐줌. [...]
    result = list(filter(lambda x:x > 1, list(set(result))))
    return result
    
    
def isPrime(number):
    for i in range(2, int(number * 1/2) + 1):
        if number % i == 0:
            return False
    return True

 

다른 사람의 코드 #에라토스테네스 체를 set을 이용하여 풀었다. 

from itertools import permutations
def solution(n):
    a = set()
    for i in range(len(n)):
        a |= set(map(int, map("".join, permutations(list(n), i + 1))))
    	#print('a1')
    a -= set(range(0, 2))
    #print('a2')
    for i in range(2, int(max(a) ** 0.5) + 1):
        a -= set(range(i * 2, max(a) + 1, i))
        #print('set')
        #print('a3')
    return len(a)
    
solution('17')
    
#a1: {1, 7}
#a1: {1, 71, 17, 7}

#a2 {71, 17, 7}

#set {4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70}
#a3 {71, 17, 7}

#set {6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60, 63, 66, 69}
#a3 {71, 17, 7}

#set {32, 64, 36, 68, 8, 40, 12, 44, 60, 16, 48, 20, 52, 24, 56, 28}
#a3 {71, 17, 7}

#set {65, 35, 70, 40, 10, 45, 15, 50, 20, 55, 25, 60, 30}
#a3 {71, 17, 7}

#set {66, 36, 42, 12, 48, 18, 54, 24, 60, 30}
#a3 {71, 17, 7}

#set {35, 70, 42, 14, 49, 21, 56, 28, 63}
#a3 {71, 17, 7}

#set {32, 64, 40, 16, 48, 24, 56}
#a3 {71, 17, 7}

permutations

프로그래머스의 레벨2 완전탐색 - 소수찾기 문제

파이써닉하다라는게 이런것인걸까 . . . ?

permutations를 사용하면 조합을 알아서 해준다.

from itertools import permutations
from itertools import permutations
a = '123'
permutated = list(permutations(a, 2))
#[('1', '2'), ('1', '3'), ('2', '1'), ('2', '3'), ('3', '1'), ('3', '2')]

joined = list(map(''.join, permutated))
#['12', '13', '21', '23', '31', '32']

mapped = list(map(int, joined))
#[12, 13, 21, 23, 31, 32]

 

extend vs append

extend는 iterable한 항목을 펼쳐서 넣어줍니다.

append는 항목 자체를 통째로 넣어줍니다.

a = ['1','2','3']
b = ['4','5','6']

a.append(b)
print(a)
#['1','2','3', ['4','5','6']]

a.extend(b)
print(a)
#['1','2','3','4','5','6']

 

python set 집합 자료형

집합 자료형의 특징은 아래와 같다.

  • 중복을 허용하지 않는다.
  • 순서가 없다(Unordered).
  • -= 연산을 통해 삭제할 수 있다.
  • |= 연산을 통해 병합할 수 있다.
a = {1, 7}
a -= set(range(0, 2))
# a = {7}

s2 = set("Hello")
#s2 = {'e', 'H', 'l', 'o'}

s1 = set([1,2,3])
#s1 = {1, 2, 3}

 

 

병합 업데이트 연산자 (|=)

d1 = {"a": 0, "b": 1, "c": 2}
d2 = {"c": 20, "d": 30}

# Merge, | 
d1 | d2
{"a": 0, "b": 1, "c": 20, "d": 30}
#d1 = {"a": 0, "b": 1, "c": 2}

# Update, |=
d1 |= d2
#d1 = {"a": 0, "b": 1, "c": 20, "d": 30}

참고 글   

 

Comments