반응형

www.acmicpc.net/problem/1062

 

1062번: 가르침

첫째 줄에 단어의 개수 N과 K가 주어진다. N은 50보다 작거나 같은 자연수이고, K는 26보다 작거나 같은 자연수 또는 0이다. 둘째 줄부터 N개의 줄에 남극 언어의 단어가 주어진다. 단어는 영어 소문

www.acmicpc.net

1
2
3
4
5
6
7
8
// 백트래킹으로 사용하지 않은 문자 찾기
for (int i = now; i < 26; i++) {
    if (!visited[i]) {
        visited[i] = 1;
        dfs(i + 1, cnt + 1);
        visited[i] = 0;
    }
}
cs

 

 

 

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
#include <iostream>
#include <algorithm>
#include <vector>
#define rep(i,n) for(int i=0;i<n;i++)
using namespace std;
int visited[26];
vector<vector<char> > v;
int n, k, cnt = 5, ans;
string str;
void dfs(int now, int cnt) {
    if (cnt == k) {
        int temp = 0;
        for (vector<char> vec : v) {
            int j;
            // 방문 안 한 글자 있으면 break
            for (j = 0; j < vec.size(); j++
                if (!visited[vec[j] - 'a']) break;
            
            // 끝까지 돌았으면 temp++
            if (j == vec.size())
                temp++;
        }
        ans = max(ans, temp);
        return;
    }
 
    // 백트래킹으로 사용하지 않은 문자 찾기
    for (int i = now; i < 26; i++) {
        if (!visited[i]) {
            visited[i] = 1;
            dfs(i + 1, cnt + 1);
            visited[i] = 0;
        }
    }
}
int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cin >> n >> k;
    v.resize(n);
    // 앞 뒤 4글자 방문
    visited['a' - 'a'= 1;
    visited['n' - 'a'= 1;
    visited['t' - 'a'= 1;
    visited['i' - 'a'= 1;
    visited['c' - 'a'= 1;
 
    // 가운데 글자 입력
    rep(i,n){
        cin >> str;
        for (int j = 4; j < str.size() - 4; j++)
            v[i].push_back(str[j]);
    }
    if (k < 5) {
        cout << 0;
        return 0;
    }
    dfs(0, cnt);
    cout << ans;
}
cs
반응형

'백준 > 백트래킹' 카테고리의 다른 글

백준 2580  (0) 2021.02.24
N-Queen 복습 (백준 9663)  (0) 2021.02.23
백준 16198  (0) 2021.02.23
백준 15658  (0) 2021.02.23
백준 1248 [복습 필수]  (0) 2021.02.15
반응형

www.acmicpc.net/problem/2580

 

2580번: 스도쿠

스도쿠는 18세기 스위스 수학자가 만든 '라틴 사각형'이랑 퍼즐에서 유래한 것으로 현재 많은 인기를 누리고 있다. 이 게임은 아래 그림과 같이 가로, 세로 각각 9개씩 총 81개의 작은 칸으로 이루

www.acmicpc.net

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
88
89
90
91
#include <iostream>
#define rep(i,n) for(int i=0;i<n;i++)
using namespace std;
int arr[10][10], cnt;
bool row_visited[10][10], col_visited[10][10], sqr_visited[10][10];
// 핵심
// 1. visited 검사
// 2. 백트래킹 종료 조건
int getSqrNum(int x, int y) {
    x -= x % 3;
    y -= y % 3;
    if (x == 0) {
        if (y == 0return 0;
        if (y == 3return 1;
        if (y == 6return 2;
    }
    if (x == 3) {
        if (y == 0return 3;
        if (y == 3return 4;
        if (y == 6return 5;
    }
    if (x == 6) {
        if (y == 0return 6;
        if (y == 3return 7;
        if (y == 6return 8;
    }
}
void setVisited(int i, int j, bool flag) {
    row_visited[i][arr[i][j]] = flag;
    col_visited[j][arr[i][j]] = flag;
    sqr_visited[getSqrNum(i, j)][arr[i][j]] = flag;
}
bool chk(int x, int y, int val) {
    if (row_visited[x][val]) return false;    // 가로 검사
    if (col_visited[y][val]) return false;    // 세로 검사
    
    x -= x % 3;                                // 사각형 검사
    y -= y % 3;
    if (sqr_visited[getSqrNum(x, y)][val]) return false;
    return true;
}
void print() {
    rep(i, 9) {
        rep(j, 9)
            cout << arr[i][j] << ' ';
        cout << '\n';
    }
}
void dfs(int x, int y) {
    // 0 전부 없어졌으면 출력
    if (cnt == 0) {
        print();
        exit(0);
    }
 
    // 백트래킹
    for (int i = x; i < 9; i++) {
        for (int j = 0; j < 9; j++) {
            if (arr[i][j] == 0) {                // 0이면
                int k;
                for (k = 1; k <= 9; k++) {        // 1 ~ 9 다 넣어봄
                    if (chk(i, j, k)) {            // 조건 맞으면 다음 단계 진행
                        arr[i][j] = k;
                        setVisited(i, j, 1);
                        cnt--;                    // 0 개수 줄이기
                        dfs(i, j+1);
                        cnt++;
                        setVisited(i, j, 0);
                        arr[i][j] = 0;            // 다시 0으로 돌리기
                    }
                }
                if (k == 10return;            // k == 10 -> 0인 칸에 숫자 넣지 못하고 반복문 끝남
            }
        }
    }
}
 
int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    rep(i, 9) {
        rep(j, 9) {
            cin >> arr[i][j];
            if (arr[i][j] != 0)
                setVisited(i, j, 1);            // visited 설정
            else
                cnt++;                            // 0 개수 체크
        }
    }
    dfs(00);
}
cs
반응형

'백준 > 백트래킹' 카테고리의 다른 글

백준 1062  (0) 2021.03.07
N-Queen 복습 (백준 9663)  (0) 2021.02.23
백준 16198  (0) 2021.02.23
백준 15658  (0) 2021.02.23
백준 1248 [복습 필수]  (0) 2021.02.15
반응형

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
#include <iostream>
using namespace std;
int n, ans;
int visited[15][15];
int col_visited[15];
bool chk(int x, int y) {
    int i = x+1;
    int j = y+1;
    while (i >= 0 && i < n && j >= 0 && j < n) {    // 우하 대각선
        if (visited[i++][j++])
            return false;
    }
    i = x+1;
    j = y-1;
    while (i >= 0 && i < n && j >= 0 && j < n) {    // 좌하 대각선
        if (visited[i++][j--])
            return false;
    }
    i = x-1;
    j = y+1;
    while (i >= 0 && i < n && j >= 0 && j < n) {    // 우상 대각선
        if (visited[i--][j++])
            return false;
    }
 
    i = x-1;
    j = y-1;
    while (i >= 0 && i < n && j >= 0 && j < n) {    // 좌상 대각선
        if (visited[i--][j--])
            return false;
    }
    return true;
}
void bfs(int row) {
    if (row == n) {
        ans++;
        return;
    }
    int j;
    for (int i = row; i < n; i++) {
        for (j = 0; j < n; j++) {
            // 세로 검사 && 대각선 검사
            if (!col_visited[j] && chk(i,j)) {
                col_visited[j] = 1;        // 열 방문 처리    
                visited[i][j] = 1;        // 퀸 놓음
                bfs(row + 1);
                visited[i][j] = 0;    
                col_visited[j] = 0;
            }
        }
        // 퀸 놓을 공간 없어서 다음 단계 진행 못하고 j가 끝까지 감
        if (j == n)
            return;
    }
}
int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cin >> n;
    bfs(0);
    cout << ans;
}
cs
반응형

'백준 > 백트래킹' 카테고리의 다른 글

백준 1062  (0) 2021.03.07
백준 2580  (0) 2021.02.24
백준 16198  (0) 2021.02.23
백준 15658  (0) 2021.02.23
백준 1248 [복습 필수]  (0) 2021.02.15
반응형

www.acmicpc.net/problem/16198

 

16198번: 에너지 모으기

N개의 에너지 구슬이 일렬로 놓여져 있고, 에너지 구슬을 이용해서 에너지를 모으려고 한다. i번째 에너지 구슬의 무게는 Wi이고, 에너지를 모으는 방법은 다음과 같으며, 반복해서 사용할 수 있

www.acmicpc.net

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
#include <iostream>
#include <algorithm>
#define rep(i,n) for(int i=0;i<n;i++)
using namespace std;
int n, arr[11], ans;
bool visited[11];
// idx 양 옆 숫자 선택
int calc(int idx) {
    int ret = 0;
    for (int i = idx - 1; i >= 0; i--) {    // 0 아닌 숫자 나올 때까지 왼쪽으로 이동
        if (arr[i] != 0) {
            ret += arr[i];
            break;
        }
    }
    for (int i = idx + 1; i < n; i++) {        // 0 아닌 숫자 나올 때까지 오른쪽으로 이동
        if (arr[i] != 0) {
            ret *= arr[i];
            break;
        }
    }
    return ret;
}
void bfs(int cnt, int sum) {
    if (cnt == n-1) {
        ans = max(ans, sum);
        return;
    }
    // 0 / 1 ~ n-2 / n-1 선택
    for (int i = 1; i <= n-2; i++) {
        if (!visited[i]) {
            visited[i] = 1;
            int temp = arr[i];
            arr[i] = 0;                    // 선택한 숫자를 0으로 변경
            bfs(cnt+1, sum+calc(i));    // 계산 후에 다음 단계 진행
            arr[i] = temp;
            visited[i] = 0;
        }
    }
}
int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cin >> n;
    rep(i, n)
        cin >> arr[i];
    bfs(10);
    cout << ans;
}
cs
반응형

'백준 > 백트래킹' 카테고리의 다른 글

백준 2580  (0) 2021.02.24
N-Queen 복습 (백준 9663)  (0) 2021.02.23
백준 15658  (0) 2021.02.23
백준 1248 [복습 필수]  (0) 2021.02.15
백준 2529  (0) 2021.02.15
반응형

www.acmicpc.net/problem/15658

 

15658번: 연산자 끼워넣기 (2)

첫째 줄에 수의 개수 N(2 ≤ N ≤ 11)가 주어진다. 둘째 줄에는 A1, A2, ..., AN이 주어진다. (1 ≤ Ai ≤ 100) 셋째 줄에는 합이 N-1보다 크거나 같고, 4N보다 작거나 같은 4개의 정수가 주어지는데, 차례대

www.acmicpc.net

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
#include <iostream>
#include <algorithm>
#define rep(i,n) for(int i=0;i<n;i++)
using namespace std;
int n, arr[12], op[50];
int max_val = -987654321, min_val = 987654321;
// 연산자 모두 나열: +(1) +(2) + (3) / +(2) +(1) +(3) / +(1) +(3) +(2) 모두 다른 경우로 인식
// 연산자 남아있는 개수를 확인해서 탐색하는 방식으로 해야함
void func(int step, int val) {
    if (step == n) {
        max_val = max(max_val, val);
        min_val = min(min_val, val);
        return;
    }
    rep (i, 4) {
        if (op[i]>0) {        // 현재 연산자 남아있으면
            op[i]--;        // 하나 사용
            int temp = 0;
            if (i == 0)
                temp = val + arr[step];
            else if (i == 1)
                temp = val - arr[step];
            else if (i == 2)
                temp = val * arr[step];
            else if (i == 3)
                temp = val / arr[step];
            func(step + 1, temp);    // 다음 숫자 계산
            op[i]++;
        }
    }
}
int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cin >> n;
    rep(i, n)
        cin >> arr[i];
 
    rep(i, 4)
        cin >> op[i];
    func(1, arr[0]);
    cout << max_val << '\n' << min_val;
}
cs
반응형

'백준 > 백트래킹' 카테고리의 다른 글

N-Queen 복습 (백준 9663)  (0) 2021.02.23
백준 16198  (0) 2021.02.23
백준 1248 [복습 필수]  (0) 2021.02.15
백준 2529  (0) 2021.02.15
백준 15661  (0) 2021.02.15
반응형

www.acmicpc.net/problem/1248

 

1248번: 맞춰봐

첫째 줄에 수열의 크기 N이 주어진다. N은 10보다 작거나 같은 자연수이다. 둘째 줄에는 N(N+1)/2 길이의 문자열이 주어진다. 처음 N개의 문자는 부호 배열의 첫 번째 줄에 해당하고, 다음 N-1개의 문

www.acmicpc.net

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
#include <iostream>
#include <string>
using namespace std;
int n;
char s[11][11];
int sum[11];
int arr[11][11];
string str;
bool valid(int col) {
    if (col == 1)
        return true;
    for (int row = 1; row <= col; row++) {
        int cur = arr[col][col] + arr[row][col - 1];
        if (s[row][col] == '+' && cur <= 0)
            return false;
        else if (s[row][col] == '-' && cur >= 0)
            return false;
        else if (s[row][col] == '0' && cur != 0)
            return false;
        arr[row][col] = cur;
    }
    return true;
}
void dfs(int cnt) {
    // 출력
    if (cnt > n) {
        for (int i = 1; i <= n; i++)
            cout << arr[i][i] << ' ';
        exit(0);
    }
 
    // 1부터 n까지 숫자를 모두 다 고른 다음에 검사, 출력하면 시간 초과
    // 한 라인 추가할 때마다 검사, 해당 라인 통과 못하면 그 다음 라인은 아예 검사 안함
    char now = s[cnt][cnt];
    if (now == '+') {
        for (int i = 1; i <= 10; i++) {
            arr[cnt][cnt] = i;
            if(valid(cnt))
                dfs(cnt + 1);
        }
    }
    else if (now == '-') {
        for (int i = 1; i <= 10; i++) {
            arr[cnt][cnt] = -i;
            if (valid(cnt))
                dfs(cnt + 1);
        }
    }
    else if (now == '0') {
        arr[cnt][cnt] = 0;
        if (valid(cnt))
            dfs(cnt + 1);
    }
}
int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cin >> n;
    for (int i = 1;i <= n;i++) {
        for (int j = i;j <= n;j++)
            cin >> s[i][j];
    }
    dfs(1);
}
cs
반응형

'백준 > 백트래킹' 카테고리의 다른 글

백준 16198  (0) 2021.02.23
백준 15658  (0) 2021.02.23
백준 2529  (0) 2021.02.15
백준 15661  (0) 2021.02.15
백준 18290  (0) 2021.02.15
반응형

www.acmicpc.net/problem/2529

 

2529번: 부등호

두 종류의 부등호 기호 ‘<’와 ‘>’가 k개 나열된 순서열  A가 있다. 우리는 이 부등호 기호 앞뒤에 서로 다른 한 자릿수 숫자를 넣어서 모든 부등호 관계를 만족시키려고 한다. 예를 들어, 제

www.acmicpc.net

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
#include <iostream>
#include <algorithm>
#define ll long long
#define rep(i,n) for(int i=0;i<n;i++)
using namespace std;
int n;
char arr[10];
int visited[10];
int num_arr[10];
int max_arr[10];
int min_arr[10];
ll ans_max = -9999999999, ans_min = 9999999999, temp;
void dfs(int num, int idx, int cnt) {
    temp = 0;
    if (idx==n) {
        rep(i, cnt) {
            temp = temp * 10 + num_arr[i];
        }
        if (temp > ans_max) {
            ans_max = temp;
            rep(i, n+1)
                max_arr[i] = num_arr[i];
        }
        if (temp < ans_min) {
            ans_min = temp;
            rep(i, n+1)
                min_arr[i] = num_arr[i];
        }
        return;
    }
 
    if (arr[idx] == '>') {
        for (int i = num - 1; i >= 0;i--) {
            if (!visited[i]) {
                visited[i] = 1;
                num_arr[cnt] = i;
                dfs(i, idx + 1, cnt + 1);
                visited[i] = 0;
            }
        }
    }
    else {
        for (int i = num + 1; i <= 9; i++) {
            if (!visited[i]) {
                visited[i] = 1;
                num_arr[cnt] = i;
                dfs(i, idx + 1, cnt + 1);
                visited[i] = 0;
            }
        }
    }
}
int main() {
    cin >> n;
    rep(i, n)
        cin >> arr[i];
    rep(i, 10) {
        visited[i] = 1;
        num_arr[0= i;
        dfs(i, 01);
        visited[i] = 0;
    }
    rep(i, n+1)
        cout << max_arr[i];
    cout << '\n';
    rep(i, n+1)
        cout << min_arr[i];
}
cs
반응형

'백준 > 백트래킹' 카테고리의 다른 글

백준 15658  (0) 2021.02.23
백준 1248 [복습 필수]  (0) 2021.02.15
백준 15661  (0) 2021.02.15
백준 18290  (0) 2021.02.15
백준 10971  (0) 2021.02.03
반응형

www.acmicpc.net/problem/15661

 

15661번: 링크와 스타트

첫째 줄에 N(4 ≤ N ≤ 20)이 주어진다. 둘째 줄부터 N개의 줄에 S가 주어진다. 각 줄은 N개의 수로 이루어져 있고, i번 줄의 j번째 수는 Sij 이다. Sii는 항상 0이고, 나머지 Sij는 1보다 크거나 같고, 100

www.acmicpc.net

 

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
#include <iostream>
#include <vector>
#include <algorithm>
#define rep(i,n) for(int i=1;i<=n;i++)
using namespace std;
int n, arr[21][21], ans = 987654321;
int visited[21];
vector<int> v1, v2;
int team1, team2;
void dfs(int now) {
    v1.clear();
    v2.clear();
    team1 = 0;
    team2 = 0;
    // 계산
    rep(i, n) {
        if (visited[i])
            v1.push_back(i);
        else
            v2.push_back(i);
    }
    if (v1.size() == 1)
        team1 = 0;
    else {
        for (int i : v1) {
            for (int j : v1) {
                if (i == j) continue;
                team1 += arr[i][j];
            }
        }
    }
    if (v2.size() == 1)
        team2 = 0;
    else {
        for (int i : v2) {
            for (int j : v2) {
                if (i == j) continue;
                team2 += arr[i][j];
            }
        }
    }
    ans = min(ans, abs(team1 - team2));
    // 백트래킹
    for (int i = now; i <= n; i++) {
        visited[i] = 1;
        dfs(i + 1);
        visited[i] = 0;
    }
}
int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cin >> n;
    rep(i, n) {
        rep(j, n)
            cin >> arr[i][j];
    }
    visited[1= 1;
    dfs(2);
    cout << ans;
}
cs

비슷한 문제: rltn2121.tistory.com/15

반응형

'백준 > 백트래킹' 카테고리의 다른 글

백준 1248 [복습 필수]  (0) 2021.02.15
백준 2529  (0) 2021.02.15
백준 18290  (0) 2021.02.15
백준 10971  (0) 2021.02.03
백준 10819  (0) 2021.02.03

+ Recent posts