https://www.acmicpc.net/problem/10816

 

10816번: 숫자 카드 2

첫째 줄에 상근이가 가지고 있는 숫자 카드의 개수 N(1 ≤ N ≤ 500,000)이가 주어진다. 둘째 줄에는 숫자 카드에 적혀있는 정수가 주어진다. 숫자 카드에 적혀있는 수는 -10,000,000보다 크거나 같고, 10,000,000보다 작거나 같다. 셋째 줄에는 M(1 ≤ M ≤ 500,000)이 주어진다. 넷째 줄에는 상근이가 몇 개 가지고 있는 숫자 카드인지 구해야 할 M개의 정수가 주어지며, 이 수는 공백으로 구분되어져 있다. 이수도 -10,00

www.acmicpc.net

#include <iostream>
#include <algorithm>
using namespace std;

int main(){
	int n, m;
	int arr[500000];
	int ans[500000] = {0};
	
	cin >> n;
	for(int i = 0 ; i < n; i++) scanf("%d", &arr[i]);
	sort(arr,arr+n);
	
	cin >> m;
	for(int i = 0; i < m; i++)scanf("%d", &ans[i]);
	

	
	for(int i = 0;  i < m; i++){
		bool chk = 0;
		int l_tmp = -1,r_tmp = n;
		int left = -1, right = n;

		while(left + 1 < right){
			int mid = (left+right)/2;
			
			if(arr[mid] > ans[i]) right = mid;
			else if(arr[mid] < ans[i])  left = mid;
			if(arr[mid] == ans[i]){
				l_tmp = mid;
				right = mid;
				left = -1;
				chk =true;
			}
		}
		
		left = -1, right = n;
		while(left + 1 < right){
			int mid = (left+right)/2;
			
			if(arr[mid] > ans[i]) right = mid;
			else if(arr[mid] < ans[i])  left = mid;
			if(arr[mid] == ans[i]){
				r_tmp = mid;
				left = mid;
				right = n;
				chk=true;
			}
		}
		if(chk)printf("%d ", r_tmp-l_tmp+1);
		else   printf("0 ");
	}
}
반응형

https://www.acmicpc.net/problem/1963

 

1963번: 소수 경로

문제 소수를 유난히도 좋아하는 창영이는 게임 아이디 비밀번호를 4자리 ‘소수’로 정해놓았다. 어느 날 창영이는 친한 친구와 대화를 나누었는데: “이제 슬슬 비번 바꿀 때도 됐잖아” “응 지금은 1033으로 해놨는데... 다음 소수를 무엇으로 할지 고민중이야" “그럼 8179로 해” “흠... 생각 좀 해볼게. 이 게임은 좀 이상해서 비밀번호를 한 번에 한 자리 밖에 못 바꾼단 말이야. 예를 들어 내가 첫 자리만 바꾸면 8033이 되니까 소수가 아니잖아.

www.acmicpc.net

소수는 에라토스테네스의 채를 이용해서 구했습니다.

처음에 풀 때는 queue에 넣을 값을 찾기 위해 1000부터 9999까지 모두 뒤졌습니다. 당연하게도  시간초과가 뜨더군요.

 

그래서 1,10,100,1000 자리의 숫자만 변경하는 것으로 하니 잘 되네요.

 

#include <iostream>
#include <queue>
#include <cmath>
#include <string>
using namespace std;
bool num[10000] = { 0 };

void num_set() {

	for (int i = 2; i <= sqrt(9999); i++) {
		if (!num[i]) {
			for (int j = i + i; j <= 9999; j += i)
				num[j] = true;
		}
	}

}


