본문 바로가기

알고리즘 공부 및 문제 풀이/백준(BOJ)

(220)
[c++] 백준 11286 절댓값 힙 백준 단계별로 풀어보기 [우선순위 큐] 절댓값 힙 https://www.acmicpc.net/problem/11286 11286번: 절댓값 힙 첫째 줄에 연산의 개수 N(1≤N≤100,000)이 주어진다. 다음 N개의 줄에는 연산에 대한 정보를 나타내는 정수 x가 주어진다. 만약 x가 0이 아니라면 배열에 x라는 값을 넣는(추가하는) 연산이고, x가 0 www.acmicpc.net [풀이] pair를 이용해서 입력된 수와 그 수의 절대값을 모두 큐에 저장한다. 우선순위 큐는 pair의 첫번째 인자를 기준으로 값을 저장하고, 그 값이 같다면 두번째 인자를 기준으로 저장한다. min_heap을 이용하여 절대값이 같다면 더 작은 수를 우선으로 저장해 출력하게 한다. [코드] #include #include #..
[c++] 백준 11279, 1927 최대 힙, 최소 힙 백준 단계별로 풀어보기 [우선순위 큐] 최대 힙, 최소 힙 https://www.acmicpc.net/problem/11279 11279번: 최대 힙 첫째 줄에 연산의 개수 N(1 ≤ N ≤ 100,000)이 주어진다. 다음 N개의 줄에는 연산에 대한 정보를 나타내는 정수 x가 주어진다. 만약 x가 자연수라면 배열에 x라는 값을 넣는(추가하는) 연산이고, x가 www.acmicpc.net https://www.acmicpc.net/problem/1927 1927번: 최소 힙 첫째 줄에 연산의 개수 N(1 ≤ N ≤ 100,000)이 주어진다. 다음 N개의 줄에는 연산에 대한 정보를 나타내는 정수 x가 주어진다. 만약 x가 자연수라면 배열에 x라는 값을 넣는(추가하는) 연산이고, x가 0 www.acmic..
[c++] 백준 1018 체스판 다시 칠하기 백준 단계별로 풀어보기 [브루트포스] 체스판 다시 칠하기 https://www.acmicpc.net/problem/1018 1018번: 체스판 다시 칠하기 첫째 줄에 N과 M이 주어진다. N과 M은 8보다 크거나 같고, 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 보드의 각 행의 상태가 주어진다. B는 검은색이며, W는 흰색이다. www.acmicpc.net [풀이] 8*8 체스판을 만들기 위해 다시 칠해야 하는 정사각형의 최소 개수를 구하는 문제이다. 브루트포스 문제로 모든 경우의 수를 검사한다. 체스판의 시작인 맨 왼쪽 위 정사각형이 흰색인 경우 다시 칠해야 하는 정사각형 카운트를 w_cnt로, 검정색인 경우 다시 칠해야 하는 정사각형 카운트를 b_cnt로 해서 가장 작은 min_cn..
[c++] 백준 17298 오큰수 백준 단계별로 풀어보기 [스택] 오큰수 https://www.acmicpc.net/problem/17298 17298번: 오큰수 첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에 수열 A의 원소 A1, A2, ..., AN (1 ≤ Ai ≤ 1,000,000)이 주어진다. www.acmicpc.net [풀이] 스택의 top에 저장된 인덱스의 배열 값과 비교하여 현재 배열 값이 더 크면 오큰수를 발견한 것이다. 따라서 오큰수를 발견한 값의 인덱스는 스택에서 pop해 지워준다. 오큰수에 해당하는 값은 ans[] 배열에 저장해준다. 스택의 top보다 현재 배열값이 더 작아지면 현재 배열값을 stack에 push해준다. for문이 종료되면 stack이 빌 때까지 stack..
[c++] 9461 파도반 수열 백준 단계별로 풀어보기 [동적계획법 1] 파도반 수열 https://www.acmicpc.net/problem/9461 9461번: 파도반 수열 오른쪽 그림과 같이 삼각형이 나선 모양으로 놓여져 있다. 첫 삼각형은 정삼각형으로 변의 길이는 1이다. 그 다음에는 다음과 같은 과정으로 정삼각형을 계속 추가한다. 나선에서 가장 긴 변의 www.acmicpc.net [풀이] 파도반 수열. 1 1 1 2 2 3 4 5 7 9 12 16 ... 이 수열만 보더라도 dp[n] = dp[n-2] + dp[n-3] 이라는 점화식을 구할 수 있다. 다만, 수가 커지면 int 범위를 넘어서기 때문에 int가 아니라 long long으로 선언 해야한다. 6번째 삼각형 = 3번째(1) + 5번째(2) 7번째 삼각형 = 6번째 ..
[c++] 백준 2156 포도주 시식 백준 단계별로 풀어보기 [동적계획법 1] 포도주 시식 https://www.acmicpc.net/problem/2156 2156번: 포도주 시식 효주는 포도주 시식회에 갔다. 그 곳에 갔더니, 테이블 위에 다양한 포도주가 들어있는 포도주 잔이 일렬로 놓여 있었다. 효주는 포도주 시식을 하려고 하는데, 여기에는 다음과 같은 두 가지 규 www.acmicpc.net [풀이] 이전에 했던 계단오르기와 매우 유사한 동적프로그래밍 문제이다. 따라서 3번 연속 포도주를 마시면 안되기 때문에 다음과 같은 점화식이 도출된다. 1. max[n] = max[n-2] + juice[n] 2. max[n] = max[n-3] + juice[n-1] + juice[n] 다만 계단 오르기 문제와 다르게 유의해야 할 점은 마지막 ..
[c++] 백준 9663 N-Queen 백준 단계별로 풀어보기 [백트래킹] N-Queen https://www.acmicpc.net/problem/9663 9663번: N-Queen N-Queen 문제는 크기가 N × N인 체스판 위에 퀸 N개를 서로 공격할 수 없게 놓는 문제이다. N이 주어졌을 때, 퀸을 놓는 방법의 수를 구하는 프로그램을 작성하시오. www.acmicpc.net [풀이] 배치된 퀸이 n개가 되면 경우의 수 증가, 새로운 퀸은 배치된 퀸의 같은 행, 같은 열, 대각선에 위치해서는 안된다. 따라서 어차피 한 행에 하나의 퀸 밖에 놓지못하므로 이차배열을 사용하지 않고 col[]배열을 선언해 사용한다. col[1] = 1은 첫번째 열에 위치한 퀸의 행이 1행임을 의미한다. (x, y)와 (a, b)에 대해서 두 좌표가 대각선에 ..
[c++] 백준 2579 계단 오르기 백준 단계별로 풀어보기 [동적계획법1] 계단 오르기 https://www.acmicpc.net/problem/2579 2579번: 계단 오르기 계단 오르기 게임은 계단 아래 시작점부터 계단 꼭대기에 위치한 도착점까지 가는 게임이다. 과 같이 각각의 계단에는 일정한 점수가 쓰여 있는데 계단을 밟으면 그 계단에 쓰여 있는 점 www.acmicpc.net [풀이] 계단은 한번에 한계단 또는 두계단을 올라야 하며, 연속된 세 계단을 모두 밟으면 안된다. 마지막 계단은 반드시 밟아야한다. 즉 목표계단을 중심으로 목표계단과 그 전 계단을 밟은 경우, 목표계단과 그로부터 2단계 전 계단을 밟은 경우를 계산해주면 된다. 예를 들어, 6번째 계단을 오르는 점수의 최댓값은 또는 중 더 큰 값이 된다. -> m[]을 1~n..