본문 바로가기

BOJ/C++

(202)
[BOJ] 9466. 텀 프로젝트 *사이클이 존재함을 알 수 있어야 한다. *그와 동시에 팀에 몇명이 포함되는지도 알아야 한다. *팀에 속하지 못한 인원이 몇명인가 -> n- (팀에 속한 인원) *part[] -> 팀원으로 택한 학생의 인덱스 (입력값) chk[] -> 처음 시작한 학생의 인덱스 (사이클이 존재함을 알아낸다. -> 내가 처음 dfs를 시작했는데 다시 나를 택한 사람이 있다? -> 사이클) seq[] -> 팀내의 불린 순서 (최종 인원을 알아내기 위해서 depth를 저장한다) 2 5 4 5 2 1번 -> 2번 호출 (chk[1] : 1, seq[1] = 0) 2번 -> 5번 호출 (chk[2] : 1, seq[2] = 1) 5번 -> 2번 호출 (chk[5] : 1, seq[5] = 2) --> 2번이 2번 호출됐을 때 c..
[BOJ] 13911. 집 구하기 *다익스트라 문제 *시작 정점은 각 맥도날드와 스타벅스의 정점들 (시작 정점은 dist[]를 0으로 초기화하는 것을 잊으면 안된다) *다익스트라를 두 번 실행한다. (맥도날드를 기준으로 각 집들까지의 거리 / 스타벅스를 기준으로 각 집들까지의 거리) *dist배열을 2차원 혹은 두 개를 만들어서 함수를 실행할 때 파라미터로 보내준다. (맥도날드 / 스타벅스를 기준으로 최단거리 저장) *다익스트라의 결과로 받아낸 dist1 , dist2 배열의 값 중 각 집에서 x, y 값 이하의 거리에 있는 맥도날드와 스타벅스까지 거리의 합의 최소가 정답이다. #include #include #include #include #include #define INF 987654321 #define MAXX 10001 usin..
잃어버린 괄호 *최소값을 만들기 위해서는 -연산자가 나오는 지점 이전(prev) 숫자들은 모두 더하고, 이후 (back) 숫자들은 모두 뺀다. #include #include #include using namespace std; int main() { ios_base::sync_with_stdio(false); cin.tie(0); string s; cin >> s; int pivot = 0, cnt = 0; bool flag = false; for (int i = 0; i < s.size(); i++) { if (!('0'
배달 *visited를 4차원 배열로 선언 X좌표 / Y좌표 / 방향 / S와 C를 방문한 상태 *상태표시는 비트마스크를 사용해서 S까지 총 2^3개를 만들면 된다. *C에 도착했을 때 status가 111 이면 배달을 마친 상태이다. (최소값 찾기) *큐에는 4가지 정보를 모두 저장해서 이전에 방문했던 방향으로 다시 가지 않도록 한다. #include #include #include #include #define INF 987654321 using namespace std; int n, m, ans = INF; char map[51][51]; typedef pair pp; pp start, dest1, dest2; int dx[5] = { 0,0,0,-1,1 }, dy[5] = {0, -1,1,0,0 }; ..
적록색약 *RGB에 따라 구역을 라벨링한다. (적록색약이 아닌 사람이 보는 영역들) *G-> R로 바꾼 후에 구역을 라벨링한다. (적록색약인 사람이 보는 영역들) *맵을 변경하지 않고 인접하는 영역 중 RG인 것들을 만나면 영역의 개수를 줄여주는 방식으로 풀려고 했는데 (주석처리된 부분) 왜 안되는 지 모르겠다.. #include #include #include using namespace std; int n; char map[101][101]; bool visited[101][101]; int dx[4] = { -1,1,0,0 }, dy[4] = { 0,0,-1,1 }; void dfs(int x, int y, char now, int label) { if (visited[x][y]) return; visite..
사탕게임 *(0,0)부터 차례대로 순회하면서 동쪽, 남쪽의 사탕들과 자리를 바꾼다. (swap) *바꾼 상태에서 맵을 쭉 살펴보면서 가장 긴 수열이 나오는지 확인한다. (바뀐 부분이 속한 행과 열만 살펴보게 되면 예외케이스를 처리할 수 없다. 다른 곳에서 예기치 못하게 긴 수열이 나올 수 있기 때문에) #include #include #include #include using namespace std; int n; char map[51][51]; int dx[2] = { 1,0 }, dy[2] = { 0,1 }; int cdx[4] = { -1,1,0,0 }, cdy[4] = { 0,0, 1,-1 }; typedef pair pp; bool visited[51][51]; int check() { memset(vi..
좋은 단어 *뒤에 나와 같은 단어가 나오면 그 다음다음 단어를 본다. (j++) -> 스택에 넣을 필요 없음 *뒤에 다른 단어가 나오면 스택에 넣는다. (만약, ABBA 이렇게 있다면 AA는 BB를 둘러싼 형태이기 때문에 스택에는 ABB까지 봤을 때 스택에는 A만 들어가있는 상태일 것이다. 위 조건으로 BB가 사라지고 나면 마지막 단어인 A가 나왔을 때 스택에 있는 A와 일치하기 때문에 좋은 단어이다.) *단어의 끝까지 봤을 때 스택이 비어있다면 좋은 단어, 아니라면 res-- #include #include #include using namespace std; int main() { ios_base::sync_with_stdio(0); cin.tie(0); int n; cin >> n; int res = n; f..
동전2 *dp 배열을 2차원으로 정의하는데, dp[i][j] = i번째 동전을 이용해서 j원을 만드는데 사용하는 최소 동전 사용 횟수 *동전들을 오름차순으로 정렬한다. *제일 가치가 작은 동전이 k보다 크면 불가능한 경우이다. (-1) *2차원 반복문에서 1원부터 k원까지 확인하는데, 각 조합을 구하는 경우가 3가지로 나뉘어진다. 1. i원이 j번째 동전으로 나뉘어 떨어질때 -> i/coin[j] 가 최소가 될 수 있다. 2. j번째 동전을 사용했을 때 -> dp[j][i-coin[j]]+1 3. j번째 동전을 사용하지 않았을 때 -> dp[j-1][i] 테스트케이스 3 13 1 5 12 ans = 2 2 100 7 8 ans = 13 3 24 1 7 10 ans = 3 3 15 1 5 12 ans = 3 3 ..