int main() {
	ios_base::sync_with_stdio(false);
	num_set();
	int t;
	cin >> t;

	while (t--) {
		string x, y;
		int cnt = -1;
		bool chk = false;
		queue<string> q;
		bool visited[10000] = { 0 };

		cin >> x >> y;
		q.push(x); visited[atoi(x.c_str())] = true;

		while (!q.empty()) {
			cnt++;
			int size = q.size();
			
			for (int i = 0; i < size; i++) {
				string tmp = q.front(); q.pop();

				if (tmp == y) {
					chk = true; break;
				}

				for (int j = 0; j < 4; j++) {
					for (int k = 0; k <= 9; k++) {
						string dtmp = tmp;
						dtmp[j] = k + 48;
						if (visited[atoi(dtmp.c_str())]) continue;
						if (num[atoi(dtmp.c_str())]) continue;
						if (atoi(dtmp.c_str()) < 1000) continue;
						q.push(dtmp);
						visited[atoi(dtmp.c_str())] = true;
					}
				}

			}
			if (chk) break;
		}

		if (chk) cout << cnt << endl;
		else    cout << "Impossible" << endl;
	}

}
반응형

https://www.acmicpc.net/problem/2589

 

2589번: 보물섬

첫째 줄에는 보물 지도의 세로의 크기와 가로의 크기가 빈칸을 사이에 두고 주어진다. 이어 L과 W로 표시된 보물 지도가 아래의 예와 같이 주어지며, 각 문자 사이에는 빈 칸이 없다. 보물 지도의 가로, 세로의 크기는 각각 50이하이다.

www.acmicpc.net

모든 정점을 돌아다니면서 bfs를 수행하면서, 시간을 증가시킵니다. 그리고 ret 변수를 최대 시간으로 계속 갱신합니다.

#include <iostream>
#include <queue>
#include <algorithm>
using namespace std;
int main(){
	char map[51][51];
	int dx[4] = {0,0,1,-1};
	int dy[4] = {1,-1,0,0};
	int ret = 0;
	int l,w;
	
	cin >> l >> w;
	
	for(int i = 0; i  < l; i++){
		cin >> map[i];
	}
	
	for(int i = 0; i < l; i++){
		for(int j = 0; j < w; j++){
			if(map[i][j] == 'L'){
				int cnt = 0;
				int chk = false;
				queue<pair<int,int> > q;
				bool visited[50][50] = {0};
				q.push({i,j}); visited[i][j] =true;
				
				while(!q.empty()){
					if(chk){
						cnt+=1;
						ret = max(ret, cnt);
					}
					int size = q.size();
					for(int h = 0; h < size; h++){
						int x = q.front().second, y = q.front().first;
						q.pop();
						for(int k = 0; k < 4; k++){
							int xx = x+dx[k], yy = y + dy[k];
							
							if(xx < 0 || yy < 0 || xx >= w || yy >= l) continue;
							if(visited[yy][xx] || map[yy][xx] == 'W') continue;
							visited[yy][xx] = true;
							q.push({yy,xx});
						}
					}
					chk = true;
				}
				
				
			}
		}
	}
	cout << ret;
}

 

반응형

https://www.acmicpc.net/problem/11403

 

11403번: 경로 찾기

가중치 없는 방향 그래프 G가 주어졌을 때, 모든 정점 (i, j)에 대해서, i에서 j로 가는 경로가 있는지 없는지 구하는 프로그램을 작성하시오.

www.acmicpc.net

#include <iostream>
#include <vector>
using namespace std;
vector<int> v[100];
int ret[100][100] = {0};
int n;

void dfs(int start, int y){
	
	for(int i = 0; i < v[start].size(); i++){
		int tmp = v[start][i];
		if(ret[y][tmp]) continue;
		ret[y][tmp] = 1;
		dfs(tmp,y);
	}
}

int main(){
	int tmp;
	cin >> n;
	
	for(int i = 0; i < n; i++){
		for(int j = 0; j < n; j++){
			cin >> tmp;
			if(tmp == 1)
				v[i].push_back(j);
		}	
	}
	
	
	for(int i = 0; i < n; i++){
		dfs(i,i);
	}
	
	for(int i = 0; i < n; i++){
		for(int j = 0; j < n; j++)
			cout << ret[i][j] << ' ';
		cout << endl;
	}
}	
반응형

