몽-구
몽구의 우당탕탕 개발 공부
몽-구
전체 방문자
오늘
어제
  • 분류 전체보기 (106)
    • PS (38)
      • 백준 (24)
      • 프로그래머스 (14)
    • Dev (58)
      • Kotlin (0)
      • Java (4)
      • Spring, SpringBoot (1)
      • C (8)
      • Python (10)
      • Dart (1)
      • 알고리즘 (7)
      • 자료구조 (3)
      • Git (1)
      • Linux (2)
      • VS Code (1)
      • 환경 설정 (8)
      • Conference (1)
      • 42Seoul (3)
      • Node.js (1)
      • ShellScript (1)
      • IntelliJ (0)
      • MacOS (2)
      • 기타 (3)
    • CS (1)
      • 데이터베이스 (1)
    • DS (4)
      • Coursera (4)
    • 리뷰 (1)
      • 제품 리뷰 (1)
    • 일상 (3)
      • 자동화 (1)
      • 목표 및 계획 (2)
      • 회고 (0)
    • 삶에 대한 태도 (1)
      • 유튜브를 보며 (1)

블로그 메뉴

  • GitHub

인기 글

반응형

태그

  • 백준온라인저지
  • 정렬
  • Linux
  • 프로그래머스
  • 백준
  • Python
  • BOJ
  • c언어
  • 리눅스
  • 알고리즘
  • sort
  • 코딩테스트
  • 파이썬
  • Algorithm
  • 백준알고리즘

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
몽-구

몽구의 우당탕탕 개발 공부

[프로그래머스][파이썬/Python] 소수 찾기 - level 2
PS/프로그래머스

[프로그래머스][파이썬/Python] 소수 찾기 - level 2

2020. 3. 15. 12:30
반응형

* 프로그래머스에는 '소수 찾기'라는 문제가 level 1과 level 2에 모두 존재한다. 구분하고자 level 2를 제목에 명시했다.

 

문제 설명

한자리 숫자가 적힌 종이 조각이 흩어져있습니다. 흩어진 종이 조각을 붙여 소수를 몇 개 만들 수 있는지 알아내려 합니다.

각 종이 조각에 적힌 숫자가 적힌 문자열 numbers가 주어졌을 때, 종이 조각으로 만들 수 있는 소수가 몇 개인지 return 하도록 solution 함수를 완성해주세요.

 

제한 조건

  • numbers는 길이 1 이상 7 이하인 문자열입니다.
  • numbers는 0~9까지 숫자만으로 이루어져 있습니다.
  • 013은 0, 1, 3 숫자가 적힌 종이 조각이 흩어져있다는 의미입니다.

 

입출력 예

 

제출 코드

from itertools import permutations
def solution(numbers):
    answer = 0

    # 가능한 수의 조합 만들기
    lst = ','.join(numbers).split(',')
    possible = []

    for i in range(len(numbers)):
        possible.extend(list(permutations(lst, i+1)))

    possible = [''.join(i) for i in possible]
    possible = sorted(list(set(map(int, possible))))

    idx = -1
    for i in range(len(possible)):
        if possible[i] <= 1: idx = i
        else: break
            
    if idx == -1: pass
    else: possible = possible[idx+1:]

    # 소수 찾아내기
    for num in possible:
        for i in range(2, round(num ** 0.5) + 1):
            if num % i == 0:
                break
        else:
            answer += 1

    return answer

(1) line 6

입력값이 문자열로 주어지는데, 순열을 만들기 좋은 형태로 리스트를 선언.

※ 제출 후 깨달았는데 이것은 의미 없는 짓. iterable한 문자열이나 리스트나 모두 순열 만들기 가능. 심지어 이것과 관련하여 포스팅을 썼었는데도 또 까먹고 앉아있다. 한심해. 이걸 굳이 안 쓰고 10번 라인에 permutations의 인자값을 lst 대신 numbers로 썼다면 아주 조금의 시간이라도 아낄 수 있을 것이다.

 

(2) line 7

추후 순열을 만들고, 그 순열 중에서 소수인지 판별할 만한 숫자들을 담을 리스트 선언.

 

(3) line 9, 10

문자열 'numbers'의 각 숫자들을 1, 2, 3, ..., len(numbers) 개 이용하여 순열을 순차적으로 만들고 그것들을 리스트 'possible'에 붙인다.

 

(4) line 12

튜플의 형태로 존재하는 각 순열들을 문자열 형태로 변환

 

(5) line 13

   1) 각 순열들을 int형으로 변환 : 앞이 0으로 시작했던 문자열들은 자연스럽게 0이 사라짐

   2) 변환된 값들을 set 형태로 저장 : 중복값을 제거하기 위함

   3) set을 오름차순으로 정렬된 리스트 형태로 변환 : set은 정렬하는 기능이 없기 때문에 리스트 형태로 변환

 

(6) line 15 ~ 21

소수인지 판별할 만한 숫자들이 오름차순으로 정렬되어 있는 리스트 'possible'에서 0, 1이 존재하다면 제거

 

(7) line 24 ~ line 29

소수인지 판별하는 반복문. 핵심은 효율성을 증진시키기 위해 for문의 반복 범위를 round(num ** 0.5) + 1까지 설정해줘야 한다는 것이다. 소수 특성상 소수의 루트값까지만 나눠보고 나눠지는 숫자가 없다면 그 수는 소수이다. 반복 범위를 소수의 루트값 정도까지만 설정해주면 효율성이 매우 좋아진다.

다만, 여기서 궁금한 점이 생겼다. 너무 궁금해서 프로그래머스 질문란에도 올렸다. 25번 줄에서 반복 범위를 round(num ** 0.5) + 2까지로 설정할 경우 많은 테스트 케이스를 실패하는 것이 확인됐는데, 도무지 이해가 가지 않는다. 내 생각으로는 for문이 딱 한 번 더 돌게 되는 거라 효율성이 떨어졌으면 떨어졌지, 갑자기 테스트 케이스를 실패하는 일은 없어야 한다고 생각한다. 대체 왜 그런 것일까..?

 

 

 

Source : https://programmers.co.kr/learn/courses/30/lessons/42839#

 

반응형
저작자표시 (새창열림)

'PS > 프로그래머스' 카테고리의 다른 글

[프로그래머스][파이썬/Python] (2019 카카오 코딩테스트) 오픈채팅방  (0) 2020.03.09
[프로그래머스][파이썬/Python] 프린터  (0) 2020.03.08
[프로그래머스][파이썬/Python] 시저 암호  (0) 2020.03.07
[프로그래머스][파이썬/Python] (2018 서머코딩/윈터코딩) 스킬트리  (0) 2020.03.06
[프로그래머스][파이썬/Python] 쇠막대기  (0) 2020.03.05
    'PS/프로그래머스' 카테고리의 다른 글
    • [프로그래머스][파이썬/Python] (2019 카카오 코딩테스트) 오픈채팅방
    • [프로그래머스][파이썬/Python] 프린터
    • [프로그래머스][파이썬/Python] 시저 암호
    • [프로그래머스][파이썬/Python] (2018 서머코딩/윈터코딩) 스킬트리
    몽-구
    몽-구
    소망보단 목표를, 생각보단 실천을

    티스토리툴바