Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

10-yuyu0830 #39

Merged
merged 3 commits into from
May 21, 2024
Merged

10-yuyu0830 #39

merged 3 commits into from
May 21, 2024

Conversation

yuyu0830
Copy link
Collaborator

πŸ”— 문제 링크

λΉ„μˆ

βœ”οΈ μ†Œμš”λœ μ‹œκ°„

1주일..?
ν‹ˆν‹ˆνžˆ ν’€μ—ˆμŠ΅λ‹ˆλ‹€

✨ μˆ˜λ„ μ½”λ“œ

❓ 문제

n * n 크기의 체슀판 이 주어진닀! 체슀 νŒμ€ 기물을 λ‘˜ 수 μžˆλŠ” μΉΈ(1) κ³Ό 기물을 λ‘˜ 수 μ—†λŠ” μΉΈ(0) 으둜 주어진닀. μš°λ¦¬λŠ” 주어진 체슀판 μœ„μ— μ΅œλŒ€ν•œ λ§Žμ€ λΉ„μˆμ„ μ„œλ‘œ κ²ΉμΉ˜μ§€ μ•Šκ²Œ 두렀고 ν•œλ‹€! 이 λ•Œ 체슀 νŒμ— μ΅œλŒ€ν•œ λ§Žμ€ λΉ„μˆμ„ μ„œλ‘œ κ²ΉμΉ˜μ§€ μ•Šκ²Œ λ°°μΉ˜ν–ˆμ„ λ•Œ, λͺ‡ 개의 λΉ„μˆμ„ λ‘˜ 수 μžˆλŠ”μ§€ κ΅¬ν•˜μž!

  • 1 ≀ n ≀ 10
  • μ‹œκ°„μ œν•œ 10초

❗ 풀이

n-bishop 문제라고 λ³Ό 수 μžˆλ‹€. ν•˜μ§€λ§Œ 체슀 νŒμ—μ„œ 기물을 λ‘˜ 수 μ—†λŠ” 곡간이 μžˆλŠ” 만큼 경우의 μˆ˜κ°€ 쑰금 생긴닀.

1️⃣ 첫번째 풀이

μš°μ„  기물을 λ‘˜ 수 μžˆλŠ” 칸이 λ³„κ°œλ‘œ 주어지기 λ•Œλ¬Έμ— 체슀 판의 λͺ¨μ–‘을 받을 λ•Œ 기물을 λ‘˜ 수 μžˆλŠ” 칸의 μœ„μΉ˜λ₯Ό λ²‘ν„°λ‘œ μ €μž₯ν–ˆλ‹€.

λΉ„μˆμ€ λŒ€κ°μ„ μœΌλ‘œλ§Œ 이동할 수 μžˆλ‹€! λ”°λΌμ„œ ν˜„μž¬ μœ„μΉ˜ (x, y)에 λŒ€ν•΄μ„œ λŒ€κ°μ„ μ— λ‹€λ₯Έ λΉ„μˆμ΄ μžˆλŠ”μ§€λ§Œ ν™•μΈν•˜λ©΄ λœλ‹€. κ·Έλž˜μ„œ 체슀 λ³΄λ“œλ₯Ό λŒ€κ°μ„ μœΌλ‘œ κΈ°μšΈμ—¬μ„œ 각 λŒ€κ°μ„ μ— μœ„μΉ˜ν•œ λΉ„μˆμ΄ μžˆλŠ”μ§€ μ²΄ν¬ν–ˆλ‹€.

image
κΈ°μ‘΄ μ²΄μŠ€νŒμ„ λ‹€λ£¨λŠ” 방식

image
κΈ°μšΈμ—¬μ„œ μ²΄μŠ€νŒμ„ λ‹€λ£¨λŠ” 방식