'프로그래밍 > 문제풀이' 카테고리의 다른 글

[bfs] 백준 1963 소수 경로  (0) 2019.04.01
[bfs] 백준 2589 보물섬  (0) 2019.04.01
[bfs] 백준 1389 케빈 베이컨의 6단계 법칙  (0) 2019.03.27
[dfs] 백준 2644 촌수계산  (0) 2019.03.27
[dfs] 백준 9903 로또  (0) 2019.03.27

https://www.acmicpc.net/problem/1389

 

1389번: 케빈 베이컨의 6단계 법칙

첫째 줄에 유저의 수 N (2 ≤ N ≤ 100)과 친구 관계의 수 M (1 ≤ M ≤ 5,000)이 주어진다. 둘째 줄부터 M개의 줄에는 친구 관계가 주어진다. 친구 관계는 A와 B로 이루어져 있으며, A와 B가 친구라는 뜻이다. A와 B가 친구이면, B와 A도 친구이며, A와 B가 같은 경우는 없다. 친구 관계는 중복되어 들어올 수도 있으며, 친구가 한 명도 없는 사람은 없다. 또, 모든 사람은 친구 관계로 연결되어져 있다.

www.acmicpc.net

#include <iostream>
#include <vector>
#include <queue>
using namespace std;

int main(){
	vector<int> arr[101];
	bool chk[101][101] = {0};
	int sum[101] = {0};
	int idx = 1;
	int n,m,t1,t2;
	
	cin >> n >> m;
	
	for(int i = 1; i <= m; i++){
		cin >> t1 >> t2;
		arr[t1].push_back(t2);
		arr[t2].push_back(t1);
	}
	
	for(int i = 1; i <= n; i++){
		queue<int> q;
		int cnt = 0;
		q.push(i);
		chk[i][i] = 1;
		
		while(!q.empty()){
			int q_size = q.size();
			cnt +=1;

			for(int k = 0; k < q_size; k++){
				int tmp = q.front(); q.pop();
				
				for(int j = 0; j < arr[tmp].size(); j++){
					if(chk[i][arr[tmp][j]]) continue;
					
					chk[i][arr[tmp][j]] = true;
					sum[i] += cnt;
					q.push(arr[tmp][j]);
				}
			}
		}
		
		if(sum[idx] > sum[i])
			idx = i;
	}
	
	cout << idx;

}

 

반응형

'프로그래밍 > 문제풀이' 카테고리의 다른 글

[bfs] 백준 2589 보물섬  (0) 2019.04.01
[dfs] 백준 11403 경로 찾기  (0) 2019.03.27
[dfs] 백준 2644 촌수계산  (0) 2019.03.27
[dfs] 백준 9903 로또  (0) 2019.03.27
[bfs, dfs] 백준 2573 빙산  (0) 2019.03.25

