알고리즘 64

백준 11866 요세푸스 문제풀이

📌문제설명 📌문제접근방식 문제를 보자마자 들었던 생각은 원형 큐 자료구조를 이용해야겠다였다. 이유는 원을 계속해서 돌면서 k번째 사람들 제외해나가기 때문이었다. 하지만 원형큐로 구현할 경우 인덱스를 계속해서 바꿔주어야했다. 따라서 큐를 순회하며 방문한 값을 맨 뒤로 이동시켜주도록 구현했다. 📌문제풀이 소스코드 import sys from collections import deque n, target = map(int, sys.stdin.readline().rstrip().split()) data = deque() for i in range(1, n+1): data.append(i) def solution(target, data): result = [] i = 1 while data: if i==targe..

알고리즘 2021.03.23

백준 10816 카드넘버2 문제풀이

📌문제설명 📌문제접근방식 1차시도 3단계에 걸쳐 문제를 해결하려고 했다. 하지만 결과적으로 문제를 복잡하게 만들었다. 1. 입력받은 값을 정렬한다. 2. (입력받은 값, 개수)를 저장한 리스트를 생성한다. 3. 2번의 리스트에서 입력받은 값을 기준으로 이진탐색을 수행하고, 개수를 반환한다. 첫 시도는 이진 탐색을 사용했다. 이유는 숫자 카드 개수가 50만이었고, 숫자 카드의 범위가 -천만~+천만이었기 때문이다. 따라서 최악의 경우 50만 x 7log10을 계산하면 된다고 생각했다. 하지만 시간초과가 발생했다. 따라서 해쉬로 구현해야겠다는 생각이 들었다. 소스코드 import sys n = int(sys.stdin.readline().rstrip()) cards = list(map(int, sys.stdi..

알고리즘 2021.03.21

백준 10814 문제풀이

📌문제 설명 📌문제접근방식 enumerate함수를 이용해 회원별 번호를 매긴 뒤 나이순으로 정렬하면 된다고 생각했다. 만약 나이가 같다면 매겨둔 회원 번호로 정렬을 실시한다. 따라서 정렬의 기준를 2개로 설정했다. 📌문제풀이 1차 시도 실패한 이유는 다른 곳에서 발생했다. 입력받을 때 나이가 문자로 입력되었다. [(['21', 'Junkyu'], 1), (['21', 'Dohyun'], 2), (['20', 'Sunyoung'], 3)] 따라서 '21'과 '20'을 숫자로 바꿔주니 문제 없이 통과했다. 비교할 때는 반드시 비교하는 대상의 타입이 무엇인지 확인해야겠다. 소스코드 import sys n = int(sys.stdin.readline().rstrip()) input_list = [sys.stdi..

알고리즘 2021.03.20

백준 2164(카드분류2) 문제풀이

📌문제 설명 📌문제 접근 방식 첫 번째 시도 아무생각 없이 시도했다가 시간 초과가 떴다. 문제를 접근한 방식은 다음과 같았다. 1. 첫 번째 카드를 제거한다. 2. 두 번째 카드를 맨 뒤로 보낸다. 위 두 과정을 1장이 남을때까지 수행하면 되는 문제라고 생각했다. 따라서 리스트를 사용했고 맨 앞에 카드를 삭제하고 뒤로 보내도록 구현했다. 문제가 없을거라 생각했던 이유 두 가지이다. 1. 1중 for문을 사용했다. 2. 최대 가드 수가 50만장이다. 소스코드 # 2초 초과 - N 500000으로 대입 시 79초가 걸렸다. # 병목 지점은 어디지? import sys n = int(sys.stdin.readline().rstrip()) cards = [x for x in range(1,n+1)] def so..

알고리즘 2021.03.12

백준 1259번 : 팰린드롬이란?

📌문제 설명 팰린드롬이란? 팰린드롬이란 앞에서 읽으나 뒤에서 읽으나 똑같은 단어를 말합니다. 📌문제 접근 방식 이 문제는 입력받은 값을 문자열로 바꾼 뒤 뒤집어주기만 하면 되는 간단한 문제였습니다. 📌문제 해결 및 소스코드 import sys def solution(): while True: input_value = str(sys.stdin.readline().rstrip()) if input_value == '0': break target_value = input_value[::-1] if input_value == target_value: print("yes") else: print("no") return 0 solution()

알고리즘 2021.03.09

백준 1920번[수찾기] 문제풀이

문제 설명 📌문제 접근 방법 처음에 간단히 생각했던 방법은 '빈 리스트에 B가 A에 있으면 1, 없으면 0을 저장하자'였습니다. 1. 빈 리스트 생성 2. B가 A에 있다면 1, 없으면 0 리턴 📌1차 오답 소스코드 import sys M = int(sys.stdin.readline().rstrip()) A = list(map(int, sys.stdin.readline().rstrip().split())) N = int(sys.stdin.readline().rstrip()) B = list(map(int, sys.stdin.readline().rstrip().split())) def solution(A, B): res = [] for x in B: if x in A: res.append(1) else: ..

알고리즘 2021.03.07

백준 1181번[단어 정렬] 문제풀이

📌문제 설명 📌문제 접근 방식 1. 중복된 단어를 제거한다. 2. 글자 수로 정렬 후 알파벳 사전순으로 정렬한다. 📌몰랐던 점 sorting 기준을 lambda식으로 정의할 때 2가지 기준을 설정할 것 중복된 단어를 제거하는 건 set 자료구조를 사용해 간단히 해결할 수 있었다. 2단계에서 글자 수로 정렬하는 것도 문제없이 수행했으나 알파벳 사전순으로 정렬하는 과정에서 헷갈렸던 부분은 문자열 정렬을 어떻게 할 것인가였다. lambda 식을 이용해 정렬할 때 2개의 기준을 주고 싶었는데 문법이 기억나지 않았다. 그래서 직접 문자열 정렬을 하는 함수로 구현하다보니 시간이 오래걸렸다. sort함수의 key파라미터로 lambda 식을 넘겨줄 때 글자수와 문자열을 설정하면 간단한 문제였다. 📌소스코드 import..

알고리즘 2021.03.06

[이진탐색] Binary Search - Python

이진탐색 Binary Search 이진탐색과정 이진 탐색의 경우 정렬된 상태에서 수행해야합니다. 이진탐색의 경우 크기가 절반씩 줄어듦으로 순차탐색보다 빠릅니다. 중간 위치를 찾은 뒤 찾는 값과 비교합니다. 같으면 해당 위치를 return합니다. 찾는 값이 중간 위치보다 작으면 왼쪽에서 이진 탐색을 수행합니다. 찾는 값이 중간 위치보다 크면 오른쪽에서 이진 탐색을 수행합니다. def binary_search(data, var): left=0 right=len(data)-1 while left var: right = mid-1 elif data[mid] < var: left = mid+1 return -1 data = [1, 3, 6, 7, 10, 14, 29, 45] print(binary_search(d..

알고리즘 2020.12.25

[버블 정렬] Bubble Sort - Python

버블 정렬 Bubble Sort 버블 정렬 버블 정렬의 시간복잡도는 Worst case - O(n^2), Best case - O(n^2), Average acse - O(n^2)이다. 인접한 값과 계속 비교해나가며 루프를 1번 수행할때마다 1개의 값이 자리를 찾아간다. 앞의 값이 뒤의 값보다 클 경우 위치를 계속 바꿔나가며 마지막 index에 도달하므로 버블정렬이라 부른다. n개의 원소가 주어졌을 때, n*(n-1)/2만큼의 비교를 진행한다. def bubble_sort(data): # 비교 횟수를 저장할 변수 compare_count = 0 # 총 N(N+1)/2번만큼 계산 for j in range(len(data)-1): for i in range(0, len(data)-1-j): compare_..

알고리즘 2020.12.25