๋ฌธ์
https://programmers.co.kr/learn/courses/30/lessons/60058
๋ฌธ์ ํ์ด
์๋ฎฌ๋ ์ด์ ๊ฐ์ด ๋ฌธ์ ์์ ์๋ ค์ค ๊ดํธ๋ณํํ๋ ๋ฐฉ๋ฒ์ ํ๋ํ๋ ์ฐจ๋ก๋ก ๊ตฌํํ๋ฉด ๋๋ค.
<๋ฌธ์ ์์ ์ฃผ์ด์ง ์ฌ๋ฐ๋ฅธ ๊ดํธ ๋ง๋๋ ๋ฒ>
1. ์
๋ ฅ์ด ๋น ๋ฌธ์์ด์ธ ๊ฒฝ์ฐ, ๋น ๋ฌธ์์ด์ ๋ฐํํฉ๋๋ค.
2. ๋ฌธ์์ด w๋ฅผ ๋ "๊ท ํ์กํ ๊ดํธ ๋ฌธ์์ด" u, v๋ก ๋ถ๋ฆฌํฉ๋๋ค. ๋จ, u๋ "๊ท ํ์กํ ๊ดํธ ๋ฌธ์์ด"๋ก ๋ ์ด์ ๋ถ๋ฆฌํ ์ ์์ด์ผ ํ๋ฉฐ, v๋ ๋น ๋ฌธ์์ด์ด ๋ ์ ์์ต๋๋ค.
3. ๋ฌธ์์ด u๊ฐ "์ฌ๋ฐ๋ฅธ ๊ดํธ ๋ฌธ์์ด" ์ด๋ผ๋ฉด ๋ฌธ์์ด v์ ๋ํด 1๋จ๊ณ๋ถํฐ ๋ค์ ์ํํฉ๋๋ค.
3-1. ์ํํ ๊ฒฐ๊ณผ ๋ฌธ์์ด์ u์ ์ด์ด ๋ถ์ธ ํ ๋ฐํํฉ๋๋ค.
4. ๋ฌธ์์ด u๊ฐ "์ฌ๋ฐ๋ฅธ ๊ดํธ ๋ฌธ์์ด"์ด ์๋๋ผ๋ฉด ์๋ ๊ณผ์ ์ ์ํํฉ๋๋ค.
4-1. ๋น ๋ฌธ์์ด์ ์ฒซ ๋ฒ์งธ ๋ฌธ์๋ก '('๋ฅผ ๋ถ์
๋๋ค.
4-2. ๋ฌธ์์ด v์ ๋ํด 1๋จ๊ณ๋ถํฐ ์ฌ๊ท์ ์ผ๋ก ์ํํ ๊ฒฐ๊ณผ ๋ฌธ์์ด์ ์ด์ด ๋ถ์
๋๋ค.
4-3. ')'๋ฅผ ๋ค์ ๋ถ์
๋๋ค.
4-4. u์ ์ฒซ ๋ฒ์งธ์ ๋ง์ง๋ง ๋ฌธ์๋ฅผ ์ ๊ฑฐํ๊ณ , ๋๋จธ์ง ๋ฌธ์์ด์ ๊ดํธ ๋ฐฉํฅ์ ๋ค์ง์ด์ ๋ค์ ๋ถ์
๋๋ค.
4-5. ์์ฑ๋ ๋ฌธ์์ด์ ๋ฐํํฉ๋๋ค.
์ด ๋, ์ฃผ์ด์ง ๋ฌธ์์ด์ด ๊ท ํ์กํ ๊ดํธ ๋ฌธ์์ด์ธ์ง, ์ฌ๋ฐ๋ฅธ ๊ดํธ ๋ฌธ์์ด์ธ์ง๋ฅผ ํ์ธํด์ผ ํ๋ฏ๋ก, ์ด ๊ฒฝ์ฐ๋ ๊ฐ๊ฐ isCorrectString() ์ returnBalanceStringIndex() ํจ์๋ก ์์ฑํ๋ค.
bool isCorrectString(string balanace_string) ๋ ์ฌ๋ฐ๋ฅธ ๊ดํธ ๋ฌธ์์ด์ผ ๋๋ true๋ฅผ ์ฌ๋ฐ๋ฅด์ง ์์ ๊ดํธ ๋ฌธ์์ด์ผ ๋๋ false๋ฅผ ๋ฐํํ๋ ํจ์๋ก์, ์ด๋ฆฐ ๊ดํธ( (๋ + )์ ๋ซํ ๊ดํธ( )๋ - )์ ์(check)๋ฅผ ์นด์ดํธํ๋ฉด์ ํ๋จํ๋ค. ์์ ๊ฐ์๋ง ๊ฐ์ผ๋ฉด ์๋๊ณ (์๋ฅผ ๋ค์ด, ))((์ ๊ฒฝ์ฐ๋ ์์ ์ ์์) ๋งค ์๊ฐ ์ด๋ฆฐ๊ดํธ (๊ฐ ๋จผ์ ์๋์ง๋ฅผ ํ์ธํ๊ธฐ ์ํด -๊ฐ ํ๋ฒ์ด๋ผ๋ ๋์์ check ๋ณ์๊ฐ ์์๊ฐ ๋๋ฉด ๋ฐ๋ก false๋ฅผ ๋ฐํํ๋ ํจ์๋ก ์งฐ๋ค.
int returnBalanceStringIndex(string original_string) ๋ ๊ท ํ์กํ ๊ดํธ ๋ฌธ์์ด์ธ์ง๋ฅผ ํ๋จํ์ฌ ๊ท ํ์กํ ๊ดํธ ๋ฌธ์์ด๊น์ง์ index๋ฅผ ๋ฐํํ์ฌ u, v๋ก ๋๋๋๋ก ํ๋ ํจ์์ด๋ค. ๊ท ํ์กํ ๊ดํธ๋ ์ด๋ฆฐ๊ดํธ์ ๋ซํ ๊ดํธ์ ์๋ง ๋ง์ผ๋ฉด ๋๋ฏ๋ก, ๋ฌธ์์ด์ 0 index๋ถํฐ ๋ง์ง๋ง๊น์ง ๋ฐ๋ณต๋ฌธ์ ๋๋ฉด์ check ๋ณ์๊ฐ 0์ด ๋ ๋ ํ์ฌ index๋ฅผ ๋ฐํํ๋๋ก ํ๋ค.
๊ท ํ์กํ ๋ฌธ์์ด u, v๋ก ๋๋๋ ๋ถ๋ถ์ ์๋์ ๊ฐ๋ค.
balance_string1 = original_string.substr(0, returnBalanceStringIndex(original_string) + 1);
balance_string2 = original_string.substr(balance_string1.length());
original_string.substr(0, returnBalanceStringIndex(original_string) + 1) ๋
0๋ถํฐ ๊ท ํ์กํ ๊ดํธ๋ฌธ์์ด์ธ๋ฐ ๊น์ง๋ฅผ
original_string.substr(balance_string1.length()) ๋ ๊ท ํ์กํ ๊ดํธ๋ฌธ์์ด balance_string1 ๋ค์๋ถํฐ ๋๊น์ง๋ฅผ ๋ํ๋ธ๋ค.
๋๋จธ์ง๋ ๋ฌธ์ ์์ ์ฃผ์ด์ง ๋ฐฉ๋ฒ์ ์ฐจ๋ก๋ก ์ ์ ๊ฒ ๋ฐ์ ์๊ณ ,
//โ
4 - 4. balance_string1์ ์ฒซ ๋ฒ์งธ์ ๋ง์ง๋ง ๋ฌธ์๋ฅผ ์ ๊ฑฐํ๊ณ , ๋๋จธ์ง ๋ฌธ์์ด์ ๊ดํธ ๋ฐฉํฅ์ ๋ค์ง์ด์ ๋ค์ ๋ถ์
balance_string1 = balance_string1.substr(1, balance_string1.length() - 2);
์ด ๋ถ๋ถ์ ์ฒซ ๋ฒ์งธ์ ๋ง์ง๋ง ๋ฌธ์๋ฅผ ์ ๊ฑฐ ํ ์ ์๋ ๊ฒ ํต์ฌ์ด์๋๋ฐ, balance_string1.substr(1, balance_string1.length() - 2) ์ด๋ ๊ฒ ํ๋๊น () ์ฒ๋ผ length๊ฐ 2์ธ ๊ฒฝ์ฐ์๋ "" ๋ง ๋ฐํํ๋ ๊ฒ์ ํ์ธํ ์ ์์๋ค. ์๋ง๋ ์ธ๋ฑ์ค๊ฐ ์๋ชป(?)๋๋ฉด or ๋ค ๋งค๊ฐ๋ณ์๊ฐ ์ ์ผ๋ฉด ""๋ฅผ ๋ฐํํ๋ ๋ฏ ํ๋ค.
์ฝ๋
#include <string>
#include <iostream>
using namespace std;
bool isCorrectString(string balanace_string) {
if (balanace_string == "") return true;
int check = 0; // ( ๋ +1๋ก )๋ -1๋ก ํํํด์ ๊ดํธ๊ฐ์ํ์ธ์ ํตํด ์ฌ๋ฐ๋ฅธ ๊ดํธ๋ฌธ์์ด์ธ์ง๋ฅผ ํ๋จํ๋ค.
for (int i = 0; i < balanace_string.length(); i++) {
if (check < 0) return false; //ํ๋ฒ์ด๋ผ๋ ์์๊ฐ ๋๋ฉด )๊ดํธ๊ฐ ๋จผ์ ์ด๋ฆฐ ๊ฒ์ด๋ฏ๋ก false๋ฅผ ๋ฆฌํดํ๋ค.
check += (balanace_string[i] == '(') ? 1 : -1;
}return check == 0 ? true : false; //๋ง์ง๋ง์ check ๋ณ์๊ฐ 0์ด ๋๋ฉด ์ฌ๋ฐ๋ฅธ ๊ดํธ๋ฌธ์์ด์ธ ๊ฒ!
}
int returnBalanceStringIndex(string original_string) {
int check = 0; // ( ๋ +1๋ก )๋ -1๋ก ํํํด์ ๊ดํธ๊ฐ์ํ์ธ์ ํตํด ์ฌ๋ฐ๋ฅธ ๊ดํธ๋ฌธ์์ด์ธ์ง๋ฅผ ํ๋จํ๋ค.
for (int i = 0; i < original_string.length(); i++) {
check += (original_string[i] == '(') ? 1 : -1;
if (check == 0) return i;
}return original_string.length();
}
string solution(string original_string) {
//1. ์
๋ ฅ์ด ๋น ๋ฌธ์์ด์ด๊ฑฐ๋ ์ฌ๋ฐ๋ฅธ ๋ฌธ์์ด์ธ ๊ฒฝ์ฐ, ๊ทธ๋๋ก ๋ฐํ
if (original_string == "" || isCorrectString(original_string)) {
return original_string;
}
//์
๋ ฅ ๋ฌธ์์ด์ด ์ฌ๋ฐ๋ฅธ ๋ฌธ์์ด์ด ์๋๋ผ์ ๊ดํธ ๋ณํ์ด ํ์ํ ๊ฒฝ์ฐ
//2. ๋ฌธ์์ด์ ๋ "๊ท ํ์กํ ๊ดํธ ๋ฌธ์์ด" balance_string1, balance_string2๋ก ๋ถ๋ฆฌ
string balance_string1 = "", balance_string2 = "";
balance_string1 = original_string.substr(0, returnBalanceStringIndex(original_string) + 1);
balance_string2 = original_string.substr(balance_string1.length());
//3. ๋ฌธ์์ด balance_string1๊ฐ "์ฌ๋ฐ๋ฅธ ๊ดํธ ๋ฌธ์์ด" ์ด๋ผ๋ฉด ๋ฌธ์์ด balance_string2์ ๋ํด 1๋จ๊ณ๋ถํฐ ๋ค์ ์ํ
if (isCorrectString(balance_string1)) {
//3-1. ์ํํ ๊ฒฐ๊ณผ ๋ฌธ์์ด์ balance_string1์ ์ด์ด ๋ถ์ธ ํ ๋ฐํ
balance_string1 += solution(balance_string2);
return balance_string1;
}
//4. ๋ฌธ์์ด balance_string1๊ฐ "์ฌ๋ฐ๋ฅธ ๊ดํธ ๋ฌธ์์ด"์ด ์๋๋ผ๋ฉด ์๋ ๊ณผ์ ์ ์ํ
else {
string correct_string = "";
//4 - 1. ๋น ๋ฌธ์์ด์ ์ฒซ ๋ฒ์งธ ๋ฌธ์๋ก '('๋ฅผ ๋ถ์
correct_string += "(";
//4 - 2. ๋ฌธ์์ด balance_string2์ ๋ํด 1๋จ๊ณ๋ถํฐ ์ฌ๊ท์ ์ผ๋ก ์ํํ ๊ฒฐ๊ณผ ๋ฌธ์์ด์ ์ด์ด ๋ถ์
correct_string += solution(balance_string2);
//4 - 3. ')'๋ฅผ ๋ค์ ๋ถ์
correct_string += ")";
//โ
4 - 4. balance_string1์ ์ฒซ ๋ฒ์งธ์ ๋ง์ง๋ง ๋ฌธ์๋ฅผ ์ ๊ฑฐํ๊ณ , ๋๋จธ์ง ๋ฌธ์์ด์ ๊ดํธ ๋ฐฉํฅ์ ๋ค์ง์ด์ ๋ค์ ๋ถ์
balance_string1 = balance_string1.substr(1, balance_string1.length() - 2);
for (int i = 0; i < balance_string1.length(); i++) {
balance_string1[i] = (balance_string1[i] == '(') ? ')' : '(';
}
correct_string += balance_string1;
//4 - 5. ์์ฑ๋ ๋ฌธ์์ด์ ๋ฐํ
return correct_string;
}
}
//test์ฉ ์ฝ๋ ์ถ๊ฐ..
int main() {
string original_string = "";
cin >> original_string;
cout << solution(original_string);
}
'๐ Coding Test Study > Algorithm Problem' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[C++][BAEKJOON][์๋ฎฌ๋ ์ด์ ] 17144๋ฒ ๋ฏธ์ธ๋จผ์ง ์๋ ! (0) | 2021.09.19 |
---|---|
[C++][BAEKJOON][DP] 9456๋ฒ ์คํฐ์ปค (0) | 2021.08.22 |
[C++][Baekjoon] 14503๋ฒ ๋ก๋ด ์ฒญ์๊ธฐ (0) | 2021.08.22 |
[C++][Baekjoon][DP] 1309๋ฒ ๋๋ฌผ์ (0) | 2021.08.22 |
[C++][Baekjoon] 16974๋ฒ ์์ธ ์งํ์ฒ 2ํธ์ (0) | 2021.08.22 |