ASAC 빅데이터 분석가 7기/ASAC 일일 기록

ASAC 빅데이터 분석가 과정 9일차 - 2 (24.12.16)

junslee 2024. 12. 16. 12:21

03_basic_exercise

08_소수구하기문제

# 클래스를 사용하는 가장 대표적인 유형 : 소수들을 출력하는 문제!!!
예) 1부터 100까지 소수들을 출력하세요1!!
예) 약수, 배수, 공약수, 공배수 등......

 

기본적인 문제들은(정수 관련된 문제들)
-1) 정의대로 코드를 구현을 할 것인가 : 반복/ 제어/ 연산 etc
-2) 이론적으로 가지는 속도/ 효율성에 대한 문제점!!!!
     ==> 수학 이론에서는 여러가지 알고리즘/ 방법론...
            알고리즘 대회 : 여러 방법들을 자세히 잘 알아야 됨(지식!!)
            취업 코테     : 여러 방법론들은 지양하고, 지식적인 줄이고 있음!!!
                                : ==> 살짝 간단한 아이디어 정도로 해결하는 수준...

# 참고 : 2022년 카카오 2번 문제
  - https://school.programmers.co.kr/learn/courses/30/lessons/92335
    20개 test 1~2개 경우를 시간 초과!!!!!
    ===> 효율성을 하세요!!!!!( 간단한 아이디어!)

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr


# 1~100까지 소수들을 출력하세요!!

 

정의 :소수의 정의 ==> 1하고, 자기 자신만 나눠 떨어지는 경우1!!!
         n까지 소수들을 찾아주세요!!!!!
          --> 2~~(n-1)까지 다 나눠보면서,,,   for
                       n-1까지 나눠 떨어지지 않으면  if   % , ==/ !=
                                    소수
                       혹,중간에 나눠 떨어지면     if
                                     합성수...

===> n = 6 : n % 2 ==0 ---> 합성수
         n = 7 : 7%2(X), 7%3(X), 7%4(X), 7%5(X), 7%6(X)
             ==> 7은 소수구나!!!!!!

기본문제 : 전체적인 2중 for문의 구조를 정확히 이해하는지 기본!!!!
                 + if문 + 컨트롤(continue, break, pass etc)
          ==> 전체적인 골격을 정확히 이해하는지 체크에 용이한 문제!!


n =100
# 할 일 : 1부터 n까지 소수들을 다 출력하세요!!!!!!+++인덱스 처리!!!!
for i in range(2, n+1): # 2~n까지가 테스트 할 숫자들을 롤링!!!!
    # 1개 숫자가 선택이 된다면  예) i= 8, i = 7
    # i라는 숫자를 바탕으로 할 일 : 2부터~~~나눠서 i까지 살아오면,,출력
    for j in range(2,i+1):
        if i % j ==0:
            break
    if j ==i:
        print(i)
2
3
5
7
11
13
17
19
23
29
31
37
41
43
47
53
59
61
67
71
73
79
83
89
97

---> 2중 for문에 대해서 기본적인 처리!!!!!
---> 골격에 대해서 구체적인 인덱스 처리!!본인 로직에 맞춰서 미묘하게 잘 해야함!!
     : 정확하게 안 하면,,대충 소수는 나온데, 정확하게 안 나옴!!!!
---> 가장 기본 유형 중 하나임!!!!

 

간단하지만, 기본적인 유형들에 대한 문제들을 잘 파악을 하셔야 함!!
==> 기본 문제를 내가 응용하면,어떻게 출제하지!!!!!
++++ 이런 숫자 관련된 (배수, 약수, 소수 등) : 효율성/ 기본 골격 좀 더 관심 !!


점심 식사 하시고

있다가 이어서

식사후에 k진수 문제 풀어보세요

==> 2시에 이어서


04_cotest

19_2022_k진수

# ref : https://school.programmers.co.kr/learn/courses/30/lessons/92335
==> 기본 유형/ 기본 문제들이 어떻게 응용이 되어서 나오는지!!!1
==> ++ 전통적인 기본 유형을 어떻게 코테화 시키는지!!!!
참고) 정답률 5X % --> 엇;;;;;( 지식적인X, 아이디어!!! )

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

==> n자연수 ---> k진법으로 변환 --> 조건에 맞는 경우의 소수 카운팅!!!
      엇;;; 우리가 아는 일반적인 P의 기준과 약간 뭔가 이상하네;;;
           101은 사람입장에서 소수로 판단을 하는데,,
           여기선느 인정을 안 한다는 입장!!!!