λ°±νŠΈλž˜ν‚Ή λ°©μ‹μœΌλ‘œ νƒμƒ‰ν•˜λŠ”λ° λ§Œμ•½ ν˜„μž¬ λΉ„μˆμ„ 두렀고 ν•˜λŠ” μœ„μΉ˜μ— ν•΄λ‹Ήν•˜λŠ” l_arr, r_arr 이 λ‘˜ λ‹€ λΉ„μ–΄μžˆμœΌλ©΄ l_arrκ³Ό r_arr에 체크λ₯Ό ν•œ λ’€ ν˜„μž¬ νƒμƒ‰μ˜ λΉ„μˆ 개수λ₯Ό ν•˜λ‚˜ 늘리고 λ‹€μŒ μœ„μΉ˜λ₯Ό νƒμƒ‰ν•œλ‹€.

#include <iostream>
#include <vector>

using namespace std;

typedef pair<int, int> ii;

int leftArr[20] = {0, };
int rightArr[20] = {0, };
int map[11][11] = {0, };

int n, ans = 0, m = 0;
vector<ii> v;

void solve(int idx) {
    int x = v[idx].first;
    int y = v[idx].second;

    int rightPos = x + y;
    int leftPos = (n - x - 1) + y;

    if (map[x][y] && !rightArr[rightPos] && !leftArr[leftPos]) {
        rightArr[rightPos] = 1;
        leftArr[leftPos] = 1;

        m = max(m, ++ans);

        for (int i = idx + 1; i < v.size(); i++) {
            solve(i);
        }

        rightArr[rightPos] = 0;
        leftArr[leftPos] = 0;

        ans--;
    }
}

int main() {
    cin >> n;

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            int t; cin >> t;
            map[i][j] = t;
            if (t) v.push_back(make_pair(i, j));
        }
    }

    for (int i = 0; i < v.size(); i++) {
        solve(i);
    }

    printf("%d\n", m);
}

이 풀이 방식은 결과적으둜 μ‹œκ°„ 초과 μ½”λ“œμ˜€λ‹€. n의 μ΅œλŒ€μΉ˜κ°€ 10μ΄λ‹ˆ μ΅œλŒ€ μΉΈ μˆ˜λŠ” 100, 각 μΉΈ λ³„λ‘œ λ‘κ±°λ‚˜ 두지 μ•ŠλŠ” 경우의 μˆ˜κ°€ μžˆμœΌλ‹ˆ 2^100 만큼의 탐색 횟수λ₯Ό κ°€μ§€κ²Œ λœλ‹€. (μ‹€μ œλ‘œλŠ” λ°±νŠΈλž˜ν‚Ή 도쀑 μˆœνšŒν•˜μ§€ μ•ŠλŠ” 경우의 μˆ˜λ„ λ§Žμ•„μ„œ 훨씬 μž‘μ„ 것 κ°™λ‹€) 이거 λ•Œλ¬Έμ— μ‹œκ°„ 쀄이렀고 λ³„μ˜ 별 방법을 λ‹€ μ¨λ΄€λŠ”λ° μ•ˆλ˜λ”λΌ..

2️⃣ λ‘λ²ˆμ§Έ 풀이

