Python study 51

[Programmers] 둘만의 암호

문제 설명 두 문자열 s와 skip, 그리고 자연수 index가 주어질 때, 다음 규칙에 따라 문자열을 만들려 합니다. 암호의 규칙은 다음과 같습니다. 문자열 s의 각 알파벳을 index만큼 뒤의 알파벳으로 바꿔줍니다. index만큼의 뒤의 알파벳이 z를 넘어갈 경우 다시 a로 돌아갑니다. skip에 있는 알파벳은 제외하고 건너뜁니다. 예를 들어 s = "aukks", skip = "wbqd", index = 5일 때, a에서 5만큼 뒤에 있는 알파벳은 f지만 [b, c, d, e, f]에서 'b'와 'd'는 skip에 포함되므로 세지 않습니다. 따라서 'b', 'd'를 제외하고 'a'에서 5만큼 뒤에 있는 알파벳은 [c, e, f, g, h] 순서에 의해 'h'가 됩니다. 나머지 "ukks" 또한 위 ..

[Programmers] 바탕화면 정리

문제 설명 코딩테스트를 준비하는 머쓱이는 프로그래머스에서 문제를 풀고 나중에 다시 코드를 보면서 공부하려고 작성한 코드를 컴퓨터 바탕화면에 아무 위치에나 저장해 둡니다. 저장한 코드가 많아지면서 머쓱이는 본인의 컴퓨터 바탕화면이 너무 지저분하다고 생각했습니다. 프로그래머스에서 작성했던 코드는 그 문제에 가서 다시 볼 수 있기 때문에 저장해 둔 파일들을 전부 삭제하기로 했습니다. 컴퓨터 바탕화면은 각 칸이 정사각형인 격자판입니다. 이때 컴퓨터 바탕화면의 상태를 나타낸 문자열 배열 wallpaper가 주어집니다. 파일들은 바탕화면의 격자칸에 위치하고 바탕화면의 격자점들은 바탕화면의 가장 왼쪽 위를 (0, 0)으로 시작해 (세로 좌표, 가로 좌표)로 표현합니다. 빈칸은 ".", 파일이 있는 칸은 "#"의 값을..

[Python] Quick Sort (퀵 정렬)

Quick sort 알고리즘 설명 : 1. 배열에서 '피벗' 원소를 선택. 2. 피벗보다 작은 원소는 피벗의 왼쪽으로, 큰 원소는 오른쪽으로 이동. 3. 이렇게 하면 피벗은 최종 정렬된 위치에 오게 됨. 4. 피벗을 기준으로 두 개의 하위 배열이 생성함. 5. 이 하위 배열에 대해 같은 작업을 재귀적으로 반복함. 시간 복잡도 : 최선, 평균의 경우 : O(nlogn) 최악의 경우 : O(n2) # 퀵 정렬 (Quick Sort) # 피벗을 기준으로 배열을 두 부분으로 나눔. def partition(arr, low, high): pivot = arr[high] # 피벗 설정 (여기서는 배열의 마지막 원소를 피벗으로 사용) i = low - 1 # 작은 원소의 인덱스 # 배열을 피벗을 기준으로 두 부분으로..

[Programmers] 달리기 경주

문제 설명 얀에서는 매년 달리기 경주가 열립니다. 해설진들은 선수들이 자기 바로 앞의 선수를 추월할 때 추월한 선수의 이름을 부릅니다. 예를 들어 1등부터 3등까지 "mumu", "soe", "poe" 선수들이 순서대로 달리고 있을 때, 해설진이 "soe"선수를 불렀다면 2등인 "soe" 선수가 1등인 "mumu" 선수를 추월했다는 것입니다. 즉 "soe" 선수가 1등, "mumu" 선수가 2등으로 바뀝니다. 선수들의 이름이 1등부터 현재 등수 순서대로 담긴 문자열 배열 players와 해설진이 부른 이름을 담은 문자열 배열 callings가 매개변수로 주어질 때, 경주가 끝났을 때 선수들의 이름을 1등부터 등수 순서대로 배열에 담아 return 하는 solution 함수를 완성해주세요. 제한사항 5 ≤..

[Python] Merge Sort (병합 정렬)

Merge sort 알고리즘 설명 : 1. 배열을 두 부분으로 나눔. 2. 나눈 각 부분을 재귀적으로 병합 정렬함. 3. 정렬된 두 부분을 병합하여 하나의 정렬된 배열을 만듬. 시간 복잡도 : 최선, 평균, 최악의 경우 모두 : O(nlogn) # 병합 정렬 (Merge Sort) # 병합 함수: 두 개의 정렬된 리스트를 하나의 정렬된 리스트로 병합. def merge(left, right): result = [] i = j = 0 # 두 리스트의 원소를 비교하여 작은 원소를 결과 리스트에 추가. while i < len(left) and j < len(right): if left[i] < right[j]: result.append(left[i]) i += 1 else: result.append(righ..