# 문제를 체크
1) n(입력 10진수) ---> k진법( 3~10진법으로 제한) --> 변환!!!
    ==> 규칙 : n을 k로 몫이 0이 될 때 까지....나머지들을 모아서 & 역순
2) 0을 중심으로 쪼갠다!!! *****
3) 쪼갠 부분들을 돌려가면서 ,for
---> 10진수 기준으로 소수인지 체크!!!!!
        if 소수라면 : 카운팅!!!!


# Step 1) 입력 n을 k진법으로 변환하는 함수!!!!
 입력 : 숫자n, 진법k
 출력 : k진법으로 변환된 n의 결과 ---> 개취: 문자열(역순처리, 쪼갠다)

 ---> k진법 변환하는 규칙 : n을 k로 계속 계속 나누면 됨!!! : while
                          : 이유) 조건 중심으로 표현/규칙!!!
                              ==> 중간에 탈출 경호 break : 몫이 0이하인
                          : 나누면서 할 일 : 몫 & 나머지
                                     몫 : while --> go / stop
                                     나머지 : 기록--> 나중에 역순으로(문자열)

 

a = [1,2,3,4]
a.reverse()
a
[4,3,2,1]
a = [1,2,3,4]
a[::-1]
[4,3,2,1]
"1234".reverse()
AttributeError
a = list("1234")
a.reverse()
a
['4', '3', '2', '1']
"1234"[::-1]
'4321'

def convert_k_system(n,k):
    # 나머지들을 문자열로 하나씩 기록을 하자!!
    k_sys = "" # 본인 기준별로 리스트로 하셔도 상관없습니다.
    while n>0: # 몫이 0이상일 때 까지..
        k_sys += str( n % k) # 리스트면 append() ==> 나머지 모아두기
        n = n // k   # 나눈 수를 계속 몫으로 갱신!!!!
    # ----> k_sys = "나눈 순서대로 나머지들이 정리"
    # ==: k진법으로 변환 : 역순!!
    k_sys = k_sys[::-1]
    return k_sys

# test
n = 437674
k =3
convert_k_system(n,k)
'211020101011'
# test
n = 110011
k = 10
convert_k_system(n,k)
'110011'

# step2) 0을 중심으로 쪼개기!!!! ==> 참고: 리스트인 경우 필터링!!!
                                                        ( 0,1을 제외한 값들만 추려주세요!!!)

temp = convert_k_system(n,k).split("0")
temp
['11', '', '11']
# 걸러내려는 부분에 대해서 여러 방식이 존재를 함!!!
for i in temp:
    if i != "":
        print(i)
        # 소수인지 판별할 덩어리 선택!!!
        # ==> 소수인지 판별을 하고, 소수이면 카운팅!!!!!
    else:
        pass
11
11

# Step3) 소수 판별 함수!!!!
입력 : 숫자
출력 : 소수판별Y/N --> True(소수), False(소수X)
point) 정의대로 구현을 해보고,,이상하면 수정할까!!!!!
point) 1에 대한 필터링을 여기서 그냥 할께요!!!!!

 

def check_prime(m):
    c = 2 # --> 2부터 계속 나눠보자!!!!
    if m == 1:
        return False
    else:
        while c < m: # 2~m-1까지 계속 나누기!!!!!
            if m % c ==0:
                return False
            else:
                c += 1
    return True # ---> 2부터 입력 m-1까지 중간에 나눠 떨어지지 않고 생존!!
    # ==> 소수!!!

check_prime(211)
True
check_prime(2)
True
check_prime(10)
False
check_prime(101) # --> 앞에 step2에서 "101"--> "1","","1" 예외처리가 된다!!!

# 조립!!

def solution(n, k):
    answer = 0 # <-- 기본 양식은 -1인데, 하나도 없는 경우 카운팅 : 0 초기화
    # 1) 입력 n --> k진법으로 변환 함수 : 문자열
    n_to_k = ~~~~!
    # 2) n_to_k를 문자열 0을 기준으로 분리 : 리스트

    # 3) n_to_k의 원소 덩어리들을 돌려가면서 : 소수인지 판별!!!!!
    #    +++ 소수라면 : +1로 카운팅!!!!
    for ~~~
        if 덩어리가 빈 문자열이 아니면~~~
            if 그 숫자 덩어리가 소수면
                answer += 1 # 카운팅!!!!
    return answer

# 실질적인 조립!!

def convert_k_system(n,k):
    k_sys = ""
    while n>0:
        k_sys += str( n % k)
        n = n // k
    k_sys = k_sys[::-1]
    return k_sys

