반응형

전체 글 44

프로그래머스 - 문자열 내 마음대로 정렬하기 [Python]

https://school.programmers.co.kr/learn/courses/30/lessons/12915 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 안녕하세요, 오늘은 프로그래머스의 '문자열 내 마음대로 정렬하기' 문제를 함께 풀어보려 합니다. Python을 이용해 풀어볼 텐데요, 이 문제는 문자열 정렬과 람다(lambda) 함수 사용법에 대해 깊이 이해할 수 있는 좋은 문제입니다. 문제 설명 이 문제는 주어진 리스트(strings)의 문자열들을 주어진 인덱스(n)에 위치한 문자를 기준으로 정렬하되, 그 문자가 같을 경우 문자열 전체를 비교하..

프로그래머스 2023.06.09

백준 1966번 - 프린터 큐 [Python]

https://www.acmicpc.net/problem/1966 1966번: 프린터 큐 여러분도 알다시피 여러분의 프린터 기기는 여러분이 인쇄하고자 하는 문서를 인쇄 명령을 받은 ‘순서대로’, 즉 먼저 요청된 것을 먼저 인쇄한다. 여러 개의 문서가 쌓인다면 Queue 자료구조에 www.acmicpc.net 안녕하세요! 오늘은 백준 1966번 프린터 큐 문제를 Python으로 풀이하는 방법에 대해서 정리해보려고 합니다. 이 문제는 큐 자료구조를 이용해 해결할 수 있는 문제입니다. 문제 이해 문제는 프린터의 출력 순서를 결정하는 알고리즘에 관한 것입니다. 문서의 중요도에 따라 출력 순서가 결정되며, 더 중요한 문서가 입력되면 앞서 대기하던 문서는 뒤로 밀리게 됩니다. 우리가 알아낼 것은 특정 문서가 언제 ..

BOJ 2023.06.07

백준 11659번 - 구간 합 구하기 4 [python]

Python 코드 n, m = map(int, input().split()) numbers = list(map(int, input().split())) sum = [0] tmp = 0 # 누적 합 구하기 for i in numbers: tmp = tmp + i sum.append(tmp) # 구간 합 구하기 for _ in range(m): i, j = map(int, input().split()) print(sum[j] - sum[i-1]) Python 코드 풀이 이번 문제는 구간 합을 구하는 문제입니다. N과 M의 최대 횟수는 각각 100,000이기 때문에 시간 복잡도를 고려해야 합니다. 완전 탐색 알고리즘으로 풀게 되면 시간 초과가 발생할 수 있습니다. 그래서 누적합 기법을 사용하여 합 배열을 미리..

BOJ 2023.04.03

[선택 알고리즘] - QuickSelect

알고리즘 설명 Quickselect 알고리즘은 k번째 원소를 찾는 알고리즘입니다. 일반적으로 정렬되지 않은 리스트에서 k번째로 작은 원소를 찾는 데 사용됩니다. 물론, 정렬된 리스트에서도 사용할 수 있습니다. 평균적으로 "O(n)"의 시간 복잡도를 가지며, 최악의 경우 "O(n^2)"의 시간 복잡도를 가집니다. 하지만 이런 경우는 매우 드뭅니다. 따라서 일반적인 정렬 알고리즘보다 효율적인 방법입니다. 알고리즘 동작 방식 1. 리스트에서 임의의 원소를 피벗으로 선택합니다. 2. 리스트를 피벗을 기준으로 분할하여, 피벗보다 작은 원소는 왼쪽, 큰 원소는 오른쪽에 위치시킵니다. 3. k번째로 작은 원소가 왼쪽에 위치해 있으면, 왼쪽 부분 리스트에서 Quickselect 알고리즘을 재수행합니다. 4. k번째로 ..

알고리즘 2023.04.03

유클리드 호제법

안녕하세요. 오늘은 최대공약수를 찾는 효율적인 방법인 유클리드 호제법에 대해 함께 알아보도록 하겠습니다. 수학과 프로그래밍에서 많이 사용되는 이 알고리즘을 이해하고 활용한다면, 여러분의 문제 해결 능력을 한 단계 높일 수 있을 것입니다. 유클리드 호제법이란? 유클리드 호제법은 두 개의 자연수나 다항식의 최대공약수를 구하는 알고리즘입니다. 유클리드 호제법 : 두 자연수의 최대 공약수(GCD)를 구하는 알고리즘에 대해 설명드리겠습니다. 1. 최대 공약수(GCD)란 두 개 이상의 자연수의 공통된 약수 중 가장 큰 수를 말합니다. 2. 최소 공배수(LCM)은 두 개 이상의 자연수의 공통된 배수 중 가장 작은 수를 말합니다. 유클리드 호제법의 원리 유클리드 호제법의 기본 원리는 이렇습니다: "두 수 a, b (a..

