일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 백준
- 물채우기
- Docker
- 오퍼레터
- BFS
- 성적평가
- BOJ
- upper_bound
- 기술면접
- 처우산정
- dfs
- Kafka
- OFFSET
- @P0
- 이분탐색
- 파라메트릭
- 연결요소
- 매개변수탐색
- msSQL
- 백트래킹
- incr
- 처우협의
- 6987
- softeer
- 소프티어
- 13908
- 퇴사통보
- compose
- 경력
- boj #19237 #어른 상어
- Today
- Total
목록알고리즘 문제 (501)
기술 블로그
https://www.acmicpc.net/problem/1113 핵심은 높이를 2부터 입력된 최대 높이까지 각각 하나씩 채워주는 것이다. main() 함수 내의 for문 h의 의미는 "h보다 작은 곳을 찾아 높이를 딱 h까지 채우겠다."라는 의미로 해석하면 된다. 또한, dfs가 수행될 때, 바깥 쪽(행과 열이 0 또는 R - 1 또는 C - 1)일 때는 바깥 쪽으로 흘러내리므로, 이때는 답 구하는 연산에 셈하지 않는다.(bool형 변수인 stop 활용하였음) 1. 입력된 값들 중 최댓값 구하기(최대 높이 = H) 2. 2 ~ H 각각 수행 → h 3. h보다 미만인 곳을 찾아 vector에 넣어준다. 4. vector를 활용하여, dfs 수행 5. 바깥 쪽일 경우 답 구하는 연산에서 제외 6. 바깥 ..
https://www.acmicpc.net/problem/2665 처음에는 단순 queue로 구현했다가, 예제 1번의 답이 계속 5로 나왔다. 문제를 잘 읽어보면 검은 방에서 흰 방으로 바꾸어야 할 최소의 수를 구하는 프로그램을 작성하시오. 라고 쓰여있는데, 이는 '검은 방'은 최대한 피해서 가야한다는 의미이다. 즉, 검은 방과 흰 방 중 우선순위가 더 높은 방은 흰 방이다. 이 부분에서 힌트를 얻어, queue말고 deque로 구현한다. 다음에 이동할 방이 검은 방 → deque의 맨 뒤(우선순위가 낮으므로) 다음에 이동할 방이 흰 방 → deque의 맨 앞(우선순위가 높으므로) #include using namespace std; #define MAX 55 int n, m[MAX][MAX]; int ..
https://www.acmicpc.net/problem/2810 핵심은 제일 끝 쪽(오른 쪽 끝)에 있는 사람은 오른쪽부터 먹는다. 그 이후이 사람은 왼쪽을 먹는다. "S"와 "LL" 파싱 없이 할 수 있을 것 같은데 그냥 파싱해봄 #include using namespace std; int n; string s; int main() { //freopen("C:\\Users\\park7\\Desktop\\lazy_bronze\\2.in", "r", stdin); cin.tie(0); cin >> n >> s; int len = s.length(); string ps = ""; vector v; // "S"와 "LL"을 파싱하여 vector v에 담음. for (int i = len - 1; i >= 0..
https://www.acmicpc.net/problem/1525 문자열 처리 + bfs 방문처리는 문자열로 처리해준다. 문자열에 대한 방문처리는 set이 좋다. #include using namespace std; string s = "", goal = "123456780"; int dy[4] = { 1, 0, -1, 0 }; int dx[4] = { 0, 1, 0, -1 }; set st; int bfs() { queue q; q.push(s); st.insert(s); int ret = 0; while (!q.empty()) { int qs = q.size(); while (qs--) { string now = q.front(); q.pop(); if (now == goal) { return ret..
https://www.acmicpc.net/problem/2571 문제 풀이 1. 높이 누적합 2. 한 좌표(r, c)에 대해서 모든 경우의 수에 따른 사각형 넓이 구하기(simulation, getValue 함수) 3. 높이(세로)와 가로 길이 구할 때 조심. 높이는 항상 최솟값. 높이 : 그 열의 맨 아래에 있는 좌표값 + 1 - 자신의 현재 좌표 값 가로 : (r, c) ~ (r, j)에 해당 하는 단순 가로의 길이이므로, j - c + 1 #include using namespace std; #define MAX 101 int n, ans, p[MAX][MAX]; void draw(int r, int c) { for (int i = r; i < r + 10; i++) { for (int j = c..
https://www.acmicpc.net/problem/1953 이분 그래프 문제이다. 참고 문제 : https://www.acmicpc.net/problem/1707 참고 풀이 : https://hsdevelopment.tistory.com/74 #include using namespace std; #define MAX 101 int N, M, T; vector v[MAX]; vector a, b; int color[MAX]; bool go(int now, int next) { for (auto i : v[now]) { if (i == next) { return false; } } return true; } void dfs(int vertex, int nodeColor) { color[vertex] ..
https://www.acmicpc.net/problem/17836 1. 방문 처리할 때, 그람을 먹었는지와 아직 먹지 않았는지 2가지를 따져야한다. 즉, 3차원 방문 처리 2. 제한시간인 T시간을 고려하여 구현한다. 그냥 현재 그 순간의 시간(d)을 활용하여 T와 비교하면 된다. 도착했을 때, 이제 먹으려고 할 때 d vs T #include using namespace std; #define MAX 101 typedef struct{ int r, c, g, d; }info; int N, M, T; int m[MAX][MAX]; int dy[4] = { 0, 1, 0, -1 }; int dx[4] = { 1, 0, -1, 0 }; bool used[MAX][MAX][2]; // 0 : 그람을 먹지 않았..
https://www.acmicpc.net/problem/16493 냅색 #include using namespace std; int N, M, cache[201][21]; vector v; int ks(int goal, int idx) { if (idx == M) { return 0; } int& ret = cache[goal][idx]; if (ret != -1) return ret; ret = ks(goal, idx + 1); if (goal - v[idx].first >= 0) { ret = max(ret, ks(goal - v[idx].first, idx + 1) + v[idx].second); } return ret; } int main() { //freopen("C:\\Users\\park7..