본문 바로가기

Algorithm

(109)
[Algorithm] 볼링공 고르기 문제 A, B 두 사람이 볼링을 치고 있습니다. 두 사람은 서로 무게가 다른 볼링공을 고르려고 합니다. 볼링공은 총 N개가 있으며 각 볼링공마다 무게가 적혀 있고, 공의 번호는 1번부터 순서대로 부여됩니다. 또한 같은 무게의 공이 여러개 있을 수 있지만, 서로 다른 공으로 간주합니다. 볼링공의 무게는 1부터 M까지의 자연수 형태로 존재합니다. 예를 들어 N이 5이고, M이 3이며 각각의 무게가 차례대로 1, 3, 2, 3, 2일때 각 공의 번호가 차례대로 1번부터 5번까지 부여됩니다. 이때 두 사람이 고를 수 있는 볼링공 번호의 조합을 구하면 다음과 같습니다. (1번, 2번), (1번, 3번), (1번, 4번), (1번, 5번), (2번, 3번), (2번, 5번), (3번, 4번), (4번, 5번) 결과..
[Algorithm] 만들 수 없는 금액 문제 동네 편의점의 주인인 동빈이는 N개의 동전을 가지고 있습니다. 이때 N개의 동전을 이용하여 만들 수 없는 양의 정수 금액 중 최솟값을 구하는 프로그램을 작성하세요. 예를 들어, N = 5 이고, 각 동전이 각각 3원, 2원, 1원, 1원, 9원짜리(화폐 단위) 동전이라고 가정합시다. 이때 동빈이가 만들 수 없는 양의 정수 금액 중 최솟값은 8원입니다. 또 다른 예시로, N = 3 이고, 각 동전이 각각 3원, 5원, 7원짜리(화폐 단위) 동전이라고 가정합시다. 이때 동빈이가 만들 수 없는 양의 정수 금액 중 최솟값은 1원입니다. 입력 조건 첫째 줄에는 동전의 개수를 나타내는 양의 정수 N이 주어집니다. (1 return 1 2. if 리스트의 최댓값 리스트의 2번째 ..
[Python] range함수 사용법 1. range(10) >>> 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 2. range(1,11) >>> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 3. range(0, 20, 2) >>> 0, 2, 4, 6, 8, 10, 12, 14, 16, 18 4. range(20, 0, -2) >>> 20, 18, 16, 14, 12, 10, 8, 6, 4, 2
[Algorithm] 문자열 뒤집기 https://www.acmicpc.net/problem/1439 1439번: 뒤집기 다솜이는 0과 1로만 이루어진 문자열 S를 가지고 있다. 다솜이는 이 문자열 S에 있는 모든 숫자를 전부 같게 만들려고 한다. 다솜이가 할 수 있는 행동은 S에서 연속된 하나 이상의 숫자를 잡고 모 www.acmicpc.net 이 문제 풀이의 핵심은 전부 0으로 바꾸는 경우와 전부 1로 바꾸는 경우 중에서 더 적은 횟수를 가지는 경우를 찾는 것이다. 그렇다면 어떻게 해야 뒤집어야 하는 0그룹의 개수와 1그룹의 개수를 구할 수 있을까? 필자는 이렇게 생각했다. 예시를 들어 생각해보자. 입력으로 '001101' 이 주어졌다고 치자. 입력값을 리스트에 넣고 리스트의 원소를 차례대로 이웃하는 원소와 비교를해서 값이 같다면 넘어..
[Python] 숫자 리스트에서 2번째, K번째 최댓값 구하기 1. 두번째 최댓값 구하기 def second_largest_number(arr): eigen_nums = set(arr) sorted_nums = sorted(eigen_nums, reverse=True) return sorted_nums[1] 중복을 허용하지 않기 때문에 함수의 첫번째 줄에서 정렬을 하기 전에 고유값만 남기도록 코드를 작성하였다. 그리고 정렬을 내림차순으로 진행하고 2번째 값을 반환하면 된다! 2. K번째 최댓값 구하기 def kth_largest_number(arr, K): eigen_nums = set(arr) sorted_nums = sorted(eigen_nums, reverse=True) return sorted_nums[K-1] 두번째 최댓값을 구할때는 1을 인덱스를 반환했..
[Algorithm] 최장 증가 부분 수열(LIS) 원소가 n개인 배열의 일부 원소를 골라내서 만든 부분 수열 중, 각 원소가 이전 원소보다 크다는 조건을 만족하고, 그 길이가 최대인 부분 수열을 최장 증가 부분 수열이라고 한다. {6, 2, 5, 1, 7, 4, 8, 3} 이라는 배열이 있을 경우, LIS는 {2, 5, 8, 7} 이고, 길이는 4 {2, 5}, {2, 7} 등 증가하는 부분 수열은 많지만 그 중에서 가장 긴 것은 {2, 5, 8, 7} {10, 20, 10, 30, 20, 50} 이라는 배열이 있을 경우, LIS는 {10, 20, 30, 50} 이고, 길이는 4 D[i] = arr[i]를 마지막 원소로 가지는 부분 수열의 최대길이 라고 정의할 때, 가장 긴 증가하는 부분 수열을 계산하는 점화식을 작성해보면, 다음과 같다. (DP 테이블..
[Algorithm] 정렬된 배열에서 특정 수의 개수 구하기 문제 N개의 원소를 포함하고 있는 수열이 오름차순으로 정렬되어 있습니다. 이때 이 수열에서 x가 등장하는 횟수를 계산하세요. 값이 x인 원소가 하나도 없다면 -1을 출력합니다. (단, 이 문제는 시간 복잡도 O(logN)으로 알고리즘을 설계하지 않으면 '시간 초과' 판정을 받습니다.) 입력 조건 첫째 줄에 N (0
[Algorithm] 1로 만들기 문제 정수 X가 주어질때 정수 X에 사용할 수 있는 연산은 다음과 같이 4가지이다. 1) X가 5로 나누어떨어지면, 5로 나눈다. 2) X가 3으로 나누어 떨어지면, 3으로 나눈다. 3) X가 2로 나누어 떨어지면, 2로 나눈다. 4) X에서 1을 뺀다. 정수 X가 주어졌을때, 연산 4개를 적절히 사용해서 1을 만들어야한다. 이 연산을 사용하는 횟수의 최솟값을 출력해라. 입력 조건 첫째 줄에 정수 X가 주어진다. (1