획기적으둜 μ€„μ΄λŠ” 방법이 μ—†μ„κΉŒ ν•˜λ‹€κ°€ λΉ„μˆμ˜ νŠΉμ„±μ€‘ ν•˜λ‚˜μΈ λΉ„μˆμ€ 같은 색 칸으둜만 움직일 수 μžˆλ‹€λŠ” 사싀이 기얡났닀. 그러면 같은 색 λΉ„μˆλΌλ¦¬λ§Œ λΉ„κ΅ν•˜λ©΄ λ˜μ§€ μ•Šμ„κΉŒ? κ·Έλ ‡κ²Œ λœλ‹€λ©΄ 탐색할 경우의 μˆ˜κ°€ ν™• μ€„κ²Œ λœλ‹€. (2^50 + 2^50 (이 것도 λ°±νŠΈλž˜ν‚ΉμœΌλ‘œ μˆœνšŒν•˜μ§€ μ•ŠλŠ” 경우의 μˆ˜κ°€ λ§Žμ•„μ Έ μ‹€μ œλ‘œλŠ” 2^(N * N / 4)κ°€ λœλ‹€κ³  ν•œλ‹€. μ°Έκ³ ) κ·Έλž˜μ„œ 같은 색끼리 비ꡐ할 수 μžˆλ„λ‘ μ½”λ“œλ₯Ό 쑰금 μ†λ³΄λ‹ˆ λ°”λ‘œ ν•΄κ²°!

#include <iostream>
#include <vector>

using namespace std;

typedef pair<int, int> ii;

int leftArr[2][11] = {0, };
int rightArr[2][11] = {0, };
int map[11][11] = {0, };

int n, ans[2] = {0, }, m[2] = {0, };
vector<ii> v[2];

void solve(int color, int idx) {
    int x = v[color][idx].first;
    int y = v[color][idx].second;

    int rightPos = (x + y) / 2;
    int leftPos = ((n - x - 1) + y) / 2;

    if (map[x][y] && !rightArr[color][rightPos] && !leftArr[color][leftPos]) {
        rightArr[color][rightPos] = 1;
        leftArr[color][leftPos] = 1;

        m[color] = max(m[color], ++ans[color]);

        for (int i = idx + 1; i < v[color].size(); i++) 
            solve(color, i);
        
        rightArr[color][rightPos] = 0;
        leftArr[color][leftPos] = 0;

        ans[color]--;
    }
}

int main() {
    cin >> n;

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            int t; cin >> t;
            map[i][j] = t;
            if (t) v[i % 2 != j % 2].push_back(make_pair(i, j));
        }
    }

    for (int color = 0; color < 2; color++) {
        for (int i = 0; i < v[color].size(); i++) {
            solve(color, i);

            if (ans[color] + (v[color].size() - i - 1) < m[color]) break;
        }   
    }

    printf("%d\n", m[0] + m[1]);
}

if (ans[color] + (v[color].size() - i - 1) < m[color]) break; 이 μ½”λ“œλ‘œ μˆœνšŒν•˜λ©΄μ„œ μ‘°κΈˆμ΄λΌλ„ μ‹œκ°„μ„ 아껴보기 μœ„ν•΄μ„œ 탐색 도쀑 남은 λΉ„μˆμ„ μ „λΆ€ λ‘˜ 수 μžˆλ‹€κ³  해도 μ΅œλŒ€κ°’μ΄λž‘ λΉ„κ΅ν–ˆμ„ λ•Œ κ°±μ‹ ν•  수 μžˆλŠ” 값이 μ•„λ‹ˆλ©΄ 탐색을 μ’…λ£Œν•˜κ²Œλ” λ§Œλ“€μ—ˆλ‹€.

πŸ“š μƒˆλ‘­κ²Œ μ•Œκ²Œλœ λ‚΄μš©

머리 꽁꽁 싸맨 μ–΄λ €μš΄ λ¬Έμ œμ˜€λ‹€... 2차원 배열을 κΈ°μšΈμ—¬μ„œ μ‚¬μš©ν•˜λŠ” 건 μƒˆλ‘œμš΄ μ ‘κ·Όμ΄μ˜€λ‹€.

Copy link
Collaborator

@InSange InSange left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이동할 수 μžˆλŠ” 곡간을 λ‹΄μ•„λ„£λŠ” λ°°μ—΄μ—μ„œ λ§Œμ•½ λŒ€κ°μ„  4λ°©ν–₯
dx[4] = {1, 1, -1, -1}, dy[4] = {1, -1, 1, -1}
μš”λ‘·κ²Œ μ„ μ •ν•œ ν›„
μ„ μ •ν•  수 μžˆλŠ” 곡간에 λ„£μ—ˆμ„ λ•Œ
각 λ°©ν–₯이 갈 수 μžˆλŠ” 쑰건을 bool canGo[4]와 같이 μ„ μ •ν•œ ν›„ 값을 점점 λŠ˜λ €κ°€λ©΄μ„œ μ²΄ν¬ν–ˆλ‹€λ©΄ 더 λΉ λ₯ΌκΉŒμš”?
저도 이둠만 생각해본터라 λ μ§€λŠ” λͺ¨λ₯΄κ² μ§€λ§Œ γ…Žγ…Ž
λ‘μ—ˆμ„ λ•Œ λŒ€κ°μ„ μœΌλ‘œ 갈 수 μžˆλŠ” λͺ¨λ“  경둜의 수λ₯Ό 1둜 λ§‰μ•„λ‘λŠ” 것과 λ‹€ νƒμƒ‰ν•˜λŠ” 것 λ‘˜ λ‹€ μ‹œκ°„ λ³΅μž‘λ„κ°€ κΆκΈˆν•΄μ§€λ„€μš”..

