[C++] ๋ถ„ํ•  ์ •๋ณต(Divide and Conquer)

2020. 4. 29. 18:36ยท๐Ÿ“ Computer Science/โœ Algorithm

๋ถ„ํ•  ์ •๋ณต(Divide and Conquer)

๋ง ๊ทธ๋ž˜๋„ ๋ฌธ์ œ๋ฅผ ๋ถ„ํ• ๊ณผ ์ •๋ณต์œผ๋กœ ๋‚˜๋ˆ ์„œ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.

  • ๋ถ„ํ•  ๋‹จ๊ณ„์—์„œ๋Š” ์ฃผ์–ด์ง„ ๋ฌธ์ œ๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ถ€๋ถ„ ๋ฌธ์ œ๋“ค๋กœ ๋‚˜๋ˆ„๋Š”๋ฐ, ๋ฌธ์ œ๊ฐ€ ์ž‘์•„์งˆ์ˆ˜๋ก ํ’€๊ธฐ ์‰ฌ์›Œ์ง€๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • ๋Œ€์ฒด๋กœ ๋ถ„ํ•  ์ •๋ณต์€ ์žฌ๊ท€ ํ˜ธ์ถœ์„ ์‚ฌ์šฉํ•œ๋‹ค.

 

๋ฌธ์ œ

 

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

 

1992๋ฒˆ: ์ฟผ๋“œํŠธ๋ฆฌ

์ฒซ์งธ ์ค„์—๋Š” ์˜์ƒ์˜ ํฌ๊ธฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ˆซ์ž N ์ด ์ฃผ์–ด์ง„๋‹ค. N ์€ ์–ธ์ œ๋‚˜ 2์˜ ์ œ๊ณฑ์ˆ˜๋กœ ์ฃผ์–ด์ง€๋ฉฐ, 1≤N ≤64์˜ ๋ฒ”์œ„๋ฅผ ๊ฐ€์ง„๋‹ค. ๋‘ ๋ฒˆ์งธ ์ค„๋ถ€ํ„ฐ๋Š” ๊ธธ์ด N ์˜ ๋ฌธ์ž์—ด์ด N ๊ฐœ ๋“ค์–ด์˜จ๋‹ค. ๊ฐ ๋ฌธ์ž์—ด์€ 0 ๋˜๋Š” 1์˜ ์ˆซ์ž๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์œผ๋ฉฐ, ์˜์ƒ์˜ ๊ฐ ์ ๋“ค์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.

www.acmicpc.net

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

int board[64][64];

void f(int n, int x, int y)
{
	bool color = board[y][x];
	bool diff = false;
	for (int i = y; i < n + y; ++i) {
		for (int j = x; j < n + x; ++j)
			if (color != board[i][j]) {
				diff = true;
				break;
			}

		if (diff)
			break;
	}

	if (!diff) {
		cout << color;
		return;
	}
	cout << "(";
	f(n / 2, x, y);
	f(n / 2, x + n / 2, y);
	f(n / 2, x, y + n / 2);
	f(n / 2, x + n / 2, y + n / 2);
	cout << ")";
}

int main()
{
	int n;
	cin >> n;
	for (int i = 0; i < n; ++i)
		for (int j = 0; j < n; ++j)
			scanf("%1d", &board[i][j]);

	f(n, 0, 0);
}

 

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

 

1780๋ฒˆ: ์ข…์ด์˜ ๊ฐœ์ˆ˜

N×Nํฌ๊ธฐ์˜ ํ–‰๋ ฌ๋กœ ํ‘œํ˜„๋˜๋Š” ์ข…์ด๊ฐ€ ์žˆ๋‹ค. ์ข…์ด์˜ ๊ฐ ์นธ์—๋Š” -1, 0, 1์˜ ์„ธ ๊ฐ’ ์ค‘ ํ•˜๋‚˜๊ฐ€ ์ €์žฅ๋˜์–ด ์žˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด ํ–‰๋ ฌ์„ ์ ์ ˆํ•œ ํฌ๊ธฐ๋กœ ์ž๋ฅด๋ ค๊ณ  ํ•˜๋Š”๋ฐ, ์ด๋•Œ ๋‹ค์Œ์˜ ๊ทœ์น™์— ๋”ฐ๋ผ ์ž๋ฅด๋ ค๊ณ  ํ•œ๋‹ค.

