본문 바로가기

Docker에 OpenGL 환경 설정하기까지의 과정 작업환경은 Intel Iris Plus Graphics를 탑재한 MacBook Pro 2020년형이다. Visual Studio Code에서 작업할 것이며, Docker에 Ubuntu20.04 이미지를 사용할 것이다. 내 목표는 이 환경에서 파이썬 3.7 버전으로 OpenGL 창을 띄우는 것이다. 아래는 이를 위한 삽질을 기록하도록 한다. 도커 환경 설정 https://docs.microsoft.com/ko-kr/learn/modules/use-docker-container-dev-env-vs-code/ Visual Studio Code에서 Docker 컨테이너를 개발 환경으로 사용 - Learn Visual Studio Code Remote - Containers 확장을 사용하여 완전한 기능을 갖춘 컨..
[C++] 백준 13460번: 구슬 탈출 2 https://www.acmicpc.net/problem/13460 13460번: 구슬 탈출 2 첫 번째 줄에는 보드의 세로, 가로 크기를 의미하는 두 정수 N, M (3 ≤ N, M ≤ 10)이 주어진다. 다음 N개의 줄에 보드의 모양을 나타내는 길이 M의 문자열이 주어진다. 이 문자열은 '.', '#', 'O', 'R', 'B' www.acmicpc.net 시뮬레이션과 너비 우선 탐색을 통해 문제를 풀어볼 것이다. 보드의 정보가 입력된다. R은 빨간공, B는 파란공, O는 목적지를 나타내며 #은 벽을 나타낸다. 먼저, 이러한 정보를 어떻게 효율적이고 깔끔하게 다룰 수 있을지 고민해보자. 클래스를 하나 정의하여 사용해보면 가독성이 좋아지지 않을까. 성능은 일단 제쳐두고 가독성만을 생각하며 코드를 작성해..
[C++] 백준 1024번: 수열의 합 https://www.acmicpc.net/problem/1024 1024번: 수열의 합 첫째 줄에 N과 L이 주어진다. N은 1,000,000,000보다 작거나 같은 자연수이고, L은 2보다 크거나 같고, 100보다 작거나 같은 자연수이다. www.acmicpc.net 오답 풀이 예제에 대해서 하나씩 계산을 해보았다. 우선, N에 예제 출력의 수열 길이를 나누었다. 그러자 규칙을 발견했다. 규칙은 다음과 같았다. 주어진 수를 N, 출력이 될 수열의 길이가 L이라고 했을 때, 다음 중 하나를 만족하면 답이 있다. L이 짝수이며 N에 L을 나누었을 때 나머지가 0.5이다. L이 홀수이며 N에 L을 나누었을 떄 나누어 떨어진다. 출력이 될 수열에서 첫 번째 값은 다음처럼 계산했다. L이 짝수라면 N에 L을 ..
[C++] 백준 13305번: 주유소 https://www.acmicpc.net/problem/13305 13305번: 주유소 표준 입력으로 다음 정보가 주어진다. 첫 번째 줄에는 도시의 개수를 나타내는 정수 N(2 ≤ N ≤ 100,000)이 주어진다. 다음 줄에는 인접한 두 도시를 연결하는 도로의 길이가 제일 왼쪽 도로부터 N-1 www.acmicpc.net 오답 풀이 도시 나열의 전체 구간[0, N - 1]에서 기름 단가가 가장 낮은 곳을 찾는다. 그곳의 위치를 K라고 하자. 그 이후 구간[K, N - 1]의 전체 도로의 길이를 구한 뒤, K 도시의 기름 단가를 곱한 값을 ans에 누적한다. 이제, 도시 나열의 남은 구간[0, K - 1]에서 기름 단가가 가장 낮은 곳을 찾는다. 그리고 위를 K가 0이 될 때까지 반복한다. 이렇게 해서..
[C++] 백준 1912번: 연속합 https://www.acmicpc.net/problem/1912 1912번: 연속합 첫째 줄에 정수 n(1 ≤ n ≤ 100,000)이 주어지고 둘째 줄에는 n개의 정수로 이루어진 수열이 주어진다. 수는 -1,000보다 크거나 같고, 1,000보다 작거나 같은 정수이다. www.acmicpc.net 오답 풀이 먼저, 누적합 배열을 계산했다. 그리고 누적합 배열에서 최소값과 최대값을 찾았다. 최소값보다 뒤에 있는 요소 중에 최대값을 찾고, 최대값보다 앞에 있는 요소 중에 최소값을 찾았다. 그리고 그 두 경우에서의 차 중 큰 값을 답으로 출력했다. 그리고 틀렸다. 정답 풀이 https://sihyungyou.github.io/baekjoon-1912/ 백준 1912번 : 연속합 BOJ sihyungyou...
[C++] 백준 2143번: 두 배열의 합 https://www.acmicpc.net/problem/2143 2143번: 두 배열의 합 첫째 줄에 T(-1,000,000,000 ≤ T ≤ 1,000,000,000)가 주어진다. 다음 줄에는 n(1 ≤ n ≤ 1,000)이 주어지고, 그 다음 줄에 n개의 정수로 A[1], …, A[n]이 주어진다. 다음 줄에는 m(1 ≤ m ≤ 1,000)이 주어지고, 그 www.acmicpc.net Two Pointer로 어떻게 푸는거지 생각하다가 포기하고 답을 찾아봤다. 나는 아무리 생각해도 \(O({N^2M^2})\) 밖에 생각나지 않았다. https://debuglog.tistory.com/155 백준 2143번 - 두 배열의 합 백준 2143번 - 두 배열의 합 https://www.acmicpc.net/..
[C++] 백준 1644번: 소수의 연속합 https://www.acmicpc.net/problem/1644 1644번: 소수의 연속합 첫째 줄에 자연수 N이 주어진다. (1 ≤ N ≤ 4,000,000) www.acmicpc.net 에라토스테네스의 체와 두 포인터를 활용하여 풀 수 있는 문제다. N까지의 소수 리스트를 구하는데 시간이 상대적으로 더 오래 걸린다. 처음 제출에서 시간초과가 나서 두 번째 제출에서는 sqrt, vector::size 중복 연산을 없애고 그 외 자잘한 산술연산도 줄였더니 AC를 받을 수 있었다. #include using namespace std; #define TC(T) int T; cin >> T; while(T--) #define FAST_IO cin.tie(NULL); ios::sync_with_stdio(fa..
[C++] 백준 17404번: RGB거리 2 https://www.acmicpc.net/problem/17404 17404번: RGB거리 2 첫째 줄에 집의 수 N(2 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 각 집을 빨강, 초록, 파랑으로 칠하는 비용이 1번 집부터 한 줄에 하나씩 주어진다. 집을 칠하는 비용은 1,000보다 작거나 www.acmicpc.net 전형적인 DP 유형의 문제다. 하지만 거기서 조금만 더 생각해야 했던 문제. 첫 번째 집을 어떤 색으로 칠했냐에 따라 마지막 집의 색이 제한된다. 그래서 나는 첫 집을 빨간색, 초록색, 파란색으로 칠했을 경우로 나누어 계산했다. 매 번 배열을 INF로 초기화 한 뒤, 앞 단계에서의 최솟값을 찾는 방식이다. #include using namespace std; #defi..
[C++] 백준 1806번: 부분합 https://www.acmicpc.net/problem/1806 1806번: 부분합 첫째 줄에 N (10 ≤ N < 100,000)과 S (0 < S ≤ 100,000,000)가 주어진다. 둘째 줄에는 수열이 주어진다. 수열의 각 원소는 공백으로 구분되어져 있으며, 10,000이하의 자연수이다. www.acmicpc.net 골드4라기에는 난이도가 쉬운 편인 것 같다. 두 포인터라는 알고리즘 분류로 돼 있다. 나는 이름만 보고는 흔히 생각하는 start와 end를 0부터 N - 1까지 각각 훑는 O(N^2) 알고리즘인가 싶었다. 하지만 검색해서 알아보니 O(N) 알고리즘이었다. https://ssungkang.tistory.com/entry/Algorithm-Two-Pointers-%ED%88%AC-%E..
[C++] 백준 1197번: 최소 스패닝 트리 https://www.acmicpc.net/problem/1197 1197번: 최소 스패닝 트리 첫째 줄에 정점의 개수 V(1 ≤ V ≤ 10,000)와 간선의 개수 E(1 ≤ E ≤ 100,000)가 주어진다. 다음 E개의 줄에는 각 간선에 대한 정보를 나타내는 세 정수 A, B, C가 주어진다. 이는 A번 정점과 B번 정점이 www.acmicpc.net CLASS 5에 진입하면서 새로운 알고리즘이 대거 등장하고 있다. 주어진 문제의 풀이를 스스로 생각하여 고안하기 보다는 새로운 알고리즘을 익히는 느낌으로 진행 중... 이번 문제는 다음 블로그의 글을 참고했다. https://gmlwjd9405.github.io/2018/08/28/algorithm-mst.html [알고리즘] 최소 신장 트리(MST,..
[C++] 백준 13172번: ∑ https://www.acmicpc.net/problem/13172 13172번: Σ 모듈러가 11에서 1,000,000,007이 되어 답이 달라졌지만, 역시 3을 곱한 다음 1,000,000,007으로 나눈 나머지는 7이 된다. www.acmicpc.net 문제 이해를 실패했다. 다른 사람의 블로그 글을 보고도 이해를 하지 못 했다. 다만, 여러 번 쉬는 시간을 가지고 시간이 좀 지난 후 다시 보니 무엇을 해야 하는지 이해가 됐다. 내가 이해한 것은 다음과 같다. 1. 주사위의 면의 개수와 각 면에 적힌 수들의 합이 N, S로 주어진다. 2. 각 주사위에 대한 기대값은 분수로 나타낼 수 있다. 3. 모든 주사위에 대한 기대값은 각 주사위에 대한 기대값의 합으로 나타낼 수 있다. 4. 모든 주사위에 대한..
[C++] 백준 10830번: 행렬 제곱 https://www.acmicpc.net/problem/10830 10830번: 행렬 제곱 크기가 N*N인 행렬 A가 주어진다. 이때, A의 B제곱을 구하는 프로그램을 작성하시오. 수가 매우 커질 수 있으니, A^B의 각 원소를 1,000으로 나눈 나머지를 출력한다. www.acmicpc.net 과거에 이와 비슷한 문제를 푼 적이 있다. 그 때도 동일한 방법으로 문제를 해결했었는데, 그 때는 다른 블로그의 답안을 참고했었다. 분할정복법을 이용하여 O(log N) 시간에 문제를 해결할 수 있다. 입력이 최대 100,000,000,000으로 꽤 큰 수이지만 log_2(100,000,000,000) = 36.5밖에 되지 않으므로 시간초과가 나지 않는다. 같은 이유로 함수의 반환 형식을 vector로 남발해도..