λŒ€κ°μ„ μœΌλ‘œ ν‘ΈλŠ” 방식.. μ΅μˆ™μΉ˜ μ•Šμ€ μ ‘κ·Όμ΄λ‹€λ³΄λ‹ˆ λΆ„μ„ν•˜λ‹€κ°€ 이게 될까?λΌλŠ” μˆ˜λ§Žμ€ μ˜ν˜Ήμ‹¬μ— μ—¬λŸ¬λ²ˆ νœ©μ‹Έμ΄λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€.. μ—­μ‹œ μ—¬λŸ¬ λ‹€λ°©λ©΄μœΌλ‘œ μ ‘κ·Όν•  수 μžˆλ‹€λŠ” 것은 그만큼 내곡이 μŒ“μΈ κ³ μˆ˜κ°€ μ•„λ‹κΉŒμš”..? 쒋은 문제 보고 κ°‘λ‹ˆλ‹€.

@yuyu0830
Copy link
Collaborator Author

yuyu0830 commented May 3, 2024

이동할 수 μžˆλŠ” 곡간을 λ‹΄μ•„λ„£λŠ” λ°°μ—΄μ—μ„œ λ§Œμ•½ λŒ€κ°μ„  4λ°©ν–₯ dx[4] = {1, 1, -1, -1}, dy[4] = {1, -1, 1, -1} μš”λ‘·κ²Œ μ„ μ •ν•œ ν›„ μ„ μ •ν•  수 μžˆλŠ” 곡간에 λ„£μ—ˆμ„ λ•Œ 각 λ°©ν–₯이 갈 수 μžˆλŠ” 쑰건을 bool canGo[4]와 같이 μ„ μ •ν•œ ν›„ 값을 점점 λŠ˜λ €κ°€λ©΄μ„œ μ²΄ν¬ν–ˆλ‹€λ©΄ 더 λΉ λ₯ΌκΉŒμš”? 저도 이둠만 생각해본터라 λ μ§€λŠ” λͺ¨λ₯΄κ² μ§€λ§Œ γ…Žγ…Ž λ‘μ—ˆμ„ λ•Œ λŒ€κ°μ„ μœΌλ‘œ 갈 수 μžˆλŠ” λͺ¨λ“  경둜의 수λ₯Ό 1둜 λ§‰μ•„λ‘λŠ” 것과 λ‹€ νƒμƒ‰ν•˜λŠ” 것 λ‘˜ λ‹€ μ‹œκ°„ λ³΅μž‘λ„κ°€ κΆκΈˆν•΄μ§€λ„€μš”..

사싀 μ™„μ „ 처음 ν’€μ΄λŠ” 탐색 κ°€λŠ₯ μ—¬λΆ€ ν™•μΈμš© 2차원 배열을 λ”°λ‘œ μ„ μ–Έν•΄ (x, y) 에 λΉ„μˆμ„ λ‘”λ‹€λ©΄ 2차원 λ°°μ—΄μ—μ„œ (x, y)의 λͺ¨λ“  λŒ€κ°μ„ μ— + 1을 해두고, λΉ„μˆμ„ λΊ„ λ•Œ λͺ¨λ“  λŒ€κ°μ„ μ— -1을 ν•˜λŠ” μ‹μœΌλ‘œ 체크λ₯Ό ν–ˆμŠ΅λ‹ˆλ‹€. κ·Έλ ‡κ²Œ ν•˜λ©΄ 2차원 λ°°μ—΄μ˜ (a, b)κ°€ 0이면 λΉ„μˆμ„ λ°°μΉ˜ν•  수 있고, 1 이상이면 λΉ„μˆμ„ λ°°μΉ˜ν•  수 μ—†μŠ΅λ‹ˆλ‹€. μ΄λ ‡κ²Œ ν•΄λ΄€λŠ”λ° μ‹œκ°„ μ΄ˆκ³Όκ°€ λ‚˜μ˜€λ”λΌκ΅¬μš”... 그런데 μ‹œκ°„ 초과의 κ°€μž₯ 큰 원인이 흰색, 검은색 타일을 같이 ν™•μΈν•˜λŠ” 것인 만큼 이 풀이도 흰색, 검은색 타일을 λ”°λ‘œ μ—°μ‚°ν•˜λ©΄ ν•΄κ²° κ°€λŠ₯ν• κΉŒμš”?

