본문 바로가기

problem solving

(93)
7576번: 토마토 BFS를 이용해서 쉽게 풀 수 있는 문제. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 #include #include #include typedef struct { int y, x; } dif; dif dir[4] = { {1, 0}, {-1, 0}, {0, 1}, {0, -1} }; int check[1001][1001] = { 0 }; int map[1001][1001] = { 0 }; int main(void) { std::ios_base::sy..
6588번: 골드바흐의 추측 시간초과를 해결하는게 관건인 문제다. 우선은 에라토스테네스의 체를 이용해 홀수 소수를 구한다. 이후 가장 큰 b - a를 구하기위해 범위내의 가장 작은 홀수 소수(front)와 가장 큰 홀수 소수(end)부터 시작하여 더한 값이 주어진 값보다 크다면 end를 한칸 줄이고 주어진 값보다 작다면 front를 한칸 늘린다. 이런식으로 front값이 end값보다 작을 때까지 반복하면 답이 구해진다. 단! 1000000이라는 넓은 범위로 인해 탐색하는데 상당히 소요되므로 lower_bound를 통해 주어진 값보다 큰 인덱스를 구해서 end값에 넣어준다. #include #include #include int check[1000001] = { 0 }; int main(void) { std::ios_base::syn..
4949번: 균형잡힌 세상 스택구조를 이용해 문제를 풀었다. 일반 문자는 무시하고 괄호가 나올 때마다 조건을 걸었는데, 순서대로 문자를 순회하다 닫히는 괄호가 나왔을 때 스택의 탑이 동일한 쌍{ ( (, ) ), ( [, ] ), ( {, } )}이 아니라면 no를 출력할 수 있도록 했다. 마지막까지 정상적으로 열고 닫는게 완료되면 yes가 출력된다. #include #include int main(void) { std::ios_base::sync_with_stdio(0); std::cin.tie(0); char str[110] = { NULL }; while (true) { std::cin.getline(str, 110, '\n'); if (str[0] == '.') { break; } std::stack mS; for(int ..
3108번: 로고 (5, 5) ~ (8, 8)인 직사각형과 (6, 6) ~ (7, 7)인 직사각형이 있을 때 붙어있는지 구분하기가 힘들다. 그래서 각 좌표값에 *2를 해서 문제를 풀기 수월하도록 만들었다. 답을 구하기 위해서 DFS를 이용해 겹쳐진 직사각형이 몇개인지 구하고, 기준 좌표에 직사각형이 존재한다면 -1을 해서 답을 도출해냈다. #include typedef struct { int y, x; } dif; dif dir[4] = { {1, 0}, {-1, 0}, {0, 1}, {0, -1} }; int map[2001][2001] = { 0 }; int check[2001][2001] = { 0 }; void swap(int *a, int *b) { int temp = *a; *a = *b; *b = *a; } ..
2667번: 단지번호붙이기 DFS로 탐색하면서 단지에 각 집마다 checkNum을 +1한다. 한단지가 종료되면 checkNum을 +1한다. 전체 탐색이 완료된 후 정렬을 통해 오름차순으로 세우고 답을 출력한다. #include #include #include typedef struct { int y, x; } dif; dif dir[4] = { {1, 0}, {-1, 0}, {0, 1}, {0, -1} }; int count[1000] = { 0 }; int check[30][30] = { 0 }; int size; std::string map[30]; void DFS(int checkNum, int y, int x) { if (check[y][x]) { return; } count[checkNum]++; check[y][x] =..
[미해결]2632번: 피자판매 도데체 어디서 틀리는지 모르겠다... 찾을 수 있으려나 #include #include #include int main(void) { std::ios_base::sync_with_stdio(false); std::cin.tie(NULL); int size; std::cin >> size; int aLen, bLen; std::cin >> aLen >> bLen; std::vector aVal(aLen), bVal(bLen); for (int i = 0; i > aVal[i]; } for (int i = 0; i > bVal[i]; } std::vector aSum; for (int front = 0; front
2579번: 계단 오르기 10번이 넘는 실패를 겪었다. dp문제는 정말 너무 사악하다. 얼마나 많이 풀어봐야 적응할 수 있을까?... #include #include #include long long dp[310] = { 0 }; int main(void) { int len; std::cin >> len; std::vector val; for (int i = 0; i > temp; val.push_back(temp); } //std::reverse(val.begin(), val.end()); if (val.size() > 2) { dp[0] = val[0]; dp[1] = val[0] + val[1]; dp[2] = val[1] + val[2] > val[0] + val[2] ? val[1] + val[2] : val[0] + ..
2331번: 반복수열 (수열이 반복되는 지점까지의 이동횟수 - 처음으로 반복되는 지점부터 왕복하는데 이동횟수)를 계산하면 답을 구할 수 있다. #include #include int check[1000000] = { 0 }; int square(int n, int degree) { int ans = n; for (int i = 0; i