문제 지민이는 길이가 64cm인 막대를 가지고 있다. 어느 날, 그는 길이가 Xcm인 막대가 가지고 싶어졌다. 지민이는 원래 가지고 있던 막대를 더 작은 막대로 자른다음에, 풀로 붙여서 길이가 Xcm인 막대를 만들려고 한다.막대를 자르는 가장 쉬운 방법은 절반으로 자르는 것이다. 지민이는 아래와 같은 과정을 거쳐서 막대를 자르려고 한다.지민이가 가지고 있는 막대의 길이를 모두 더한다. 처음에는 64cm 막대 하나만 가지고 있다. 이때, 합이 X보다 크다면, 아래와 같은 과정을 반복한다.가지고 있는 막대 중 길이가 가장 짧은 것을 절반으로 자른다.만약, 위에서 자른 막대의 절반 중 하나를 버리고 남아있는 막대의 길이의 합이 X보다 크거나 같다면, 위에서 자른 막대의 절반 중 하나를 버린다.이제, 남아있는 ..
문제N개의 수로 된 수열 A[1], A[2], …, A[N] 이 있다. 이 수열의 i번째 수부터 j번째 수까지의 합 A[i] + A[i+1] + … + A[j-1] + A[j]가 M이 되는 경우의 수를 구하는 프로그램을 작성하시오.입력첫째 줄에 N(1 ≤ N ≤ 10,000), M(1 ≤ M ≤ 300,000,000)이 주어진다. 다음 줄에는 A[1], A[2], …, A[N]이 공백으로 분리되어 주어진다. 각각의 A[x]는 30,000을 넘지 않는 자연수이다.출력첫째 줄에 경우의 수를 출력한다. 문제해설이번 문제는 합이 m이되는 부분배열의 개수를 구하는 문제이다. 슬라이딩 윈도우 기법과 투포인터 접근법을 사용하여, 배열을 효율적으로 순회하며 매번 합을 다시 계산하지 않고도 문제를 해결할 수 있다. 슬라..
문제상근이는 나무 M미터가 필요하다. 근처에 나무를 구입할 곳이 모두 망해버렸기 때문에, 정부에 벌목 허가를 요청했다.정부는 상근이네 집 근처의 나무 한 줄에 대한 벌목 허가를 내주었고, 상근이는 새로 구입한 목재절단기를 이용해서 나무를 구할것이다.목재절단기는 다음과 같이 동작한다. 먼저, 상근이는 절단기에 높이 H를 지정해야 한다. 높이를 지정하면 톱날이 땅으로부터 H미터 위로 올라간다.그 다음, 한 줄에 연속해있는 나무를 모두 절단해버린다.따라서, 높이가 H보다 큰 나무는 H 위의 부분이 잘릴 것이고, 낮은 나무는 잘리지 않을 것이다. 예를 들어, 한 줄에 연속해있는 나무의 높이가 20, 15, 10, 17이라고 하자.상근이가 높이를 15로 지정했다면, 나무를 자른 뒤의 높이는 15, 15, 10, ..
문제알파벳 소문자로 이루어진 N개의 단어가 들어오면 아래와 같은 조건에 따라 정렬하는 프로그램을 작성하시오.길이가 짧은 것부터길이가 같으면 사전 순으로단, 중복된 단어는 하나만 남기고 제거해야 한다. 입력첫째 줄에 단어의 개수 N이 주어진다. (1 ≤ N ≤ 20,000) 둘째 줄부터 N개의 줄에 걸쳐 알파벳 소문자로 이루어진 단어가 한 줄에 하나씩 주어진다. 주어지는 문자열의 길이는 50을 넘지 않는다. 출력조건에 따라 정렬하여 단어들을 출력한다. 문제 풀이본 문제는 간단히 정렬로 해결할 수 있는 문제이다.문제에서 주의해서 볼 것은 두 가지인데, 1. 중복된 단어는 하나만 남기고 제거한다.2. 길이로 정렬하되, 길이가 같은 경우 사전 순으로 정렬한다. 이는 파이썬 정렬 함수들에 대한 이해가 부족하면 ..
문제정수가 주어지면, 그 수의 정수 제곱근을 구하는 프로그램을 작성하시오. 문제해설본 문제는, 입력 숫자가 2의 63승이다."문제만 본다면, 그냥 math.sqrt나 **0.5로 제곱근을 구해주면 안되나 ?"라고 생각할 수도 있지만, 큰 오산이다. 아마 위와 같은 방법으로 계산을 해보면, 반드시 더 작은 숫자가 나올 것이다.이는 컴퓨터가 사용하는 숫자 표현 방식에 의거한다. 이를 이해하기 위해선 부동소수점이라는 개념을 알아야 한다.부동 소수점이란, 컴퓨터가 실수를 표현하는 방법이다.주로 IEEE 754라고 하는게 부동소수점을 표현하는 표준 규칙이다. 간략하게 설명하자면, 실수를 64비트나 32비트로 표현한다. 그리고 실수로 표현하기 위해 각 비트를 3개의 종류로 나눈다. 부호비트, 지수비트, 가수비트이다..
문제 설명어떤 숫자에서 k개의 수를 제거했을 때 얻을 수 있는 가장 큰 숫자를 구하려 합니다. 예를 들어, 숫자 1924에서 수 두 개를 제거하면 [19, 12, 14, 92, 94, 24] 를 만들 수 있습니다. 이 중 가장 큰 숫자는 94 입니다. 문자열 형식으로 숫자 number와 제거할 수의 개수 k가 solution 함수의 매개변수로 주어집니다. number에서 k 개의 수를 제거했을 때 만들 수 있는 수 중 가장 큰 숫자를 문자열 형태로 return 하도록 solution 함수를 완성하세요. 제한 조건number는 2자리 이상, 1,000,000자리 이하인 숫자입니다. k는 1 이상 number의 자릿수 미만인 자연수입니다. 입출력 예numberkreturn"1924"2"94""123123..