λŒ€κ°μ„ μœΌλ‘œ ν‘ΈλŠ” 방식.. μ΅μˆ™μΉ˜ μ•Šμ€ μ ‘κ·Όμ΄λ‹€λ³΄λ‹ˆ λΆ„μ„ν•˜λ‹€κ°€ 이게 될까?λΌλŠ” μˆ˜λ§Žμ€ μ˜ν˜Ήμ‹¬μ— μ—¬λŸ¬λ²ˆ νœ©μ‹Έμ΄λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€.. μ—­μ‹œ μ—¬λŸ¬ λ‹€λ°©λ©΄μœΌλ‘œ μ ‘κ·Όν•  수 μžˆλ‹€λŠ” 것은 그만큼 내곡이 μŒ“μΈ κ³ μˆ˜κ°€ μ•„λ‹κΉŒμš”..? 쒋은 문제 보고 κ°‘λ‹ˆλ‹€.

이 ν’€μ΄λŠ” 사싀 n-Queen을 1차원 λ°°μ—΄λ‘œ ν‘ΈλŠ” 것에 μ˜κ°μ„ λ°›μ•˜μŠ΅λ‹ˆλ‹€. 풀어보셨닀면 μ•„λ§ˆ μ°Έκ³ κ°€ 될 것이고, μ•ˆν•΄λ³΄μ…¨λ‹€λ©΄ n-Queen 1차원 λ°°μ—΄λ‘œ ν’€μ–΄λ³΄μ‹œλŠ”κ±Έ μΆ”μ²œλ“œλ¦½λ‹ˆλ‹€ :)

Copy link
Collaborator

@seongwon030 seongwon030 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

같은 색 칸으둜만 움직일 수 μžˆλŠ” λΉ„μˆμ˜ νŠΉμ§•μ„ 잘 μž‘μœΌμ‹  것 κ°™μ•„μš”. λ°±νŠΈλž˜ν‚Ήμ— λŒ€ν•΄ 감을 λͺ» 작고 μžˆμ—ˆλŠ”λ° 문제보고 λ¦¬λ·°ν•˜λŠ” κ²ƒλ§ŒμœΌλ‘œ 슬슬 감이 μž‘νžˆλŠ” 것 κ°™μ•„μš”. pr 잘 보고 κ°‘λ‹ˆλ‹€ !

Copy link
Contributor

@dhlee777 dhlee777 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

μ²΄μŠ€νŒμ„ κΈ°μšΈμ—¬μ„œ λŒ€κ°μ„ λ³„λ‘œ λΉ„μˆμ˜ μœ„μΉ˜λ₯Ό μ²΄ν¬ν•˜λŠ” 방법이 정말 μ°Έμ‹ ν•œ 접근인 것 κ°™μŠ΅λ‹ˆλ‹€.그리고 λ°±νŠΈλž˜ν‚Ή 도쀑 μ΅œλŒ“κ°’ κ°±μ‹  κ°€λŠ₯성이 μ—†μœΌλ©΄ 탐색을 κ·Έλ§Œλ‘λ©΄μ„œ νƒμƒ‰μ‹œκ°„μ„ μ•„λ‚„μˆ˜ μžˆλ‹€κ³  λŠκΌˆμŠ΅λ‹ˆλ‹€. 잘 λ°°μ›Œκ°‘λ‹ˆλ‹€..!

@yuyu0830 yuyu0830 merged commit 8fbdbb3 into main May 21, 2024
@yuyu0830 yuyu0830 deleted the 10-yuyu0830 branch May 21, 2024 08:27
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants