-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
1eeea34
commit ce055ec
Showing
10 changed files
with
280 additions
and
4 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,5 +1,5 @@ | ||
{ | ||
"files.associations": { | ||
"queue": "cpp" | ||
} | ||
{ | ||
"files.associations": { | ||
"queue": "cpp" | ||
} | ||
} |
Binary file not shown.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,37 @@ | ||
#include<iostream> | ||
#include<queue> | ||
using namespace std; | ||
int dt[100001]; // 시간(몇초)를 저장하는 배열,인덱스는 수빈이가 있는 위치이다. | ||
int k[3] = { -1,1}; //-1,1의 위치이동을 더해주기위한 배열 | ||
queue<int>q; | ||
|
||
void bfs(int start, int end) { | ||
q.push(start); // 큐에 제일 처음 수빈이의 시작위치를 넣는다. | ||
while (!q.empty()) { | ||
int c = q.front(); //큐에서 위치를 꺼낸다. | ||
q.pop(); | ||
if (c == end) { //큐에서 꺼낸 위치가 동생의 위치일경우 | ||
cout << dt[end]; //동생을 찾은 위치에서의 최소시간을 출력 | ||
return; | ||
} | ||
for (int i = 0; i < 2; i++) { //c가 갈수있는 위치를 살펴본다(-1,+1) | ||
int d = c + k[i]; // -1,+1 의 위치이동을 해준값을 d에넣는다. | ||
if (d >= 0 && !dt[d] && d <= 100000) { // 방문하지 않은 위치이면 탐색을 진행한다. | ||
dt[d] = dt[c] + 1; //조건을 만족하면 방금탐색한위치의 시간을 그전 위치의시간 +1을 해준다. | ||
q.push(d); //bfs를위해 큐에 방금 탐색한위치를 넣는다. | ||
} | ||
} | ||
if (c * 2 <= 100000 && !dt[c * 2]) { //*2를 통한 탐색의 경우 | ||
dt[c * 2] = dt[c] + 1; //-1,1의경우와 동일 | ||
q.push(c * 2); | ||
} | ||
} | ||
} | ||
int main(void) { | ||
ios_base::sync_with_stdio(false); | ||
cin.tie(NULL); | ||
int start,end; | ||
cin >> start >> end; //수빈이의 현재위치와,동생의 현재위치를 입력받는다. | ||
bfs(start, end); | ||
return 0; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
s = input() | ||
|
||
stack = [] | ||
cnt = 0 | ||
|
||
for i in range(len(s)): | ||
if s[i] == '(': | ||
stack.append('(') | ||
else: | ||
if s[i-1] == ')': | ||
stack.pop() | ||
cnt+=1 | ||
else: | ||
stack.pop() | ||
cnt += len(stack) | ||
print(cnt) |
Binary file not shown.
Binary file not shown.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,85 @@ | ||
// BFS 골드 4 숨바꼭질 2 https://www.acmicpc.net/problem/12851 | ||
#include <iostream> | ||
#include <vector> | ||
#include <queue> | ||
|
||
using namespace std; | ||
|
||
int n, k; | ||
int dist[100001] = {0, }; | ||
bool visited[100001] = {0, }; | ||
|
||
void solve() { | ||
// 2개의 큐를 번갈아 사용하기 위한 큐 배열, 불리언 변수 | ||
priority_queue<int, vector<int>, greater<int>> q[2]; | ||
bool e = false; | ||
|
||
// 현재 탐색에서 탐색중인 위치를 저장 | ||
vector<int> visitedVec; | ||
|
||
q[e].push(n); | ||
dist[n] = 1; | ||
visited[n] = 1; | ||
|
||
if (n == k) { | ||
printf("0\n1"); | ||
return; | ||
} | ||
|
||
int time = 1, cnt = 0; | ||
|
||
while (true) { | ||
while (!q[e].empty()) { | ||
int cur = q[e].top(); | ||
|
||
q[e].pop(); | ||
|
||
for (int i : {cur - 1, cur * 2, cur + 1}) { | ||
if (i < 0 || i > 100000) continue; | ||
|
||
// 목표 위치에 도착한 경우 경우의 수 저장 | ||
if (i == k) cnt += dist[cur] + 1; | ||
|
||
// 첫 방문인 경우 다음 탐색 큐에 저장 | ||
if (!dist[i]) { | ||
q[!e].push(i); | ||
visitedVec.push_back(i); | ||
} | ||
|
||
// 방문한 위치에 현재 위치의 경우의 수 더하기 | ||
// 이전 탐색에서 탐색한 위치는 방문 안하도록 | ||
if (!visited[i]) | ||
dist[i] += dist[cur]; | ||
|
||
// 탐색 도중 숫자가 커지면 탐색을 종료, 탐색중 큐 비우기 | ||
if (cur > k) break; | ||
} | ||
|
||
// 숫자가 커져서 탐색을 종료하면 남은 큐는 비워주기 | ||
if (cur > k) { | ||
q[e] = priority_queue <int, vector<int>, greater<int>> (); | ||
break; | ||
} | ||
} | ||
|
||
if (cnt) { | ||
printf("%d\n%d", time, dist[k]); | ||
break; | ||
} | ||
|
||
// 이번 탐색에서 방문한 노드들 전부 표시 해주기 | ||
while (!visitedVec.empty()) { | ||
int v = visitedVec.back(); | ||
visitedVec.pop_back(); | ||
visited[v] = 1; | ||
} | ||
|
||
e = !e; | ||
time++; | ||
} | ||
} | ||
|
||
int main() { | ||
cin >> n >> k; | ||
solve(); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,68 @@ | ||
#include <iostream> | ||
#include <vector> | ||
|
||
using namespace std; | ||
|
||
int tomato[1000001] = {0, }; | ||
int dir[2] = {1, -1}; | ||
int total = 1, dimension = 0; | ||
vector<int> len; | ||
vector<int> redTomato[2]; | ||
bool curVector = false; | ||
|
||
bool isin(int a) { return a >= 0 && a < total; } | ||
|
||
int main() { | ||
for (int i = 0; i < 11; i++) { | ||
int t; cin >> t; | ||
if (t != 1) { | ||
len.push_back(t); | ||
total *= t; | ||
dimension++; | ||
} | ||
} | ||
|
||
int greenTomato = 0; | ||
for (int i = 0; i < total; i++) { | ||
cin >> tomato[i]; | ||
|
||
if (!tomato[i]) greenTomato++; | ||
else if (tomato[i] == 1) | ||
redTomato[curVector].push_back(i); | ||
} | ||
|
||
int day = 0; | ||
while (greenTomato > 0) { | ||
int lastGreenTomato = greenTomato; | ||
|
||
while (!redTomato[curVector].empty()) { | ||
int curPos = redTomato[curVector].back(); | ||
redTomato[curVector].pop_back(); | ||
|
||
int modular = total; | ||
for (int dim = dimension - 1; dim >= 0; dim--) { | ||
for (int v : dir) { | ||
int pos = curPos + (modular / len[dim]* v); | ||
|
||
if (isin(pos) && (curPos / modular == pos / modular) && !tomato[pos]) { | ||
tomato[pos] = 1; | ||
redTomato[!curVector].push_back(pos); | ||
greenTomato--; | ||
} | ||
} | ||
|
||
modular /= len[dim]; | ||
} | ||
} | ||
|
||
if (lastGreenTomato == greenTomato) { | ||
printf("-1\n"); | ||
return 0; | ||
} | ||
|
||
curVector = !curVector; | ||
day++; | ||
} | ||
|
||
printf("%d\n", day); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,70 @@ | ||
// 최단 경로 골드 3 웜홀 https://www.acmicpc.net/problem/1865 | ||
#include <iostream> | ||
#include <string.h> | ||
#include <vector> | ||
#include <queue> | ||
|
||
#define MAX 9999999 | ||
#define SIZE 502 | ||
#define fastio ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); | ||
|
||
using namespace std; | ||
|
||
struct edge { | ||
int s, e, v; | ||
}; | ||
|
||
bool f() { | ||
int n, road, wormhole; cin >> n >> road >> wormhole; | ||
|
||
int s, e, v; | ||
vector<edge> edges; | ||
|
||
// input | ||
while (road--) { | ||
cin >> s >> e >> v; // start, end, value | ||
edges.push_back({s, e, v}); | ||
edges.push_back({e, s, v}); | ||
} | ||
|
||
while (wormhole--) { | ||
cin >> s >> e >> v; | ||
edges.push_back({s, e, -v}); | ||
} | ||
|
||
// Search all nodes n time | ||
vector<int> dist(n + 1, MAX); | ||
dist[1] = 0; | ||
|
||
for (int node = 1; node <= n; node++) { | ||
for (auto next : edges) { | ||
s = next.s; | ||
e = next.e; | ||
v = next.v; | ||
|
||
if (dist[e] > dist[s] + v) | ||
dist[e] = dist[s] + v; | ||
} | ||
} | ||
|
||
// Search one more time | ||
for (auto next : edges) { | ||
s = next.s; | ||
e = next.e; | ||
v = next.v; | ||
|
||
if (dist[e] > dist[s] + v) | ||
return true; | ||
} | ||
|
||
return false; | ||
} | ||
|
||
int main() { | ||
fastio; | ||
int testCase; cin >> testCase; | ||
while (testCase--) { | ||
if (f()) printf("YES\n"); | ||
else printf("NO\n"); | ||
} | ||
} |