ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 알고리즘, git
    내일배움캠프/TIL 2022. 11. 23. 01:11

    알고리즘 공부
    오랜만에 머리가 뽀개집니다.

    파이썬에 for문이 익숙치 않습니다.
    for(;;)가 너무 그립읍니다.

    코드를 적어보고 답안코드를 보니 제 코드와는 모양새가 조금 다릅니다.

    그러나 조금 뿌듯한 점은 열심히 노력해서 결과물을 만들어 낸 것입니다.
    거기다 마지막 문제는... 문제를 잘 못 읽어서 코드가 좀 추가 됐습니다.

    1주차 숙제 문제에 1주차의 알고리즘이 녹아있으니 숙제문제의 비교로만 기록을 합니다.

    #제 코드 입니다.
    #숙제 1
    input = 100
    
    
    def find_prime_list_under_number(number):
        if number <= 1:
            return '숫자를 다시 입력해주세요.'
        prime_list = []*(number - 2)
        prime_num_list = [7, 5, 3, 2]
        i = 2
    
        # 기본값 채우기
        while i <= number:
            prime_list.append(i)
            i += 1
    
        prime = prime_num_list.pop()
        while prime <= number:
            i = 2
            while (prime*i) <= number:
                try:
                    prime_list.remove(prime*i)
                    i += 1
                except:
                    i += 1
                    continue
    
            try:
                prime = prime_num_list.pop()
            except:
                break
        return prime_list
    
    
    result = find_prime_list_under_number(input)
    print(result)
    
    
    
    #숙제 2
    
    input = "0111001011010101110"
    
    # 0,1의 빈도수 체크.
    # 빈도수가 낮은 수를 선택하여 뒤집는다.
    # 문제발견 빈도수 만으로 최소횟수 비교 불가.
    # ex) 011110은 { 0:2, 1:4 }로 0이 빈도수가 적지만 1만 한번 뒤집으면 끝난다.
    # 해결방안 연결된 숫자는 빈도수 1로 본다.
    # ex) 011110 : { 0:2, 1:1 } 1이 빈도수가 낮기 때문에 1을 1번 뒤집으면 끝난다.
    # ex2) 10101101 : { 0:3, 1:4 } 0의 빈도수가 낮기 때문에 0을 3번 뒤집으면 끝난다.
    # ex3) 00111001111 : { 0:3, 1:2 }
    
    
    def find_count_to_turn_out_to_all_zero_or_all_one(string):
        string_arr = []
        for char in string:
            string_arr.append(char)
    
        num_check = {}
        for i, num in enumerate(string_arr):
            if i+1 == len(string_arr):
                num_check[str(num)] += 1
            else:
                if string_arr[i] != string_arr[i+1]:
                    if str(num) in num_check:
                        num_check[str(num)] += 1
                    else:
                        num_check[str(num)] = 1
    
        # 답에 필요한 내용 - 최소횟수 리턴
        if num_check['0'] > num_check['1']:
            target_num = num_check['1']
        else:
            target_num = num_check['0']
    
        return target_num
        
        
    
    	#추가코드 - 실질적으로 뒤집어진 문자열을 리턴
        if num_check['0'] > num_check['1']:
            target_num = '0'
        else:
            target_num = '1'
    
        for i, num in enumerate(string_arr):
            if num != target_num:
                while string_arr[i] != target_num:
                    string_arr[i] = target_num
                    i += 1
    
        return ''.join(string_arr)
    
    
    result = find_count_to_turn_out_to_all_zero_or_all_one(input)
    print(result)
    #답지 코드 입니다.
    #숙제 1
    input = 20
    
    
    def find_prime_list_under_number(number):
        prime_list = []
    
        for n in range(2, number + 1):
            for i in prime_list:
                if n % i == 0 and i * i <= n:
                    break
            else:
                prime_list.append(n)
    
        return prime_list
    
    
    result = find_prime_list_under_number(input)
    print(result)
    
    #숙제 2
    input = "011110"
    
    
    def find_count_to_turn_out_to_all_zero_or_all_one(string):
        count_to_all_zero = 0
        count_to_all_one = 0
    
        if string[0] == '0':
            count_to_all_one += 1
        elif string[0] == '1':
            count_to_all_zero += 1
    
        for i in range(len(string) - 1):
            if string[i] != string[i + 1]:
                if string[i + 1] == '0':
                    count_to_all_one += 1
                if string[i + 1] == '1':
                    count_to_all_zero += 1
    
        return min(count_to_all_one, count_to_all_zero)
    
    
    result = find_count_to_turn_out_to_all_zero_or_all_one(input)
    print(result)

     

    추가 문제

    # 문제의 번호별 조건에 대한 입력 예시와 출력
    Ex 1)
    abc 	# a1/b1/c1
    
    Ex 2-1)
    aaabbbc	# a3/b3/c1
    
    Ex 2-2)
    abbbc	# a1/b3/c1
    
    Ex 3-1)
    ahhhhz	# a1/h4/z1
    
    Ex 3-2)
    acccdeee	# a1/c3/d1/e3

    각각의 문자와 개수를 구하는건 어렵지 않았으나 출력사이에 '/'를 넣어보려니 쉽지 않았습니다.
    간단하게 데이터를 뽑아내서 뒤에 '/'를 추가해줘봤는데 ex) abc => a1/b1/c1/ 
    이렇게 맨마지막까지 '/'가 출력됐습니다.
    알고리즘의 끝은 역시나 이렇게 간단한걸 그렇게 고민했다니 였습니다...
    그래도 해결했으니 오케이입니다.
    튜터님은 영어를 굉장히 잘 쓰셔서 길게 적었습니다.
    저는 영어도 못할뿐더러 생각나는 단어도 없고..
    그래서 알고리즘보다 더 머리아픈 함수명 짓기를 했습니다.
    알고리즘보다 더 구글검색을 많이 한듯합니다.

    input = 'acccdeee'
    
    
    def alpha_overlap_count(string):
        overlap_dic = {}
        for char in string:
            if char in overlap_dic:
                overlap_dic[char] += 1
            else:
                overlap_dic[char] = 1
    
        result = []
        for element in overlap_dic:
            overlap = element+str(overlap_dic[element])
            result.append(overlap)
    
        return '/'.join(result)
    
    
    result = alpha_overlap_count(input)
    print(result)

     

    Git의 기초 - 수정하고 저장소에 저장하기

     

     

    Git - 수정하고 저장소에 저장하기

    .gitignore`를 사용하는 간단한 방식은 하나의 `.gitignore 파일을 최상위 디렉토리에 하나 두고 모든 하위 디렉토리에까지 적용시키는 방식이다. 물론 .gitignore 파일을 하나만 두는 것이 아니라 하위

    git-scm.com

     

    '내일배움캠프 > TIL' 카테고리의 다른 글

    알고리즘  (0) 2022.11.25
    알고리즘  (0) 2022.11.24
    파이썬 문법 기초, 자바스크립트 문법 기초, 알고리즘  (0) 2022.11.22
    Git의 세가지 상태  (0) 2022.11.20
    CS특강 2  (0) 2022.11.20
Designed by Tistory.