def check_prime(m):
    c = 2 # --> 2부터 계속 나눠보자!!!!
    if m == 1:
        return False
    else:
        while c < m: # 2~m-1까지 계속 나누기!!!!!
            if m % c ==0:
                return False
            else:
                c += 1
    return True


def solution(n, k):
    answer = 0 # <-- 기본 양식은 -1인데, 하나도 없는 경우 카운팅 : 0 초기화
    # 1) 입력 n --> k진법으로 변환 함수 : 문자열
    n_to_k = convert_k_system(n,k) # "211020101011" ,
    # 2) n_to_k를 문자열 0을 기준으로 분리 : 리스트
    # 3) n_to_k의 원소 덩어리들을 돌려가면서 : 소수인지 판별!!!!!
    #    +++ 소수라면 : +1로 카운팅!!!!
    for num in n_to_k.split("0"): # [ "211", "","2","","1","","1","","11"]
        if num =="": # 구조적으로 설명을 하기 위해서...
            continue
        else: # 빈 문자 덩어리가 아닌 경우..--> 소수 체크!!!!
            if check_prime( int(num)) == True:
                answer += 1 # 카운팅!!!!
    return answer

--> 아....2번 치고,,,,,너무 쉬운데;;;;코드도/문법도 쉽네;;
                                아주 복잡하거나 여러 경우가 그렇게 안 보이네;;;
===> 쌔.;;;

 

# test

n = 437674
k =3
solution(n,k)
3

 

# test

n = 110011
k =10
solution(n,k)
2

실제 업로드를 해서 채점을 하면,,,
===> 1개 빼고는 다 맞추는 코드가 됨!!!
         기본 코드는 큰 문제는 없는 코드입니다1!!1
===> 어떻게 좀 더 효율화를 가져갈 것인가!!!!!!!!
         나의 코드를 리뷰!!!! + n 의 값이 커질 수 있는 부분에 종속되는 무엇인가를 찾아!!!

++++ 종종 나오는 아이디어 중 하나가 : " 대칭성"
==> 카카오 or 다른 쪽에서도 대칭성을 활용하는 부분의 문제가 종종~~
==> 이런 간단한 적용 아이디어를 내 코드에 접목을 시도할 수 있음!!!

완전히 효율적으로 하는 수학에서 알고리즘 : 아리스토텔레스의 채!!!!
==> 지식적인 부분의 문제........
        +++ 이런거 몰라도 간단하게 대칭성이나 아이디어 통해서 효율성!!!!
       ( +++ 탐색에서도 백트레킹 문제들이 종종 나오게 됨!!! )


def check_prime(m):
    c = 2 # --> 2부터 계속 나눠보자!!!!
    if m == 1:
        return False
    elif m==2:
        return True
    else:
        c = 2
        end = int(m**0.5) + 1
        while c <= end: # 2~m-1까지 계속 나누기!!!!!
            if m % c ==0:
                return False
            else:
                c += 1
    return True

55퍼센트 정답률 : 여러 다양한 문제들을 풀어봤어야 생각을 할 수 있는 문제!!!
==> 어렵거나, 코드가 어려운 부분은 아니여도
       정답률이 낮게 나타는 경우가 있음!!!
==> 지식적인 부분보다는 간단 아이디어로 효율화!!!: 대칭화, 조건이 만족하면 컷!!!!
      : 공회전을 최대한 미리 방지하자!!!!!!

 

## 정수의 범위가 벗어날 수 있음!!!!!
   : 파이썬으로 사용해서,,운이 좋게도,,파이썬의 정수 범위가 커요;;;
==> 운이 좋게도 이 부분은 피할 수 있었음!!!!

import sys
a = sys.maxsize
a
9223372036854775807

# 참고) 전통적인 알고리즘 대회들은 이 주제도 상당히 자주 신경써야 하는
            포인트 중 하나입니다!!! 유효 자리수 문제!!!!!
            채용 코테에서는 굳이;;;;;;;;

 

전통적인 주제들을 바탕으로 응용을 하는 코테 문제!!!
==> 공약수에 대한 부분 : 2개/이상에 대한 수들을 약수들을 다 찾아서
                                        공통된 값들을 찾아서,,,,최대값,,,,,
                                         : 약수를 정의대로 찾으면 1부터 n까지 다 나눠봐야 함!!!
                                         : --> 나눠 떨어지는 친구들을 리스트업!!

===> 여러 숫자들에 대한 공약수 : 유클리안 호제법!!! 알고리즘.....

+++ 기본적인 약수/배수/공약수/공배수 관련된 전통 주제들에 대해서도 고민!!!


파이썬 쪽지 시험