https://www.acmicpc.net/problem/2644


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
#include <iostream>
#include <vector>
using namespace std;
vector<int> v[100];
bool visited[100= {0};
bool chk = 0;
 
void dfs(int start, int target, int ret){
    if(start == target)    {cout << ret; chk = true;}
    
    for(int i = 0; i  <v[start].size(); i++){
        int tmp = v[start][i];
        
        if(visited[tmp]) continue;
        visited[tmp] = true;
        dfs(tmp,target,ret+1);
    }
 
}
 
int main(){
    int target1,target2,n,m,x,y;
    
    cin >> n >> target1 >> target2 >> m;
    
    for(int i = 0; i < m; i++){
        cin >> x >> y;
        v[x].push_back(y);
        v[y].push_back(x);
    }
    dfs(target1,target2,0);
    if(!chk) cout << -1;
 
}
cs


반응형

https://www.acmicpc.net/problem/6603



간단한 dfs문제입니다.




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
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int arr[13];
int t = 0;
 
void dfs(int start, vector<int>& v){
    v.push_back(arr[start]);
    if(v.size() == 6){
        for(int i = 0; i < 6; i++)
            cout << v[i] << ' ';
        cout << endl;
        return;
    }
    
    for(int i = start+1; i < t; i++){
        dfs(i,v);
        v.pop_back();
    }
}
 
int main(){
    
    
    while(1){
 
        cin >> t;
        if(t==0break;
        
        for(int i = 0; i < t; i++cin >> arr[i];
        for(int i = 0; i < t; i++){
            vector<int> v;
            dfs(i,v);
        }
        cout << endl;
    }
}
 
cs


반응형

https://www.acmicpc.net/problem/2573



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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#include <iostream>
#include <queue>
using namespace std;
 
int map[300][300= {0};
int dx[4= {1,-1,0,0};
int dy[4= {0,0,1,-1};
int n,m;
 
bool bfs_chk(){
    int cnt = 0;
    bool visited[300][300= {0};
 
    queue<pair<int,int> > q;
    
    for(int i = 0; i < n; i++){
        for(int j = 0; j  < m; j++){
            if(cnt >=2return true;
            if(visited[i][j] || map[i][j] == 0continue;
            cnt+=1;
            q.push({i,j}); visited[i][j] = 1;
            
            while(!q.empty()){
                int x= q.front().second, y = q.front().first;
                q.pop();
                
                for(int k = 0; k < 4; k++){
                    int xx = x + dx[k], yy = y + dy[k];
                    if(yy >= n || yy < 0 || xx >= m || xx < 0continue;
                    if(map[yy][xx] == 0 || visited[yy][xx]) continue;
                    q.push({yy,xx}); visited[yy][xx] = 1;
                }
            }
        }
    }
    
    return false;
}
 
bool chk_zero(){
    for(int i = 0; i < n; i++){
        for(int j = 0; j < m; j++){
            if(map[i][j] != 0return false;
        }
    }
    return true;
}
 
int main(){
    int y = 0;
    int m_map[300][300= {0};
    cin >> n >> m;
    
    for(int i = 0; i < n; i++){
        for(int j = 0; j  < m; j++)
            cin >> map[i][j];        
    }
    
    while(1){
        if(chk_zero()){ cout << 0break;}
        if(bfs_chk()){cout << y; break;}
        y+=1;
        
        for(int i = 0; i < n; i++){
            for(int j = 0; j < m; j++){
                if(map[i][j] != 0){
                    int zero_cnt = 0;
                    for(int k = 0; k < 4; k++){
                        int x = j + dx[k] , y = i + dy[k];
                        if(map[y][x] == 0) zero_cnt+=1;
                    }
                    m_map[i][j] = zero_cnt;
                }
            }
        }
        
        for(int i = 0; i < n; i++){
            for(int j = 0; j < m; j++){
                if(map[i][j] != 0){
                    map[i][j] -= m_map[i][j];
                    if(map[i][j] < 0) map[i][j] = 0;
                }
            }
        }
        
    }
}
cs


반응형

'프로그래밍 > 문제풀이' 카테고리의 다른 글

[dfs] 백준 2644 촌수계산  (0) 2019.03.27
[dfs] 백준 9903 로또  (0) 2019.03.27
[bfs, dfs] 백준 2667 단지번호붙이기  (0) 2019.03.24
[dfs] 백준 2606 바이러스  (0) 2019.03.22
[bfs] 백준 7569 토마토  (0) 2019.03.22

https://www.acmicpc.net/problem/2667



저에게 익숙한 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
#include <iostream>
#include <queue>
#include <algorithm>
using namespace std;
 
int main(){
    char map[25][25];
    int ret[625= {0};
    int n, idx= -1;
    queue<pair<int,int> > q;
    bool visited[25][25= {0};
    int dx[4= {1,-1,0,0};
    int dy[4= {0,0,1,-1};
 
    cin >> n;
    
    for(int i = 0; i < n; i++){
        for(int j = 0; j < n; j++cin >> map[i][j];
    }
 
    
    for(int i = 0; i < n; i++){
        for(int j = 0; j < n; j++){
            if(visited[i][j] || map[i][j] == '0'continue;
            
            idx+=1;
            q.push({i,j});
            visited[i][j] = 1;
            ret[idx] =0;
            
            while(!q.empty()){
                int x = q.front().second, y = q.front().first;
                q.pop();
                ret[idx] += 1;
                
                for(int k = 0; k < 4; k++){
                    int xx = x + dx[k], yy = y + dy[k];
                    
                    if(xx >= n || xx < 0 || yy >=|| yy < 0continue;
                    if(visited[yy][xx] || map[yy][xx] == '0'continue;
                    
                    
                    q.push({yy,xx});
                    visited[yy][xx] = 1;
                }
            }
        }
    }
    
    sort(ret, ret+idx+1);
    
    cout << idx+1 << '\n';
    for(int i = 0; i <= idx; i++)
        cout << ret[i] << '\n';
}
cs


이번에 소학회에서 배운 dfs로 구현해봤습니다. 연습하면 dfs로 구현하는 것이 더 쉬울 것 같네요.
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
#include <iostream>
#include <algorithm>
using namespace std;
 
int ret[625= {0}, n, idx=-1;
bool visited[25][25= {0};
char map[25][25];
 
void dfs(int y, int x){
    if(y >= n || y < 0 || x >= n || x < 0 || map[y][x] =='0' || visited[y][x]) return;
    ret[idx]++;
    visited[y][x] = 1;
    dfs(y-1,x), dfs(y+1,x) , dfs(y,x-1), dfs(y,x+1);
}
 
int main(){
    cin >> n;
    
    for(int i = 0; i < n; i++){
        for(int j = 0; j < n; j++)
            cin >> map[i][j];
    }
    
    for(int i = 0; i < n; i++){
        for(int j = 0; j < n; j++){
            if(visited[i][j] || map[i][j] == '0'continue;
            idx++;
            dfs(i,j);
        }
    }
    sort(ret, ret+idx+1);
    
    cout << idx+1 << '\n';
    for(int i = 0; i <= idx; i++)
        cout << ret[i] << '\n';
}
cs


반응형

'프로그래밍 > 문제풀이' 카테고리의 다른 글

[dfs] 백준 9903 로또  (0) 2019.03.27
[bfs, dfs] 백준 2573 빙산  (0) 2019.03.25
[dfs] 백준 2606 바이러스  (0) 2019.03.22
[bfs] 백준 7569 토마토  (0) 2019.03.22
[bfs] 라비다 1052 maze problem  (0) 2019.03.18

https://www.acmicpc.net/problem/2606

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
#include <iostream>
#include <vector>
using namespace std;
 
int ret = 0;
vector<int> v[101];
bool visited[101= {0};
 
 
void dfs(int start);
 
int main(){
    ios_base::sync_with_stdio(false);
    
    int com_n, n;
    
    cin >> com_n >> n;
 
    for(int i = 0; i < n; i++){
        int x,y;
        cin >> x >> y;
        v[x].push_back(y);
        v[y].push_back(x);
    }
    
    dfs(1);
    
    cout << ret-1;
    
    return 0;
}
 
void dfs(int start){
    for(int i = 0; i < v[start].size(); i++){
        int tmp = v[start][i];
        
        if(visited[tmp])    continue;
        visited[tmp] = true;
        ret+=1;
        dfs(tmp);
    }
}
cs


반응형

'프로그래밍 > 문제풀이' 카테고리의 다른 글

[bfs, dfs] 백준 2573 빙산  (0) 2019.03.25
[bfs, dfs] 백준 2667 단지번호붙이기  (0) 2019.03.24
[bfs] 백준 7569 토마토  (0) 2019.03.22
[bfs] 라비다 1052 maze problem  (0) 2019.03.18
[dp] 백준 1495 기타리스트  (0) 2019.02.20

+ Recent posts