나는 이렇게 학습한다 575

서울에서 김서방 찾기

문제 설명 String형 배열 seoul의 element중 "Kim"의 위치 x를 찾아, "김서방은 x에 있다"는 String을 반환하는 함수, solution을 완성하세요. seoul에 "Kim"은 오직 한 번만 나타나며 잘못된 값이 입력되는 경우는 없습니다. 제한 사항 seoul은 길이 1 이상, 1000 이하인 배열입니다. seoul의 원소는 길이 1 이상, 20 이하인 문자열입니다. "Kim"은 반드시 seoul 안에 포함되어 있습니다. 해결 방법 1. seoul 리스트 안에 "Kim" 문자열의 인덱스를 찾는다. 2. 지정된 문장안에 인덱스를 포함시켜 반환한다. def solution(seoul): i = seoul.index("Kim") answer = f"김서방은 {i}에 있다" return ..

수박수박수박수박수박수?

문제 설명 길이가 n이고, "수박수박수박수...."와 같은 패턴을 유지하는 문자열을 리턴하는 함수, solution을 완성하세요. 예를들어 n이 4이면 "수박수박"을 리턴하고 3이라면 "수박수"를 리턴하면 됩니다. 제한 사항 n은 길이 10,000이하인 자연수입니다. 해결 방법 1. n을 2로 나누고 '수박'을 곱한다. 2. n이 2로 나누어 떨어지는지 불린 값으로 확인한다. 3. 딕셔너리를 활용해 불린 키에 해당하는 값을 찾는다. 4. True일 경우 2로 나누어 떨어지므로 '수박'을 곱한 문자열을 그대로 반환한다. 5. False일 경우 나머지가 1이 남은므로 '수박'을 곱한 문자열에 '수'을 덧붙여 반환한다. def solution(n): text = n // 2 * '수박' bool_dict = ..

시저 암호

문제 설명 어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식을 시저 암호라고 합니다. 예를 들어 "AB"는 1만큼 밀면 "BC"가 되고, 3만큼 밀면 "DE"가 됩니다. "z"는 1만큼 밀면 "a"가 됩니다. 문자열 s와 거리 n을 입력받아 s를 n만큼 민 암호문을 만드는 함수, solution을 완성해 보세요. 제한 사항 공백은 아무리 밀어도 공백입니다. s는 알파벳 소문자, 대문자, 공백으로만 이루어져 있습니다. s의 길이는 8000이하입니다. n은 1 이상, 25이하인 자연수입니다. 해결 방법 1. s문자열을 반복하여 나눈다. 2. 문자중에 대문자와 소문자가 있는 확인 후 분기한다. 3. 알파벳 인덱스를 확인하고 거기에 n을 더하고 알파벨 전체 길이를 뺀다. 4. ..

약수의 합

