본문 바로가기

[C++] 백준 1021번: 회전하는 큐 풀이과정 양방향 순환 큐의 원소의 개수와 뽑을 원소의 개수 int N, M 그리고 뽑을 원소의 위치 deque req를 입력 받는다. 1부터 N까지를 담고 있는 deque arr도 정의해준다. int N, M; deque arr, req; cin >> N >> M; req = deque(M); FOR(i, M) cin >> req[i]; arr = deque(N); FOR(i, N) arr[i] = i + 1; 2와 3의 연산 횟수를 나타내는 int step을 정의하고 작업을 시작한다. 1. 지금 뽑을 원소의 위치를 담을 int target_pos를 정의하고, 그 위치를 저장한다. 2. 그 위치가 arr.size() / 2 보다 작다면 2의 연산을 하는 것이 유리하다. 2-1. arr.front()가 지..
야마하 RX-V861 리시버 전원 불량 문제 나는 PC에 리시버를 연결하여 5.1채널 서라운드 사운드 환경을 구성했다. 그런데 몇 개월 전부터 리시버가 잘 작동하다가 갑자기 꺼졌다 켜지는 것을 반복하는 현상이 간헐적으로 발생하기 시작했다. 아래 영상이 그 증상이다. 최근에 그 빈도가 매우 잦아져서 원인을 나름 분석해봤는데, 다음과 같다. 1. 콘센트 전원 입력이 불안정하다 - 수 년 동안 쓰지 않던 콘센트를 방 인테리어를 하면서 쓰기 시작했는데, 이게 문제일 수도 있다고 생각이 들었다. 그래서 다른 콘센트에서 멀티탭으로 끌어와 연결했지만 증상은 그대로였다. 2. 발열로 인한 문제다. - 컴퓨터도 발열이 너무 심하면 전원이 꺼지기도 한다. 그래서 이런 문제인가 싶어 위 영상에 보이다 싶이, 완전 밖으로 노출시켜 설치했는데도 문제가 지속됐다. 커버를 ..
[C++] 백준 15657번: N과 M (8) 아이디어 그냥 백트랙킹... 중복 없애고... 중복 조합.... 풀이 수열을 입력받고 오름차순으로 정렬한 뒤에 중복된 항목을 제거한다. 백트랙킹을 통해 중본 조합을 구한다. 출력한다. 끝. 코드 #include using namespace std; #define FAST_IO cin.tie(NULL); ios::sync_with_stdio(false); #define FOR(i, N) for(int i = 0; i < N; ++i) #define INF 987654321 #define EL "\n" int N, M; vector arr, ret; vector ans; void dfs(int cursor) { if (ret.size() == M) { ans.push_back(ret); return; } f..
[C++] 백준 1010번: 다리 놓기 https://www.acmicpc.net/problem/1010 1010번: 다리 놓기 입력의 첫 줄에는 테스트 케이스의 개수 T가 주어진다. 그 다음 줄부터 각각의 테스트케이스에 대해 강의 서쪽과 동쪽에 있는 사이트의 개수 정수 N, M (0 < N ≤ M < 30)이 주어진다. www.acmicpc.net 아이디어 정석대로 계산하려면 long long 범위도 초과한다. \(\prod_{i=M-N+1}^{M}{i}\)의 인수 목록에서 \(\prod_{i=1}^{N}{i}\)와의 공통 인수를 제거하여 답을 도출해야 한다. 풀이 \(M-N+1\)부터 \(M\)까지의 각 \(i\) 마다의 인수를 구해 맵에 저장했다. key에는 인수를, value에는 인수의 개수를 저장했다. 이후 \(1\)부터 \(N\)까..
[C++] 백준 1934: 최소공배수 https://www.acmicpc.net/problem/1934 1934번: 최소공배수 두 자연수 A와 B에 대해서, A의 배수이면서 B의 배수인 자연수를 A와 B의 공배수라고 한다. 이런 공배수 중에서 가장 작은 수를 최소공배수라고 한다. 예를 들어, 6과 15의 공배수는 30, 60, 90등이 있 www.acmicpc.net 아이디어 A와 B의 인수를 모두 곱한다. 풀이 A의 인수를 map 형식의 aliquots_A라는 변수에 담았다. key에는 인수를 value에는 그 개수를 저장했다. B에서도 마찬가지로 같은 형식의 aliquots_B라는 변수에 같은 방식으로 저장했다. 2부터 시작하여 A(또는 B)가 1이 될 때까지 나눌 수 있으면 나누는 방식으로 인수를 구했다. 그리고 aliquots_A의 ..
[C++] 백준 1026번: 보물 https://www.acmicpc.net/problem/1026 1026번: 보물 첫째 줄에 N이 주어진다. 둘째 줄에는 A에 있는 N개의 수가 순서대로 주어지고, 셋째 줄에는 B에 있는 수가 순서대로 주어진다. N은 50보다 작거나 같은 자연수이고, A와 B의 각 원소는 100보다 작거 www.acmicpc.net 아이디어 큰 수와 작은수를 짝지어 곱하면 총 합은 작아진다. 풀이 배열 A는 vector 형식에 담고, B는 vector 형식에 fisrt에는 값을, second에는 인덱스를 담았다. B를 copied라는 벡터에 복사하고 A는 내림차순, copied는 first 기준 오름차순으로 정렬했다. copied의 fisrt 값을 A의 값으로 순서대로 대체하고 copied의 second 기준으로 오름..
[C++] 백준 11053번: 가장 긴 증가하는 부분 수열 문제 바로가기 11053번: 가장 긴 증가하는 부분 수열 수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이 www.acmicpc.net 다이나믹 프로그래밍 분류의 문제를 풀다보면 어떤 문제는 금방 풀리고, 어떤 문제는 아무리 생각해보 답이 떠오르지 않는다. 이 문제는 후자에 해당했다. 첫 풀이는 간단했다. 첫 번째 요소부터 시작해서 뒤에 이어지는 값 중 자신보다 큰 값들의 개수를 출력했다. 당현하게도 이는 정답이 아니다. 자신보다 큰 수는 맞지만, 이어지는 수 보다도 큰 수가 선택 돼야 하기 때문이다. 그..
[C++] 백준 10844번: 쉬운 계단 수 문제 바로가기 10844번: 쉬운 계단 수 첫째 줄에 정답을 1,000,000,000으로 나눈 나머지를 출력한다. www.acmicpc.net 개요 이 문제는 혼자 골똘히 생각하다가 포기한 문제다. 결국 풀이를 봤는데, 처음에는 이해하지 못 했다. 종이에 여러 번 써보니 이해됐다. 풀이 끝 자리가 0 또는 9일 때는 다음에 붙을 수가 1과 8로 한 가지 밖에 없다. 이외의 수들은 각 2개씩 이어진다. 따라서 각 숫자로 끝나는 수의 개수를 다뤄야 한다. 즉, 단계별 0부터 9까지의 개수를 담는 2차원 배열이 필요하다. 나는 그것을 아래처럼 정의했다. long long C[100][10]{ {0, 1, 1, 1, 1, 1, 1, 1, 1, 1} }; 위 처럼 배열을 정의하면, 값을 지정한 칸을 제외한 남은 ..
[C++] 백준 2156번: 포도주 시식 문제 바로가기 2156번: 포도주 시식 효주는 포도주 시식회에 갔다. 그 곳에 갔더니, 테이블 위에 다양한 포도주가 들어있는 포도주 잔이 일렬로 놓여 있었다. 효주는 포도주 시식을 하려고 하는데, 여기에는 다음과 같은 두 가지 규 www.acmicpc.net 개요 대표적인 다이내믹 프로그래밍 분류 문제이다. 문제를 푸는 방법은 점화식을 찾고 구현하는 것. N이 최소일 때부터 손으로 써가며 규칙을 찾는 것이 중요하다. 풀이 N이 1일 때부터의 경우를 차근차근 생각해보자 i번째 잔에 들어있는 포도주의 양을 W[i], i번째 잔까지 마실 수 있는 포도주의 최대값을 S[i]라고 하면 아래와 같이 나타낼 수 있다. N 잔을 선택하는 경우 식 1 ● W[0] 2 ● ● W[0] + W[1] 3 ● ● ○ S[i -..
[C++] 백준 2580번: 스도쿠 문제 바로가기 2580번: 스도쿠 스도쿠는 18세기 스위스 수학자가 만든 '라틴 사각형'이랑 퍼즐에서 유래한 것으로 현재 많은 인기를 누리고 있다. 이 게임은 아래 그림과 같이 가로, 세로 각각 9개씩 총 81개의 작은 칸으로 이루 www.acmicpc.net 개요 백준에서 단계별로 풀어보기를 쭉 이어나가다가 이 문제를 맞닥트렸다. 무려 골드4의 난이도를 자랑한다. 의외로 첫 풀이는 간단했다. 그냥 규칙을 적용했더니, 예제는 그냥 풀려버렸다. 그냥 빈 칸 마다 들어갈 수 있는 후보 하나를 쭉 대입하는 방식이었다. 하지만, 당연하게도 그건 답이 아니었다. 풀이 이 문제는 백트랙킹으로 분류된 만큼, 빈 칸에 들어갈 수의 후보가 하나가 아닐 수도 있다. 그래서 재귀함수를 구현했다. 기존 코드에서 큰 변화는 없..
Visual Studio에 OpenGL 설치하기 이것 참 설치하기 어렵다. 그래픽 드라이버를 설치할 때 자동으로 설치된다고는 하지만 VS에서는 안 되는걸... ※ 나중에 알게 됐지만, 그래픽 드라이버를 설치할 때 자동으로 설치되는 파일은 OpenGL32.dll이다. glut32.dll이 아니다! 간략하게, 다음 파일들을 다운로드 하자. 1. freegult.zip 아래 링크에서 freeglut 3.0.0 MSVC Package 부분에 있는걸 다운로드 하자. https://www.transmissionzero.co.uk/software/freeglut-devel/ freeglut Windows Development Libraries Introduction Whilst at the University of Essex, I took a module call..
[C++] 백준 16236번: 아기 상어 문제 바로가기 16236번: 아기 상어 N×N 크기의 공간에 물고기 M마리와 아기 상어 1마리가 있다. 공간은 1×1 크기의 정사각형 칸으로 나누어져 있다. 한 칸에는 물고기가 최대 1마리 존재한다. 아기 상어와 물고기는 모두 크기를 가 www.acmicpc.net 문제 NxN 크기의 공간에 물고기 M 마리와 아기 상어 1마리가 있다. 아기 상어의 처음 크기는 2이고, 1초에 한 칸씩 이동하며 물고기를 먹는 시간은 무시한다. 아기 상어는 자신의 크기보다 작은 물고기만 먹을 수 있으며, 자기 크기만큼 물고기를 먹으면 크기가 1 커진다. 아기 상어의 이동방향 결정 방법은 아래와 같다. 더 이상 먹을 수 있는 물고기가 공간에 없다면 아기 상어는 엄마 상어에게 도움을 요청한다. 먹을 수 있는 물고기가 1마리라면..