분류 전체보기39 [백준] 32930번 슈팅 연습 - Python(1편) 문제 링크: https://www.acmicpc.net/problem/32930아래는 문제 사진입니다.더보기 이 문제는 처음에 N개의 과녁이 주어지고, 그 중 원점에서 가장 멀리 있는 과녁을 선택하여 커서가 해당 과녁으로 이동합니다. 이동한 후에는 그 과녁을 삭제하고, 남은 M개의 과녁에서 인덱스가 앞인 순서대로 새로운 과녁을 추가하여 다시 N개의 과녁을 구성합니다. 이후 현재 커서에서 가장 멀리 있는 과녁을 찾아 이동하는 과정을 M번 반복하며, 이때 얻는 점수는 이동한 거리의 제곱입니다. 이를 바탕으로 문제 해결 과정을 다음과 같이 정리할 수 있습니다.입력을 받습니다.원점에서 가장 멀리 떨어져 있는 과녁을 찾아 이동합니다.점수를 기록하고 해당 좌표를 삭제합니다.M개의 과녁에서 가장 앞에 있는 요소를.. 2024. 12. 20. [백준] 2231번 분해합 - Python(1편) 문제 링크: 2231번: 분해합아래는 문제 사진입니다.더보기 이 문제를 일반적으로 풀어보고, 리스트 컴프리헨션으로 더 파이썬스럽게 수정하고, 마지막으로 제너레이터 표현식을 사용하여 더 간결한 코드로 만들어보겠습니다. 1. 일반코드N = int(input()) for i in range(1, N+1): digits = [] num = i while num > 0: digits.append(num % 10) num //= 10 digits.reverse() if i + sum(digits) == N: print(i) break else: print(0)1. i는 숫자이기 때문에 for문에서 구역 설.. 2024. 12. 18. [백준] 7795번 먹을 것인가 먹힐 것인가 - Python(1편) 아래는 문제와 링크입니다.더보기문제 링크: https://www.acmicpc.net/problem/7795 코드를 먼저 보고 이 문제에서 얻어갈 점을 확인해 보겠습니다.from bisect import bisect_leftT = int(input())for _ in range(T): N, M = map(int, input().split()) A = sorted(map(int, input().split())) B = sorted(map(int, input().split())) count = sum(bisect_left(B, a) for a in A) print(count) 1. **이진 탐색의 활용**: 정렬된 배열에서 특정 값보다 작은 원소의 개수를 세는 데 이.. 2024. 12. 16. [백준] 20920번 영단어 암기는 외로워 - Python(1편) 아래는 문제와 링크입니다.더보기 코드를 먼저 보고 살펴보겠습니다.import sysfrom collections import Counterinput = sys.stdin.readlineN, M = map(int, input().split())words = [word.strip() for _ in range(N) if len(word := input().strip()) >= M]word_counts = Counter(words)result = sorted(word_counts, key=lambda x: (-word_counts[x], -len(x), x))print(*result, sep="\n") 일단 이 코드에서 얻을 부분은 아래와 같습니다. 1. 바다코끼리 연산자(할당 표현식 연산자) 사용 - '.. 2024. 12. 15. 파이썬의 요소 추가 메서드 비교 파이썬에서는 자료구조마다 요소를 추가하는 메서드가 다릅니다.기본적인 내용이지만 그만큼 중요하므로 한 번 다루고 넘어가겠습니다.리스트(List)의 요소 추가 메서드append()기능: 리스트 끝에 단일 요소 추가합니다.my_list = ['apple', 'orange']my_list.append('banana')print(my_list) # ['apple', 'orange', 'banana']extend()기능: 리스트 끝에 반복 가능한(iterable) 모든 요소를 추가합니다.my_list = ['apple', 'orange']my_list.extend(['banana', 'grape'])print(my_list) # ['apple', 'orange', 'banana', 'grape']insert().. 2024. 12. 15. [백준] 1449번 수리공 항승 - Python(1편) 처음에는 틀린 코드를 확인하고, 후에 수정하는 방법으로 살펴보겠습니다. 아래는 문제입니다.더보기 일단 처음 제출했던 틀린 코드를 확인해 보겠습니다.N, L = map(int, input().split())data = list(map(int, input().split()))data.sort()stack = 0left, right = 0, 0while left구멍의 위치를 처리하기 위해 투 포인터 알고리즘을 사용하려 했었습니다만, 위 코드에는 몇 가지 논리적 오류가 있었습니다.일단 코드 의도를 확인해 보겠습니다.입력 및 정렬:N과 L을 입력받고, 구멍의 위치를 담을 리스트를 생성 및 정렬하려 했습니다.변수 초기화stack은 필요한 테이프의 개수를 세기 위한 변수입니다.left와 right는 두 포인터로, 투.. 2024. 12. 14. [백준] 11652번 카드 - Python(1편) 처음에는 틀린 코드를 확인하고, 후에 수정하는 방법으로 알아보겠습니다. 아래는 문제입니다.더보기 일단 틀린 코드를 먼저 확인해 보겠습니다.import sysfrom collections import Counterinput = sys.stdin.readlineN = int(input())data = Counter([map(int, input().split()) for _ in range(N)])counter = Counter(data)sorted_list = sorted(counter.items(), key=lambda x:(-x[1],x[0]))print(sorted_list[0][0])위 코드에는 몇 가지 문제점이 있습니다. 그 문제점을 확인해 보겠습니다.입력 처리 오류현재 코드는 map(int, in.. 2024. 12. 13. 단일 패스 탐색: 투 포인터 기법의 활용 투 포인터 기법은 두 개의 포인터를 조작하여 원하는 값을 찾거나 특정 조건을 만족하는 부분 배열을 찾을 때 사용합니다. 사용하는 방법이 많지만 결국 두 개의 포인터가 배열의 양 끝에서 시작하여 중앙으로 이동하거나, 같은 방향으로 이동하면서 모든 요소를 단 한 번씩만 검사한다는 특징이 있습니다. 양 끝에서 시작하여 중앙으로 이동하는 예제 중 주어진 배열에서 두 원소의 합이 target과 일치하는 쌍의 개수를 찾는 알고리즘으로 확인해 보겠습니다. 배열은 오름차순 정렬되어 있고 중복값은 없습니다.시작점(start)과 끝점(end) 두 개의 포인터를 설정합니다. 일반적으로 배열의 시작 위치에 두 포인터를 설정하지만 이 경우 배열의 처음과 끝에 포인터를 설정합니다.문제의 조건에 따라 두 포인터를 이동시킵니다.현재.. 2024. 12. 12. [백준] 1940번 주몽 - Python(1편) 이번 글에서 알고리즘 설계 방법 중 하나인 투 포인터 기법을 활용하여 문제를 해결했습니다. 이 알고리즘은 이중 반복문을 피하고 시간 복잡도를 O(N)으로 줄여 효율성을 크게 높이는 방식으로, 불필요한 연산을 제거하고 주어진 조건을 효과적으로 활용했습니다. 아래는 백준 문제입니다. 사진을 클릭하면 해당 문제 페이지로 넘어갑니다.더보기 이 문제의 전체 코드를 확인해 보고, 자세히 분석해 보도록 하겠습니다.import sysinput = sys.stdin.readlineN = int(input())M = int(input())data = list(map(int, input().split()))data.sort()def partial_sum(data, M): left, right = 0, len(data).. 2024. 12. 12. 병합 정렬 쉽게 배우기: 재귀 호출과 병합 과정을 시각적으로 따라가기 병합 정렬(Marge Sort)은 분할 정복 알고리즘에 기반한 정렬 알고리즘 중 하나로, 안정적이고 효율적인 정렬 방식입니다.이번 포스트에서는 앞에서 병합 정렬 코드에 대해 알아보고 뒤에서는 병합 정렬을 시각화한 글을 보고 병합 과정을 따라가 볼 것입니다. 일단 병합 정렬의 핵심 3가지를 알아보겠습니다.분할(Divide)배열(또는 리스트)을 절반씩 나눕니다.나누는 과정을 재귀적으로 반복하여, 크기가 1인 배열로 쪼갭니다.크기가 1인 배열은 이미 정렬된 상태라고 가정합니다.정복(Conquer)작은 두 배열을 비교하면서 정렬하여 병합(Marge)합니다.병합 과정에서 두 배열을 한 번에 순회하며, 각 리스트의 첫 번째 요소를 비교하여 더 작은 값을 새로운 리스트에 추가하는 방식으로 진행합니다.병합(Merge).. 2024. 12. 12. 이전 1 2 3 4 다음