[백준] 2504 - 괄호의 값 Python
·
알고리즘/스택
https://www.acmicpc.net/problem/2504 2504번: 괄호의 값 4개의 기호 ‘(’, ‘)’, ‘[’, ‘]’를 이용해서 만들어지는 괄호열 중에서 올바른 괄호열이란 다음과 같이 정의된다. 한 쌍의 괄호로만 이루어진 ‘()’와 ‘[]’는 올바른 괄호열이다. 만일 www.acmicpc.net 다음 규칙에 따라 괄호열의 값을 계산해 출력하는 문제다. ‘()’ 인 괄호열의 값은 2이다. ‘[]’ 인 괄호열의 값은 3이다. ‘(X)’ 의 괄호값은 2×값(X) 으로 계산된다. ‘[X]’ 의 괄호값은 3×값(X) 으로 계산된다. 올바른 괄호열 X와 Y가 결합된 XY의 괄호값은 값(XY)= 값(X)+값(Y) 로 계산된다. 문제 설명에 따르면 (()[[]])([]) 의 괄호값은, ()[[]] 의..
[백준] 3151 - 합이 0 Python
·
알고리즘/투 포인터
https://www.acmicpc.net/problem/3151 3151번: 합이 0 Elly는 예상치 못하게 프로그래밍 대회를 준비하는 학생들을 가르칠 위기에 처했다. 대회는 정확히 3명으로 구성된 팀만 참가가 가능하다. 그러나 그녀가 가르칠 학생들에게는 큰 문제가 있었다. www.acmicpc.net N 명의 학생들의 코딩실력이 -10000부터 10000사이의 정수로 중복을 허용해 주어질 때, 3명의 합이 0 이되는 경우의 수를 구하는 문제다. 정렬 후 한 수를 고정하고, 투 포인터로 첫 번째 수까지 제외한 구간에서 나머지 두 수의 합이 -(첫번째수) 를 만족하도록 만들면 된다. 수의 중복을 허용하기 때문에 두 가지의 케이스를 생각해볼 수 있다. - 합을 0 으로 만드는 두 수가 여러 개 존재하는 ..
[백준] 14391 - 종이 조각 Python
·
알고리즘/비트마스크
https://www.acmicpc.net/problem/14391 14391번: 종이 조각 영선이는 숫자가 쓰여 있는 직사각형 종이를 가지고 있다. 종이는 1×1 크기의 정사각형 칸으로 나누어져 있고, 숫자는 각 칸에 하나씩 쓰여 있다. 행은 위에서부터 아래까지 번호가 매겨져 있고, www.acmicpc.net 직사각형 종이를 적절히 잘라 가로 조각들과 세로 조각들의 합을 최대로 만드는 문제다. 종이 조각을 자를때 특별한 규칙이 없고, 입력으로 주어지는 조각의 숫자들또한 규칙이 없으므로, 모든 경우의 수를 탐색해 해를 도출해본다. 각 조각들마다 두 가지 경우로 나뉜다. - 가로 조각일 경우 - 세로 조각일 경우 이때 가로 조각을 0, 세로 조각을 1로 표현한다면 각 조각들마다 0 과 1의 상태를 가지게..
[백준] 2234 - 성곽 Python
·
알고리즘/BFS
https://www.acmicpc.net/problem/2234 2234번: 성곽 첫째 줄에 두 정수 N, M이 주어진다. 다음 M개의 줄에는 N개의 정수로 벽에 대한 정보가 주어진다. 벽에 대한 정보는 한 정수로 주어지는데, 서쪽에 벽이 있을 때는 1을, 북쪽에 벽이 있을 때는 2를, www.acmicpc.net 성의 지도를 입력받아 성에 있는 방의 개수, 가장 넓은 방의 넓이, 하나의 벽을 제거하여 얻을 수 있는 가장 넓은 방의 크기를 구하는 문제다. 벽에 대한 정보는 0 ~ 15 사이 정수로 주어지는데, 서쪽에 벽이 있을 때는 1을, 북쪽에 벽이 있을 때는 2를, 동쪽에 벽이 있을 때는 4를, 남쪽에 벽이 있을 때는 8을 더한 값이 주어진다. 방의 개수와 가장 넓은 방의 넓이는 완전탐색, BFS ..
[백준] 2133 - 타일 채우기 Python
·
알고리즘/다이나믹 프로그래밍
https://www.acmicpc.net/problem/2133 2133번: 타일 채우기 3×N 크기의 벽을 2×1, 1×2 크기의 타일로 채우는 경우의 수를 구해보자. www.acmicpc.net 3×N 크기의 벽을 2×1, 1×2 크기의 타일로 채우는 경우의 수를 구하는 문제다. 예시를 보자면 3x12 타일을 채우는 한 가지 경우는 위와 같을 수 있겠다. 먼저, 타일을 추가하기 위해 고유한 모양을 확인한다. 타일의 모양이 고유하지 않다면 추가하는 경우의 수가 중복되므로 고유한 경우만 타일을 추가해주어야 한다.- 3X2 타일의 경우 고유한 모양이 3개 존재한다. - 3X4 타일의 경우 고유한 모양이 2개 존재한다. - 3x6 타일의 경우 고유한 모양이 2개 존재한다. - 3x8, 3x10.. 의 경우..
[백준] 1253 - 좋다 Python
·
알고리즘/투 포인터
https://www.acmicpc.net/problem/1253 1253번: 좋다 첫째 줄에는 수의 개수 N(1 ≤ N ≤ 2,000), 두 번째 줄에는 i번째 수를 나타내는 Ai가 N개 주어진다. (|Ai| ≤ 1,000,000,000, Ai는 정수) www.acmicpc.net N 개의 수 중 자기 자신이 아닌 다른 두 수의 합으로 나타낼 수 있는 수를 구하는 문제다. - 입력을 받은 N 개의 수를 정렬한다. (nlogn) - 투 포인터 알고리즘을 이용해 0 번째 인덱스부터 N-1 번째 인덱스까지 두 수를 조합해 현재 수를 만들 수 있는 경우를 완전탐색한다. - 한번 탐색한 숫자에 대해 다시 불필요한 탐색을 하지 않도록 각 숫자별로 해시테이블에 다른 두 수의 합으로 만들 수 있는지 1, -1 로 저..
[백준] 25214 - 크림 파스타 Python
·
알고리즘/다이나믹 프로그래밍
https://www.acmicpc.net/problem/25214 25214번: 크림 파스타 각 \(A_i\)가 추가된 직후의 문제의 답 \(N\)개를 공백으로 구분하여 출력한다. www.acmicpc.net 정수를 추가할 때마다 1 ≤ i ≤ j ≤ |A| ( |A| 는 배열 A 의 현재 길이) 를 만족하는 정수 i, j 에 대해 Aj - Ai 의 최대값을 구하는 문제다. 큰 요소가 작은 요소보다 오른쪽에 있어야 한다는 조건을 만족하는 범위 내에서 차이의 최대값을 구하는 문제라고 해석할 수 있다. 정수를 추가할 때마다 차이의 최대값을 구해야 한다. 현재 추가한 정수를 기준으로 나눈다면 다음과 같이 나타낼 수 있다. 차이의 최대값 = max(이전까지의 차이의 최대값,현재 추가한 정수를 최대 요소로 선택..