-
알고리즘, 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