728x90
반응형

알고리즘 258

백준, BOJ, 1753번, 최단경로 : C++ [CPP] ★★★★★

어렵다. 다익스트라를 배웠지만 코딩테스트에서 다시 쓰니까 어렵다 https://www.acmicpc.net/problem/1753 #맞은 풀이 #include #include #include #include #include #define INF INT_MAX using namespace std; int V,E,start; //벡터를 원소로 가지는 배열 -> vector adj[20001]; // 인접행렬 from,(weight,to) //-> adj[1] = {3,5} 의 의미 1번 정점에서 5번으로 가는 가중치 3 //이런 그래프에서 최단거리 => 다익스트라 테이블 int table[20001]; //최소 간선을 위한 minHeap {거리, 정점 번호} -> 일반적으로 first를 기준으로 오름차순으로..

백준, BOJ, 16637번, 괄호추가하기 : C++ [CPP]

어려웠다. 사실 생각은 났는데 작성하기가 힘들다. 아직 구현하는 능력이 부족하다. 100문제밖에 안풀었는데 잘하길 바라는 것은 사치겠지 더군다나 시간제한이 있는 것으로 봐선.. 어려워보였지만 다행히 20개가 넘는 식은 안나와서 풀 수 있었다. https://www.acmicpc.net/problem/16637 #맞는 풀이 #include #include #include #include using namespace std; int N; string s; int ans_M = INT_MIN; //괄호를 씌웠을 때, 안씌웠을 때 모두 조사해본다. //괄호에 의해서만 연산 순서가 정해진다 (모두 연산 순위 같음) //연산 int operation(int a, int b, char c){ int result; /..

백준, BOJ, 1543번, 문서 검색 : C++ [CPP]

어렵지 않았다 다만 첫번째로 못풀었다. 왜 그런지 고찰해보자 https://www.acmicpc.net/problem/1543 #맞은 풀이 #include #include using namespace std; int main() { string s; string target; getline(cin, s); getline(cin, target); int size = target.size(); int cnt = 0; while (1) { int idx = s.find(target); //찾았으면 해당 문자열에서 삭제 if (idx != string::npos) { auto it = s.begin() + idx; //s.erase(it, it+size); -> 삭제 s = s.substr(idx + size)..

백준, BOJ, 2503번, 숫자야구 : C++ [CPP]

이것도 어렵다. 사실 BruteForce문제는 어렵다. 우리 머리 속에서 생략한 계산을 표현할 줄 알아야 하기 때문이다. 우리는 왜 숫자야구를 할 수 있을까? 왜 이것은 후보가 아닐까를..? 표현할 수 있어야 한다. 알아보자 https://www.acmicpc.net/problem/2503 #맞는 풀이 #include #include #include using namespace std; int N; // 주어진 힌트 수 bool num[1001]; int main(){ cin >> N; fill(num, num+1001, true); // 처음엔 숫자모르니까 다 정답의 후보 //하지만 같은 숫자가 있으면 후보가 될 수 없음. for (int i = 100; i n >> st >> b; string s =..

백준, BOJ, 1120번, 문자열 : C++ [CPP]

사실 이것은 정말 직관을 요하는 문제다. 브루트포스에 있지만.. 정말 브루트포스처럼 전수조사인지는 의문이다. https://www.acmicpc.net/problem/1120 #맞는 풀이 #include #include #include #include using namespace std; int main(){ string a; string b; cin >> a >> b; int lengthA = a.size(); int lengthB = b.size(); int numToAdd = lengthB-lengthA; int m = INT_MAX; // 최솟값 //lengthA에 대해서 lengthB의 어느 부분이랑 가장 매치가 되는지 //-> 가장 맞는 부분을 구한다면 해당 부분에서의 차이가 곧 전체의 차이임..

백준, BOJ, 1194번, 달이 차오른다 가자 4 : C++ [CPP] ******

할 말이 아주 많다. 어려웠다. 처음에 6가지 상태를 어떻게 표현하지.. 하다 차원이 무지막지하게 늘어나길래.. 이게 아닌가?? 하다가... 비트라는 힌트를 얻어서 풀었다. 잠잘 때도 어떻게 풀지 하다가.. 비트라는 힌트만 보고 머릿속으로 생각하고 오늘 바로 풀었다. 기분이 좋다. https://www.acmicpc.net/problem/1194 #맞는 풀이 #include #include #include #include #include //bit 연산을 위함 #define SIZE 50 using namespace std; int dx[4] = { -1,1,0,0 }; int dy[4] = { 0,0,-1,1 }; //key를 비트로 표현하자. 000000 -> 6비트로 표현가능 6가지 상태 저장가능 ..

백준, BOJ, 16946번, 벽 부수고 이동하기 4 : C++ [CPP]

1000* 1000의 탐색은 쉽게 시간초과가 된다는 것을 충분히 인지해야 한다. 그래서 어려웠다. 1000* 1000 사이즈의 노드에서 하나씩 BFS하는 것은 (1000 * 1000) 에 대해 (1000*1000) 을 수행하는 것과 같다. 즉, 시간초과다. https://www.acmicpc.net/problem/16946 #맞는 풀이 #include #include #include #include #include #define X first #define Y second #define SIZE 1000 using namespace std; int dx[4] = { -1,1,0,0 }; int dy[4] = { 0,0,-1,1 }; int r, c; //행, 열 char given[SIZE][SIZE];..

백준, BOJ, 16933번, 벽 부수고 이동하기 3 : C++ [CPP]

벽을 부수다가 기다릴 줄도 알아야한다는 것이 조금 까다롭다. https://www.acmicpc.net/problem/16933 #맞는 풀이 #include #include #include #define X first #define Y second #define SIZE 1000 using namespace std; int dx[4] = { -1,1,0,0 }; int dy[4] = { 0,0,-1,1 }; char arr[SIZE][SIZE]; //입력 int visited[SIZE][SIZE][11]; // 0 벽을 안깼다, 1 개깼다 .. 10개 깼다. int r, c, crush; typedef struct Position { int x; int y; int wall; int waiting; //..

백준, BOJ, 14442번, 벽 부수고 이동하기 2 : C++ [CPP] ****

벽을 여러개 부술 때이다. 1을 풀었다면 어떻게 해야할 지 알것이지만 벽만 바꾸는 것이 아니라 방문 조건도 바뀐다. 밑에서 조금 더 설명해보자 https://www.acmicpc.net/problem/14442 #맞는 풀이 #include #include #include #define X first #define Y second #define SIZE 1000 using namespace std; int dx[4] = { -1,1,0,0 }; int dy[4] = { 0,0,-1,1 }; char arr[SIZE][SIZE]; //입력 int visited[SIZE][SIZE][11]; // 0 벽을 안깼다, 1 개깼다 .. 10개 깼다. int r, c, crush; typedef struct Posi..

백준, BOJ, 2573번, 빙산 : C++ [CPP]

어려웠다. 조건이 많았기 때문이다. https://www.acmicpc.net/problem/2573 #맞는 풀이 #include #include #define X first #define Y second using namespace std; int dx[4] = { -1,1,0,0 }; int dy[4] = { 0,0,-1,1 }; int R, C; int curMap[300][300]; int nextMap[300][300]; int year = 0; int visited[300][300]; //dfs를 위함 void melting(int x, int y) { int cnt = 0; //주변 바다의 칸 for (int dir = 0; dir < 4; dir++) { int nx = x + dx[dir..

728x90
반응형