알고리즘 2023.03.22

Python 함수 정리(계속 업데이트 예정)

몫, 나머지 함수 1. divmod() : 두개 숫자를 나누었을때 몫과 나머지 반환 # n을 2진수로 변환하는 예시코드 def to_binary(n): binary = '' while n > 0: n, remainder = divmod(n, 2) binary = str(remainder) + binary return binary # divmod(a, b) => (a//b, a%b) 와 같음 제곱수 함수 1. sqrt() : 제곱수 여부 판별, n이 제곱수인지 판별해 True or False 반환 import math def is_square(n): sqrt_n = int(math.sqrt(n)) return sqrt_n ** 2 == n # 사용 예시 print(is_square(16)) # True p..

Python 2023.03.22

백준 17608번 - 막대기 [python]

Python 코드 import sys def input(): return sys.stdin.readline().rstrip() n = int(input()) stack = [] # 막대기 높이 입력받아 stack에 저장 for _ in range(n): h = int(input()) stack.append(h) cnt = 0 # 보이는 막대기의 개수를 카운트하기 위해 초기화 max_h = 0 # 현재 기준으로 가장 높은 막대기의 높이를 저장하기 위해 초기화 # 스택 오른쪽부터 왼쪽끝까지 탐색해서 보이는 막대기 개수 카운트 for i in range(n-1, -1, -1): if stack[i] > max_h: cnt += 1 max_h = stack[i] print(cnt) #보이는 막대기 출력 Pyth..

BOJ 2023.03.18

백준 1436번 - 영화감독 숌 [python]

Python 코드 n = int(input()) # 입력값 N cnt = 0 # "666"이 들어가는 수 카운트 변수 num = 666 # 시작 숫자 while True: if "666" in str(num): # "666"이 들어가면 cnt += 1 # 카운트 증가 if cnt == n: # 카운트가 N과 같아지면 print(num) # 해당 숫자 출력 break # 반복문 종료 num += 1 # 다음 숫자로 이동 Python 코드 풀이 1. 코드에 대한 전체적인 풀이 "666"이 들어가는 숫자 중에서 N번째로 작은 수를 출력하는 문제에 대한 저의 해결 방법을 소개하겠습니다. 이 문제를 해결하려면 모든 수를 탐색하면서 "666"이 들어가는 수를 찾아야 합니다. 이를 위해 저는 브루트포스 알고리즘을 사..

BOJ 2023.03.18

백준 1874번 - 스택 수열 [python]

Python 코드 n = int(input()) nums = [] # 입력 받은 수열 담을 리스트 stack = [] # 스택 자료구조를 구현한 리스트 res = [] # push와 pop 연산을 저장할 리스트 num_idx = 0 # 수열 현재 위치 for i in range(n): num = int(input()) nums.append(num) print(nums) for i in range(1, n+1): # stack에 1~n 까지 숫자를 차례대로 push, push 수행 할때마다 'res'에 '+' 추가 stack.append(i) res.append('+') while stack and stack[-1] == nums[num_idx]: # stack이 비어있지 않고, stack의 top 값이 ..

BOJ 2023.03.18

백준 10799번 - 쇠막대기 [python]

Python 코드 s = input() # 괄호가포함된 문자열 입력 받기 stack = [] # 스택 초기화 cnt = 0 # 쇠막대기 조각 개수 초기화 for i in range(len(s)): if s[i] == '(': # 열린 괄호의 경우 스택에 push stack.append(s[i]) else: # 닫힌 괄호인 경우 stack.pop() # 스택에서 pop if s[i-1] == '(': # 직전이 열린 괄호였을 경우, (레이저인 경우) cnt += len(stack) # 쇠막대기 조각 개수 추가 else: # 직전이 닫힌 괄호 였을 경우, (쇠막대기 끝인 경우) cnt += 1 # 쇠막대기 조각 개수 추가 print(cnt) # 쇠막대기 조각 개수 촐력 Python 코드 풀이 이번 문제는 레..

BOJ 2023.03.17
반응형