[C++] 백준/Gold/17404. RGB거리 2
·
C++/Algorithm
문제 링크https://www.acmicpc.net/problem/17404문제 분석비슷한 유형의 RGB 거리보다 조금 더 심화된 DP 문제라고 할 수 있다.이전 문제에서 각 1번째 집의 색깔이 마지막 집(N-1)의 색과 동일하면 안 된다는 조건이 추가된 응용 버전인데, 시작을 1번째 집의 색깔을 R, G, B로 선택했을 때 각각에 대한 DP 배열을 이전 문제와 같이 채우면 되는 문제이다.DP 배열 구성DP 배열의 크기는 3(1번째 집의 색깔을 고르는 경우의 수) * n * 3이다.1번째 집의 색을 R로 선택했을 때의 경우를 예로 들면, 2번째 집에서는 1번째 집의 G, B에 해당하는 값을 선택하면 안 된다.여기서 아이디어가 필요한데, 본인은 DP 배열에서 1번째에서 선택한 집을 제외한 나머지를 임의의 ..
[C++] 백준/Gold/2239. 스도쿠
·
C++/Algorithm
문제 개요문제 링크: 스도쿠 (2239)9x9 스도쿠 퍼즐을 완성하는 전형적인 백트래킹 문제.입력에서 0은 빈 칸을 나타내며, 이 빈 칸에 1부터 9까지 숫자를 채워야 한다.사전순 출력: 가장 먼저 완성된 스도쿠를 출력. 문제 접근이번 문제는 전형적인 백트래킹 문제로, 빈 칸에 가능한 숫자를 하나씩 채워넣으면서 모든 경우를 탐색하는 방식으로 해결할 수 있다.다만 이번 문제는 입력이 9x9의 문자열 형태로 주어지기 때문에, 이를 처리하여 숫자로 변환하고,각 빈 칸의 좌표를 따로 저장하여 백트래킹을 효율적으로 수행할 필요가 있다.아래 코드는 입력을 처리하는 부분과 백트래킹의 구조를 살펴본다.for (int i = 0; i > s; for (int j = 0; j 여러 백트래킹 문제를 풀어보면서 느낀 점..
[C++] 백준/Gold/17069. 파이프 옮기기 1/2
·
C++/Algorithm
파이프 옮기기 문제 정리 및 풀이문제 개요파이프 옮기기 1: nn의 최대 크기가 16으로, 단순한 탐색 알고리즘으로도 풀이 가능.파이프 옮기기 2: nn의 최대 크기가 32로, 단순 탐색은 시간 초과 발생.두 문제는 기본적인 로직은 동일하지만, 입력 크기에 따라 효율적인 접근 방식이 필요하다. 파이프 옮기기 1 (탐색 방식)탐색 방식으로 모든 경로를 BFS로 탐색하여 풀이한다.탐색할 때 파이프의 세 가지 상태(가로, 대각선, 세로)를 기준으로 이동 가능 여부를 판단한다.코드 설명BFS 탐색queue를 이용해 파이프의 현재 상태를 관리한다.이동 가능한 위치를 계산하고, 조건을 만족하는 경우 dpdp 배열에 이동 경로를 추가한다.결과 출력dp[n−1][n−1]dp[n-1][n-1]: 도착점까지의 경로 수 출..
[C++] 백준/Silver/9184. 신나는 함수 실행
·
C++/Algorithm
[Silver II] 신나는 함수 실행 - 9184문제 설명지문에 주어진 의사 코드 형태의 재귀 함수를 구현해서 (a, b, c) 값에 따른 결과를 출력하는 문제다.하지만, 재귀 함수를 그대로 돌리면 당연히 타임아웃이 날 게 뻔하므로, 다른 방법을 생각해야 한다. 첫 번째 조건 확인먼저, 지문에서 다음 조건을 확인할 수 있다:if a 이 조건은 a, b, c 중 하나라도 0 이하일 때, 결과가 항상 1이라는 것을 의미한다.이 부분은 간단히 처리 가능하다.DP 문제임을 파악하기이 문제를 풀 때 DP 문제라는 걸 눈치챌 수 있는 포인트는 지문이 짧고 이전 값을 재활용하는 식이 들어가 있다는 점이다.보통 이런 문제는 DP로 접근하면 된다.재귀 호출로 매번 계산하면 시간 초과가 날 게 뻔하기 때문에, DP 배열..
[OPEN GL] 프로젝트 시작 전 사용 설정
·
C++
sanf_s 경고 문제 해결 프로젝트 속성 → C/C++ → 일반 → SDL검사 = 아니요 include 및 lib 이동 후 경로 설정 프로젝트 속성 → C/C++ → 일반 → 추가 포함 디렉터리 = ./include 프로젝트 속성 → 링커 → 입력 → 추가 종속성 = glew32.lib, glut32.lib 프로젝트 속성 → 링커 → 일반 → 추가 라이브러리 디렉터리 = ./lib "const char *" 형식의 값을 사용하여 "char *" 형식의 엔터티를 초기화할 수 없습니다. 오류 해결 프로젝트 속성 → C/C++ → 언어 → 준수 모드 = 아니요
[Open GL] v/vt/vn 형식 OBJ 읽어오기
·
C++
온라인에서 쉽게 다운받을 수 있는 OBJ 파일의 f값들은 대게 v v v형식이 아니라 v/vt/vn 형식으로 이루어져있다. 그것도 3개의 v/vt/vn로 구성되어 있는 것이 아니라 v/vt/vn이 3개일수도 4개일수도 있다. 일반적인 OBJ파일은 위와 같은 형태로 OBJ의 face들이 3개 또는 4개의 v/vt/vn 형태로 구성되어 있는데 각각 v = vertex의 인덱스, vt = 텍스쳐, vn = 노말 정점 인덱스로 구성되어 있으며 오늘 알아볼 내용은 v/vt/vn 중 v값만을 사용하여 OpenGL에서 OBJ파일을 읽는 방법에 대해 알아보자 while (fgets(line, 256, fp) != NULL) { if (line[0] == 'f') { string line_s(line); vector d..
Laplace equation in c++
·
C++
for(int i = 0; i < lattice.size(); i++){ for(int j = 0; j < lattice.[0].size(); j++){ potential = 0.25 * (lattice[j + 1][i] + lattice[j - 1][i] + lattice[j][i - 1] + lattice[j][i + 1]); } } C++에서 라플라스 방정식을 간단하게 구현한 코드이다. N*N의 Grid에서 상 하 좌 우에 해당하는 위치의 값을 더한 뒤 그 수만큼 1/n하여 나누어서 계산한다. 본인은 N*N의 Grid에서 해당 방정식을 사용하여 물리기반 번개 시뮬레이션을 하는데 사용하였다.
Mesh smoothing with cotangent weight
·
C++
각 Vertex에 대한 cotangent weight를 구하여 Laplace smooting를 적용해보자 Vec3 v1 = pos - vertices[i]->neighbor_vertices[p_prev]->pos; Vec3 v2 = vertices[i]->neighbor_vertices[j]->pos - vertices[i]->neighbor_vertices[p_prev]->pos; Vec3 v3 = pos - vertices[i]->neighbor_vertices[p_next]->pos; Vec3 v4 = vertices[i]->neighbor_vertices[j]->pos - vertices[i]->neighbor_vertices[p_next]->pos; double cotan_a = (v1.Dot(..