본문 바로가기

나는 오늘,

(371)
[BOJ] 11723. 집합 *비트마스킹을 사용한다. 2019/05/20 - [Computer Science/STL] - 비트마스크 (해당 비트 조회/ 값 바꾸기) 비트마스크 (해당 비트 조회/ 값 바꾸기) jayrightthere.tistory.com #define _CRT_SECURE_NO_WARNINGS #include #include #include using namespace std; int main() { int status = 0; char op[10]; int t; scanf("%d", &t); while (t--) { int n; scanf("%10s %d", op, &n); switch (op[0]) { case 'a': { if (op[1] == 'd') { status |= (1
[BOJ] 10972, 10973 다음 순열 / 이전 순열 *이전 순열의 경우에는 맨 뒤의 인덱스부터 이전 인덱스와 비교하면서 뒤쪽에 나보다 작은 수가 존재하는 경우가 자리를 바꾸는 경우이다. -> 4 자리의 순열일 경우 1 2 3 4 라면 0번 인덱스의 값인 [1]이 가장 작은 값이므로 뒤에 이보다 작은 값이 없다. 즉, 가장 처음 순열이라는 것이다. *이런 특성을 이용해서 idx를 찾는다. *이 idx와 자리를 바꿀 인덱스를 찾아야 한다. 바로 이전이라고 했기 때문에 idx보다 뒤에 있으면서 큰 수를 찾아야 한다. n부터 idx까지 비교하면서 idx의 값보다 작으면서 가장 뒤에있는 수를 찾는다. 4 2 1 3 일 때 idx는 2가 된다. (바로 뒤에 1이라는 작은 수가 있기 때문에) idx2는 2보다 뒤에 있으면서 2보다 작은 수인 1이 된다. *여기까지 i..
[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..