[Python] Insertion Sort (삽입 정렬)

Insertion sort 알고리즘 설명 : 1. 배열을 두 부분, 정렬된 부분과 정렬되지 않은 부분으로 분리함. 2. 정렬되지 않은 부분의 첫 번째 원소를 적절한 위치에 삽입하여 정렬된 부분을 확장. 3. 이 과정을 정렬되지 않은 부분이 없을 때까지 반복. 시간 복잡도 : 최선의 경우 : O(n) 평균, 최악의 경우 : O(n^2) # 삽입 정렬 (Insertion Sort) def insertion_sort(arr): n = len(arr) # 외부 루프: "첫" 번째 원소부터 마지막 원소까지 반복. for i in range(1, n): # 현재 원소를 key 변수에 저장. key = arr[i] # 현재 원소의 앞부분에 있는 정렬된 배열에서 key가 들어갈 위치를 찾습니다. j = i - 1 wh..

[Python] Selection Sort (선택 정렬)

Selection sort 알고리즘 설명 : 1. 배열의 첫 번째 원소부터 마지막 원소까지 검사하여 최소값을 찾음. 2. 최소값을 배열의 첫 번째 원소와 교환. 3. 배열의 두 번째 원소부터 마지막 원소까지 다시 최소값을 찾고, 두 번째 원소와 교환. 4. 이 과정을 배열이 완전히 정렬될 때까지 반복. 시간 복잡도 : 최선, 평균, 최악의 경우 모두 : O(n^2) # 선택 정렬 (Selection Sort) def selection_sort(arr): n = len(arr) # 외부 루프: 현재 인덱스부터 마지막 인덱스까지 검사하여 최소값을 찾음. for i in range(n): min_idx = i # 최소값의 인덱스를 저장하는 변수 # 내부 루프: 현재 인덱스부터 마지막 인덱스까지 최소값을 찾음...

[Python] Bubble sort (버블 정렬)

Bubble sort 알고리즘 설명 : 1. 배열의 첫 번째 원소부터 마지막 원소까지 인접한 원소끼리 비교. 2. 인접한 두 원소의 순서가 잘못되어 있다면 교환. 3. 이 과정을 전체 배열에 대해 반복. 한 번의 완전한 반복이 끝나면 배열의 가장 큰 원소가 배열의 마지막으로 이동. 4. 가장 큰 원소가 마지막으로 이동했으므로, 이제 마지막 원소를 제외한 나머지 배열에 대해 같은 작업을 반복. 5. 이 과정을 배열이 완전히 정렬될 때까지 반복. 시간 복잡도 : 최선의 경우: O(n) (이미 정렬된 배열) 평균과 최악의 경우: O(n^2) # 버블 정렬 (Bubble Sort) def bubble_sort(arr): n = len(arr) # 외부 루프: 각 반복마다 배열의 마지막 원소가 정렬. for i ..

[Python] generator 와 itertools

1. Generator Generator는 파이썬의 이터러블(iterable) 객체 중 하나로, 일반적인 함수처럼 값을 반환(return)하는 대신 yield 키워드를 사용해 값을 하나씩 내보내도록 함. 제너레이터는 모든 데이터를 메모리에 저장하지 않기 때문에 더 효율적이며, 따라서 대용량 데이터 처리에 유용함. 제너레이터는 데이터를 지연 평가(lazy evaluation)하므로, 필요한 순간에만 데이터를 생성하기 떄문에, 연산 속도를 향상시킬 수 있다는 장점이 있으며, 마지막으로 내장 함수와 함께 사용하면 코드를 간결하게 작성할 수 있음. 1. 제곱수를 생성하는 generator def square_numbers(nums): for i in nums: yield i * i my_nums = square..

[Programmers] 기능개발

문제 설명 프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다. 또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는 기능보다 먼저 개발될 수 있고, 이때 뒤에 있는 기능은 앞에 있는 기능이 배포될 때 함께 배포됩니다. 먼저 배포되어야 하는 순서대로 작업의 진도가 적힌 정수 배열 progresses와 각 작업의 개발 속도가 적힌 정수 배열 speeds가 주어질 때 각 배포마다 몇 개의 기능이 배포되는지를 return 하도록 solution 함수를 완성하세요. 제한사항 작업의 개수(progresses, speeds배열의 길이)는 100개 이하입니다. 작업 진도는 100 미만의 자연수입니다. 작업 속도는 100 이하의 자연..