문제 설명 정수 n을 입력받아 n의 약수를 모두 더한 값을 리턴하는 함수, solution을 완성해주세요. (12의 약수는 1, 2, 3, 4, 6, 12입니다. 이를 모두 더하면 28입니다.) 제한 사항 n은 0 이상 3000이하인 정수입니다. 해결 방법 1. n의 절반에 해당되는 수 만큼 반복을 돌린다. 2. n과 나누어 떨어지는 수들을 합한다. 3. 마지막으로 n을 합한다. (n의 절반을 나눠 반복하였으므로 약수 중에 하나인 n을 추가로 더해주어야 함) def solution(n): answer = sum([i for i in range(1, n // 2 + 1) if n % i == 0]) + n return answer 출처: 프로그래머스 코딩 테스트 연습, https://programmers...

이상한 문자 만들기

문제 설명 문자열 s는 한 개 이상의 단어로 구성되어 있습니다. 각 단어는 하나 이상의 공백문자로 구분되어 있습니다. 각 단어의 짝수번째 알파벳은 대문자로, 홀수번째 알파벳은 소문자로 바꾼 문자열을 리턴하는 함수, solution을 완성하세요. 제한 사항 문자열 전체의 짝/홀수 인덱스가 아니라, 단어(공백을 기준)별로 짝/홀수 인덱스를 판단해야합니다. 첫 번째 글자는 0번째 인덱스로 보아 짝수번째 알파벳으로 처리해야 합니다. 해결 방법 1. 문자열을 단어로 쪼갠다. 2. 단어를 반복하며 홀수는 대문자, 짝수는 소문자로 바꾼다. 3. 단어를 공백과 함께 다시 합친다. def solution(s): answer = '' words = s.split(' ') for word in words: for i, s ..

선형배열

배열이란? 배열이란 연관된 데이터를 하나의 변수에 그룹핑해서 관리하기 위한 방법 리스트 길이과 관계 없이 빠르게 실행 결과를 보게되는 연산들 요소 마지막에 추가 .append('삽입할 요소') 요소 마지막 혹은 지정된 인덱스에서 꺼내기 .pop('꺼낼 인덱스') 리스트의 길이에 비례해서 실행 시간이 걸리는 연산들 요소 삽입하기 '리스트명'.insert('인덱스', '삽입할 요소') 요소 삭제하기 del('리스트명['인덱스']') 리스트의 길이에 실행 시간이 비례. 오래걸리는 이유는? 리스트의 중간이 수정되어 전체 인덱스가 변경되기 때문. 추가 다른 연산 요소 탐색하기: '리스트명'.index('찾을 요소') 실습1. 리스트 L 에 정수 x를 숫자 크기에 알맞게 넣는 코드 def solution(L, x)..

정렬(sort)과 탐색(search)

정렬(sort) 복수의 요소로 주어진 데이터를 정해진 기준에 따라 새로 늘어놓는 작업 파이썬 내장 함수 sorted('리스트명') sorted('리스트명', reverse=True) 리스트에 쓸 수 있는 메서드 '리스트명'.sort() '리스트명'.sort(reverse=True) 특이점 sorted 함수는 원본에 영향을 미치지 않지만 sort 매서드는 원본에 수정을 가한다. 함수와 메소드의 차이점 함수는 독립적으로 정의되므로 이름으로만 호출이 가능하지만 메서드는 정의된 클래스에 종속되므로 ‘.’에 의해 호출해야한다. 함수가 메소드보다 더 포괄적인 의미를 가진다. 람다로 키를 지정하는 예 람다는 요소 x에 대해 : 우측에 지정된 기준으로 정렬한다 L = [ {'name': 'John', 'score': ..

자릿수 더하기

문제 설명 자연수 N이 주어지면, N의 각 자릿수의 합을 구해서 return 하는 solution 함수를 만들어 주세요. 예를들어 N = 123이면 1 + 2 + 3 = 6을 return 하면 됩니다. 제한 사항 N의 범위 : 100,000,000 이하의 자연수 해결 방법 1. n을 이터러블한 문자열로 바꾼다. 2. 반복문을 통해 문자열을 리스트로 바꾼다. 3. 리스트의 요소들을 정수로 바꾼다. 4. 리스트의 요소들을 더해 합을 구한다. def solution(n): answer = sum([int(i) for i in str(n)]) return answer

파이썬 멀티 프로세싱, GIL

GIL(global interpreter lock) 한 순간에 1개의 스레드만 유지하는 락 GIL은 본질적으로 한 스레드가 다른 스레드를 차단해서 제어를 얻는 것을 막음 멀티스레딩의 위험으로부터 보호(하나의 메모리를 공유하므로 오류로 인해 전체가 다운될 수 있음) 그러므로 파이썬은 스레드로 병렬성 연산을 수행하지 못함 파이썬 멀티 스레딩은 동시성을 사용하여 io bound 코드(네트워크)에서 유용하게 사용할 수 있음 하지만 동시성은 cpu bound 코드(연산만 있는)에서 이점이 없음 해결책 멀티 프로세싱으로 병렬성을 구현하여 효율을 높일 수 있음. 단, 프로세스끼리 메모리를 공유하지 않기 때문에 직렬화 역직렬화에 소요되는 비용이 큼 비교 실험 멀티스레딩 22초 멀티프로세싱 13초 (하단 비교 코드 첨부..

자연수 뒤집어 배열로 만들기

문제 설명 자연수 n을 뒤집어 각 자리 숫자를 원소로 가지는 배열 형태로 리턴해주세요. 예를들어 n이 12345이면 [5,4,3,2,1]을 리턴합니다. 제한 조건 n은 10,000,000,000이하인 자연수입니다. 해결 방법 1. n을 이터러블한 문자열로 바꾼다. 2. 문자열의 순서를 뒤집는다. 3. 뒤집은 문자열을 모두 숫자로 바꾼다. 4. 바꾼 숫자를 리스트로 감싼다. # 컴프리핸션을 활용한 방법 def solution(n): answer = [int(i) for i in reversed(str(n))] return answer # map함수를 활용한 방법 def solution(n): answer = list(map(int, reversed(str(n)))) return answer map함수는 이..