문제 https://www.acmicpc.net/problem/2655 2655번: 가장높은탑쌓기 첫째 줄에는 입력될 벽돌의 수가 주어진다. 입력으로 주어지는 벽돌의 수는 최대 100개이다. 둘째 줄부터는 각 줄에 한 개의 벽돌에 관한 정보인 벽돌 밑면의 넓이, 벽돌의 높이 그리고 무게가 차 www.acmicpc.net 풀이 이 문제는 아래와 같은 제약 조건들이 존재한다. 벽돌은 회전시킬 수 없다. 즉, 옆면을 밑면으로 사용할 수 없다. 밑면의 넓이가 같은 벽돌은 없으며, 또한 무게가 같은 벽돌도 없다. 벽돌들의 높이는 같을 수도 있다. 탑을 쌓을 때 밑면이 좁은 벽돌 위에 밑면이 넓은 벽돌은 놓을 수 없다. 무게가 무거운 벽돌을 무게가 가벼운 벽돌 위에 놓을 수 없다. 결국 중요한 것은 밑면의 넓이가 ..
문제 https://www.acmicpc.net/problem/1967 1967번: 트리의 지름 파일의 첫 번째 줄은 노드의 개수 n(1 ≤ n ≤ 10,000)이다. 둘째 줄부터 n-1개의 줄에 각 간선에 대한 정보가 들어온다. 간선에 대한 정보는 세 개의 정수로 이루어져 있다. 첫 번째 정수는 간선이 연 www.acmicpc.net 풀이 트리의 지름을 구하기 위해서는 한 가지 규칙을 찾아내야한다. 그 규칙은 바로 트리의 지름은 리프노드와 리프노드 간의 거리라는 것이다. 따라서 모든 리프 노드에서 DFS탐색을 하여 다른 리프노드까지의 거리를 구하고, 최대 거리를 갱신하면 된다. 이때, 리프노드를 구별하는 방법은 루트노드가 아니면서 연결 노드가 1개(부모노드)뿐인 노드를 구하면 된다. 리프노드를 따로 구..
문제 https://www.acmicpc.net/problem/14391 14391번: 종이 조각 영선이는 숫자가 쓰여 있는 직사각형 종이를 가지고 있다. 종이는 1×1 크기의 정사각형 칸으로 나누어져 있고, 숫자는 각 칸에 하나씩 쓰여 있다. 행은 위에서부터 아래까지 번호가 매겨져 있고, www.acmicpc.net 풀이 N,M이 최대 4이므로 최대 2(가로,세로)^16=65536의 경우의 수가 있으므로 브루트포스 방식으로 해결가능하다. 재귀형식으로 각 원소를 가로로 택할지 세로로 택할지 선택할 수 있겠지만, 비트마스킹을 사용하면 더 간단하다. 예를 들어 아래와 같은 예제를 보자. 비트가 0이면 해당 숫자는 가로, 1이면 세로라고 판단하자. [그림 1]의 왼쪽그림은 오른쪽처럼 나타낼 수 있다. 이를 마..
문제 https://www.acmicpc.net/problem/3273 3273번: 두 수의 합 n개의 서로 다른 양의 정수 a1, a2, ..., an으로 이루어진 수열이 있다. ai의 값은 1보다 크거나 같고, 1000000보다 작거나 같은 자연수이다. 자연수 x가 주어졌을 때, ai + aj = x (1 ≤ i < j ≤ n)을 만족하는 www.acmicpc.net 풀이 이 문제는 두 가지 풀이가 가능하다. 첫번째는 Set을 이용한 방법이다. a + b = X 라는 식을 만족한다면, a = X-b 도 만족한다. 따라서 모든 원소를 Set에 넣은 다음, 첫 원소부터 탐색하며 X-i번째 원소가 Set에 존재한다면 두 수의 합이 X가 되는 것이므로 count 해준다. 이때 주의할 점은 이렇게 모든 원소를..
문제 https://www.acmicpc.net/problem/9935 9935번: 문자열 폭발 첫째 줄에 문자열이 주어진다. 문자열의 길이는 1보다 크거나 같고, 1,000,000보다 작거나 같다. 둘째 줄에 폭발 문자열이 주어진다. 길이는 1보다 크거나 같고, 36보다 작거나 같다. 두 문자열은 모 www.acmicpc.net 풀이 처음에는 자바 String의 split() 기능을 이용해서 쉽게 해결하려고 했다. 하지만 이 방법을 사용하면 메모리 초과가 발생해버린다. 그 이유는 자바의 String은 불변(immutable)이라서 값을 바꿀때마다 매번 새로운 String을 할당하기 때문이다. 따라서 이 문제는 스택 혹은 StringBuilder를 이용해서 풀어야한다. 풀이는 간단하다. StringBui..
문제 https://www.acmicpc.net/problem/1082 1082번: 방 번호 스타트링크가 입주한 사무실은 방 번호를 직접 정할 수 있다. 방 번호를 정하려면 1층 문방구에서 파는 숫자를 구매해야 한다. 숫자를 구매하기 위해 준비한 금액은 M원이고, M원을 모두 사용해 www.acmicpc.net 풀이 숫자를 사서 가장 큰 숫자를 만드려면 어떻게 해야 할까? 아래와 같은 우선순위를 고려해야 할 것이다. 1. 자릿수를 가장 길게 만든다. 2. 맨 앞자리부터 가장 큰 수가 들어가야 한다. 따라서 우선 가장 저렴한 숫자를 최대한 많이 사서 자릿수를 최대한 길게 만든다. 이때 가장 저렴한 숫자가 0이라면, 두 번째로 저렴한 숫자를 맨 앞에 두고 이후 0을 최대한 많이 사서 붙인다. 자릿수를 가장 ..
문제 16953번: A → B 첫째 줄에 A, B (1 ≤ A A*2 2. 1을 수의 가장 오른쪽에 추가한다 -> A*10 +1 위의 두 연산을 DFS 형태로 재귀적으로 부르면 브루트포스 방식으로 해결 가능하다. 간단하게 풀렸을것 같지만, 처음 시도했을때 틀렸습니다를 받았다. 뭐가 문제일까 고민하다가, 변수의 타입을 int로 한게 문제였음을 깨달았다. dfs() 함수에서 if(num > B) return; 이라는 코드가 있는데, 만약 num*2를 계속해서 하다가 int의 범위를 벗어나면 이 부분이 문제가 발생할 수 있다. 따라서 int를 long 타입으로 바..
문제 1051번: 숫자 정사각형 N×M크기의 직사각형이 있다. 각 칸에는 한 자리 숫자가 적혀 있다. 이 직사각형에서 꼭짓점에 쓰여 있는 수가 모두 같은 가장 큰 정사각형을 찾는 프로그램을 작성하시오. 이때, 정사각형은 행 www.acmicpc.net 풀이 1. N, M이 50 이하로 작다. 2. 꼭짓점을 살펴보기 위해서는 기준점에서 3군데만 찾아보면 된다. 3. N과 M중 더 작은 수가 정사각형의 최대길이다. 4. 따라서 최대 50(N)*50(M)*3(꼭짓점 3개 비교)*50(정사각형의 최대 길이) 번의 연산이 필요하므로 브루트포스 방식이 가능하다! 풀이법은 간단하다. 정사각형의 최대 길이는 N과 M 중 더 작은 것일 것이다. 이것을 len이라고 하자. 매번 모든 원소를 조사할 필요 없이 세로는 N-l..
* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.