www.acmicpc.net

#include <iostream>
using namespace std;

int board[2190][2190];
int ans[3];

void f(int n, int x, int y)
{
	if (n == 1) {
		ans[board[y][x] + 1]++;
		return;
	}

	int tmp = board[y][x];
	bool diff = false;
	for (int i = y; i < n + y; ++i) {
		for (int j = x; j < n + x; ++j)
			if (tmp != board[i][j]) {
				diff = true;
				break;
			}
		if (diff)
			break;
	}

	if (!diff) {
		ans[tmp + 1]++;
		return;
	}

	n /= 3;
	for (int i = 0; i < 3; i++)
		for (int j = 0; j < 3; j++)
			f(n, x + n * j, y + n * i);
}

int main()
{
	int n;
	cin >> n;
	for (int i = 0; i < n; ++i)
		for (int j = 0; j < n; ++j)
			scanf("%d", &board[i][j]);

	f(n, 0, 0);
	cout << ans[0] << "\n" << ans[1] << "\n" << ans[2];
}

 

https://leetcode.com/problems/different-ways-to-add-parentheses/description/

#include <unordered_map>
#include <vector>
#include <string>
using namespace std;

class Solution {
public:
    unordered_map<string, vector<int>> hash;

    vector<int> diffWaysToCompute(string expression) {
        if (hash.find(expression) != hash.end())
            return hash[expression];

        vector<int> result;

        for (int i = 0; i < expression.size(); ++i) {
            char c = expression[i];

            if (c == '+' || c == '-' || c == '*') {
                string left = expression.substr(0, i);
                string right = expression.substr(i + 1);

                vector<int> leftResults = diffWaysToCompute(left);
                vector<int> rightResults = diffWaysToCompute(right);

                for (int l : leftResults) {
                    for (int r : rightResults) {
                        if (c == '+') {
                            result.push_back(l + r);
                        }
                        else if (c == '-') {
                            result.push_back(l - r);
                        }
                        else if (c == '*') {
                            result.push_back(l * r);
                        }
                    }
                }
            }
        }

        if (result.empty())
            result.push_back(stoi(expression));

        hash[expression] = result;
        return result;
    }
};
์ €์ž‘์žํ‘œ์‹œ (์ƒˆ์ฐฝ์—ด๋ฆผ)
'๐Ÿ“ Computer Science/โœ Algorithm' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [C++] binary_search, lower_bound, upper_bound
  • [C++] ์ด๋ถ„ ํƒ์ƒ‰(Binary Search)
  • [C++] ๊ทธ๋ฆฌ๋””(Greedy)
  • [C++] ๋ฐฑ ํŠธ๋ž˜ํ‚น(Back Tracking)
Blxxming
Blxxming
CS ์ง€์‹๊ณผ ๊ณต๋ถ€ํ•˜๋‹ค ๋ฐฐ์šด ๊ฒƒ, ๊ฒฝํ—˜ํ•œ ๊ฒƒ ๋“ฑ์„ ๊ธฐ๋กํ•˜๋Š” ๋ธ”๋กœ๊ทธ์ž…๋‹ˆ๋‹ค.
  • Blxxming
    ๐Ÿ’ก๋ฒˆ๋œฉ๐Ÿ’ก
    Blxxming
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
  • ๊ณต์ง€์‚ฌํ•ญ

    • Tech Interview
    • ๐Ÿ“š Tech (246)
      • ๐Ÿ“ Computer Science (96)
        • โœ OS (12)
        • โœ Network & Web (10)
        • โœ Database (11)
        • โœ Data Structure (6)
        • โœ Algorithm (40)
        • โœ Design Pattern (9)
        • โœ Cloud Computing (3)
        • โœ (5)
      • ๐Ÿ“ Language (73)
        • โœ Language (6)
        • โœ C & C++ (11)
        • โœ C# (19)
        • โœ JAVA (37)
      • ๐Ÿ“ Game (43)
        • โœ Computer Graphics (2)
        • โœ Unity (14)
        • โœ Unreal (26)
        • โœ (1)
      • ๐Ÿ“ Book (34)
        • โœ Effective (3)
        • โœ Game Server (16)
        • โœ Clean Code (14)
        • โœ (1)
  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.0
Blxxming
[C++] ๋ถ„ํ•  ์ •๋ณต(Divide and Conquer)
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”