1. 예전에 풀었던 이분탐색들이랑 비슷한 문제

2. 문제가 친절해서 0ml 인 경우는 없다.

3. r - 1 을 해줘야 답이 정상적으로 출력된다. (l 이 r 을 같거나 넘어가면서 r - 1 이 최대값이 됨)

문제

프로그래밍 대회 전날, 은상과 친구들은 이상한 술집에 모였다. 이 술집에서 막걸리를 시키면 주전자의 용량은 똑같았으나 안에 들어 있는 막걸리 용량은 랜덤이다.  즉 한 번 주문에 막걸리 용량이 802ml 이기도 1002ml가 나오기도 한다.  은상은 막걸리 N 주전자를 주문하고, 자신을 포함한 친구들 K명에게 막걸리를 똑같은 양으로 나눠주려고 한다.  그런데 은상과 친구들은 다른 주전자의 막걸리가 섞이는 것이 싫어서, 분배 후 주전자에 막걸리가 조금 남아 있다면 그냥 막걸리를 버리기로 한다.  (즉, 한 번 주문한 막걸리에 남은 것을 모아서 친구들에게 다시 주는 경우는 없다.  예를 들어 5명이 3 주전자를 주문하여 1002, 802, 705 ml의 막걸리가 각 주전자에 담겨져 나왔고, 이것을 401ml로 동등하게 나눴을 경우 각각 주전자에서 200ml, 0m, 304ml 만큼은 버린다.) 이럴 때 K명에게 최대한의 많은 양의 막걸리를 분배할 수 있는 용량 ml는 무엇인지 출력해주세요.

입력

첫째 줄에는 은상이가 주문한 막걸리 주전자의 개수 N, 그리고 은상이를 포함한 친구들 K명이 입력된다. N은 10000이하의 정수이고, K는 1,000,000이하의 정수이다. 막걸리의 용량은 231 -1 보다 작거나 같은 자연수이다. (단, 항상 N ≤ K 이다. 즉, 주전자의 개수가 사람 수보다 많을 수는 없다 ) .

출력

첫째 줄에 K명에게 나눠줄 수 있는 최대의 막걸리 용량 ml 를 출력한다.

예제 입력 1 

2 3
702
429

예제 출력 1 

351

예제 입력 2 

4 11
427
541
774
822

예제 출력 2 

205

힌트

2번째 예제에서 205ml로 나눌 경우 2,2,3,4 가 된다. 하지만 206ml라고 하면 각각 2, 2, 2, 3 으로 나눌 수 있기 때문에 나누는 용량을 조금 줄여야한다.


1. 숫자를 입력받고 정렬해서 출력하면 된다.

2. 우선순위 큐를 사용했는데, 통과했다.

3. 원래 생각하던 솔루션은 입력받고 mergesort (quicksort 는 stack 메모리 초과될걸로 예상)

문제

정렬되어있는 두 배열 A와 B가 주어진다. 두 배열을 합친 다음 정렬해서 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 배열 A의 크기 N, 배열 B의 크기 M이 주어진다. (1 ≤ N, M ≤ 1,000,000)

둘째 줄에는 배열 A의 내용이, 셋째 줄에는 배열 B의 내용이 주어진다. 배열에 들어있는 수는 절대값이 109보다 작거나 같은 정수이다.

출력

첫째 줄에 두 배열을 합친 후 정렬한 결과를 출력한다.

예제 입력 1 

2 2
3 5
2 9

예제 출력 1 

2 3 5 9

예제 입력 2 

2 1
4 7
1

예제 출력 2 

1 4 7

예제 입력 3 

4 3
2 3 5 9
1 4 7

예제 출력 3 

1 2 3 4 5 7 9

출처


1. 숫자들은 정렬한다.

2. ABC 입력 순서에 따라 출력해주면 된다.

3. 어떻게 하면 짧은 코드를 짤 수 있을까? 해서 나온 코드다.

시간 제한메모리 제한제출정답맞은 사람정답 비율
1 초128 MB27551542139458.156%

문제

세 수 A, B, C가 주어진다. A는 B보다 작고, B는 C보다 작다.

세 수 A, B, C가 주어졌을 때, 입력에서 주어진 순서대로 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 세 수 A, B, C가 주어진다. 하지만, 순서는 A, B, C가 아닐 수도 있다. 세 수는 100보다 작거나 같은 자연수이다. 둘째 줄에는 A, B, C로 이루어진 세 글자가 주어지며, 이 순서대로 출력하면 된다.

출력

주어진 세 수를 주어진 출력 순서대로 출력하면 된다.

예제 입력 1 

1 5 3
ABC

예제 출력 1 

1 3 5

힌트


1. P 는 index 라고 생각하면 편하다.

2. 문제가 이해하기 어려웠는데, 간단하게 적어보겠다

3. A[i] 는 차례대로 2 3 1 이 들어간다.

4. A[i] 를 비내림차순 즉 오름차순으로 정렬한다.

5. A[i] 에는 1 2 3 이 차례대로 들어가고, 처음의 수 2 3 1 이 몇 번째에 있나 idx 를 출력하면 된다.

문제

P[0], P[1], ...., P[N-1]은 0부터 N-1까지(포함)의 수를 한 번씩 포함하고 있는 수열이다. 수열 P를 길이가 N인 배열 A에 적용하면 길이가 N인 배열 B가 된다. 적용하는 방법은 B[P[i]] = A[i]이다.

배열 A가 주어졌을 때, 수열 P를 적용한 결과가 비내림차순이 되는 수열을 찾는 프로그램을 작성하시오. 비내림차순이란, 각각의 원소가 바로 앞에 있는 원소보다 크거나 같을 경우를 말한다. 만약 그러한 수열이 여러개라면 사전순으로 앞서는 것을 출력한다.

입력

첫째 줄에 배열 A의 크기 N이 주어진다. 둘째 줄에는 배열 A의 원소가 0번부터 차례대로 주어진다. N은 50보다 작거나 같은 자연수이고, 배열의 원소는 1,000보다 작거나 같은 자연수이다.

출력

첫째 줄에 비내림차순으로 만드는 수열 P를 출력한다.

예제 입력 1 

3
2 3 1

예제 출력 1 

1 2 0

힌트

출처

  • 문제를 번역한 사람: baekjoon
  • 잘못된 조건을 찾은 사람: dareka


1. 처음에는 평균을 구해서 한다고 생각했다.

2. 근데 만약 평균값을 구하는건데 10000, 10000 이 10000개 1, 1이 1개면

3. 평균값만큼 이동을 해야된다.

4. 그래서 중앙값을 찾아서 거기로 모이는걸 생각했다.

5. x, y 를 각각 따로보면 각각 정렬해서 구하고 중간값만큼 이동

문제

행의 크기와 열의 크기가 각각 N인 격자공간에 M개의 점이 있다. N = 4이고 M = 4인 경우의 예가 아래에 있다. 격자공간 왼쪽의 숫자는 행 번호이며, 위의 숫자는 열 번호를 나타낸다. 그리고 격자공간내의 각 사각형의 위치는 (행 번호, 열 번호)로 표시한다

이제 격자공간에 있는 모든 점들을 하나의 사각형 안으로 모으려고 한다. 어떤 점을 움직일 때는 그 점이 들어있는 사각형에서 상하좌우로 인접한 사각형으로만 움직일 수 있다.

여기에서는 격자공간내의 한 사각형으로 모든 점들을 모을 때 각 점이 움직인 거리의 합을 고려한다. 예를 들어, 위의 점들을 (3,2)에 있는 사각형으로 모을 때 최단거리로 점들을 이동시킨다면 (1,2)에 있는 점의 이동거리는 2이고, (3,1)과 (4,2)에 있는 점의 이동거리는 각각 1이며, (1,4) 에 있는 점의 이동거리는 4이므로 점들이 움직인 거리의 합은 8이다. 또, 위의 모든 점들을 (1,2)의 위치로 모을 때도 점들이 이동한 거리의 합이 8 임을 알 수 있다. 위의 예에서는 점들을 어떤 하나의 사각형으로 모을 때 이동거리의 합이 8보다 작게 되는 사각형은 없다.

이 문제는 주어진 격자공간에 있는 모든 점들을 하나의 사각형으로 모을 때 드는 이동거리의 합의 최솟값을 구하는 것이다. 주어진 격자공간에서는 하나의 사각형에 여러 개의 점들이 들어 있을 수도 있고, 점들을 모을 때는 어떤 점이 들어 있는 사각형으로도 모을 수 있다고 가정한다.

입력

첫 줄에는 격자공간의 크기와 점들의 개수를 나타내는 두 정수 N과 M이 하나의 공백을 사이에 두고 주어진다. 다음의 M줄에는 각 줄마다 격자공간내의 점의 위치를 나타내는 두 개의 정수가 하나의 공백을 사이에 두고 주어진다. 단, N의 크기는 1이상 10,000이하이고, M의 크기는 1이상 100,000이하이다.

출력

여러분은 모든 점들을 하나의 사각형으로 모을 때 드는 이동거리의 합의 최솟값을 출력해야 한다.


c++ 기본기 없이 코딩하려니 에러도 많이나서 질문도 많이했다.


풀이과정은

1. 무식하게 버블정렬 : 시간초과

2. sort를 사용하니까 통과됨


bool cmp(string a, string b){
if(a.length() < b.length()) return true;
else if(a.length() == b.length()) return a.compare(b) < 0;
return false;
}

a.length >= b.length를 고려 안해줘서 조금 많이 틀렸다.

3개의 풀이가 나왔다.

1. 시간초과

하나씩 다 더해줌

2. 런타임

2차원 배열을 만들어서 무게별로 나누고 또 거기에서 컬러별로 나눴음

2000 * 2e5 * 4 = 1G가 넘어가서 런타임 에러

3. 정답

블로그를 조금 참고했지만, 짜고나니 거의 똑같게 나옴...

total 스코어 idea를 참고함.


+ Recent posts