diff --git a/111.txt b/111.txt deleted file mode 100644 index e69de29..0000000 diff --git a/Algo.vcxproj b/Algo.vcxproj deleted file mode 100644 index b18a93c..0000000 --- a/Algo.vcxproj +++ /dev/null @@ -1,147 +0,0 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - Debug - x64 - - - Release - x64 - - - - 16.0 - Win32Proj - {0a79eafa-2440-4cec-882d-5ae9a4c2284b} - Algo - 10.0 - - - - Application - true - v142 - Unicode - - - Application - false - v142 - true - Unicode - - - Application - true - v142 - Unicode - - - Application - false - v142 - true - Unicode - - - - - - - - - - - - - - - - - - - - - true - - - false - - - true - - - false - - - - Level3 - true - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - - - Console - true - - - - - Level3 - true - true - true - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - - - Console - true - true - true - - - - - Level3 - true - _DEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - - - Console - true - - - - - Level3 - true - true - true - NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - - - Console - true - true - true - - - - - - - - - \ No newline at end of file diff --git a/Algo.vcxproj.filters b/Algo.vcxproj.filters deleted file mode 100644 index b6dbf47..0000000 --- a/Algo.vcxproj.filters +++ /dev/null @@ -1,22 +0,0 @@ - - - - - {4FC737F1-C7A5-4376-A066-2A32D752A2FF} - cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx - - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd - - - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} - rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms - - - - - 소스 파일 - - - \ No newline at end of file diff --git a/Algo.vcxproj.user b/Algo.vcxproj.user deleted file mode 100644 index 88a5509..0000000 --- a/Algo.vcxproj.user +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git "a/BASE/Split\352\265\254\355\230\204.cpp" "b/BASE/Split\352\265\254\355\230\204.cpp" deleted file mode 100644 index 82ce112..0000000 --- "a/BASE/Split\352\265\254\355\230\204.cpp" +++ /dev/null @@ -1,34 +0,0 @@ -#include - -using namespace std; - -vector split(string input, string delimiter) -{ - vector ret; - long long pos = 0; - string token = ""; - - while((pos = input.find(delimiter)) != string::npos) - { - token = input.substr(0, pos); - ret.push_back(token); - input.erase(0, pos + delimiter.length()); - - cout << "input : " << input << "\n"; - } - - ret.push_back(input); - return ret; -} - - -int main() -{ - string s = "aa.bb.cc.dd.ee.ff.gg"; - vector a = split(s, "."); - - cout << a[3] << "\n"; - - // for(string b : a) cout << b << "\n"; -} - diff --git "a/BASE/\353\210\204\354\240\201\355\225\251.cpp" "b/BASE/\353\210\204\354\240\201\355\225\251.cpp" deleted file mode 100644 index d433b7f..0000000 --- "a/BASE/\353\210\204\354\240\201\355\225\251.cpp" +++ /dev/null @@ -1,46 +0,0 @@ -#include - -using namespace std; - -typedef long long ll; - -int a[100004], b, c, psum[100004], n, m; - -// 시간 초과 발생 O(10만 * 10만) -// int main() -// { -// cin >> n >> m; -// for(int i = 1; i <= n; i++) -// { -// cin >> a[i]; -// } - -// for(int i = 0; i < m; i++) -// { -// cin >> b >> c; -// int sum = 0; - -// for(int j = b; j <= c; j++) sum += a[j]; - -// cout << sum << "\n"; -// } -// return 0; -// } - -int main() -{ - cin >> n >> m; - for (int i = 1; i <= n; i++) - { - cin >> a[i]; - psum[i] = psum[i - 1] + a[i]; - } - - for (int i = 0; i < m; i++) - { - cin >> b >> c; - cout << psum[c] - psum[b - 1] << "\n"; - } - - return 0; -} \ No newline at end of file diff --git "a/BASE/\354\210\234\354\227\264.cpp" "b/BASE/\354\210\234\354\227\264.cpp" deleted file mode 100644 index 9410ede..0000000 --- "a/BASE/\354\210\234\354\227\264.cpp" +++ /dev/null @@ -1,41 +0,0 @@ -#include - -using namespace std; - -int a[3] = {1, 2, 3}; -vector v; - -void printV(vector &v) -{ - for (int i = 0; i < v.size(); i++) - { - cout << v[i] << " "; - } - cout << "\n"; -} - -void Permutation(int n, int r, int level) -{ - if(r == level) - { - printV(v); - return; - } - for(int i = level; i < n; i ++) - { - swap(v[i], v[level]); - Permutation(n, r, level + 1); - swap(v[i], v[level]); - } - return; -} - -int main() -{ - for(int i = 0; i < 3; i++) - { - v.push_back(a[i]); - } - Permutation(3, 3, 0); - return 0 ; -} \ No newline at end of file diff --git "a/DFS\352\270\260\353\263\270.cpp" "b/DFS\352\270\260\353\263\270.cpp" new file mode 100644 index 0000000..3160d8f --- /dev/null +++ "b/DFS\352\270\260\353\263\270.cpp" @@ -0,0 +1,60 @@ +#include +#include + +using namespace std; + +int dy[4] = {-1, 0, 1, 0}; +int dx[4] = {0, 1, 0, -1}; + +int a[1004][1004]; +bool visited[1004][1004]; + +int n, m, nx, ny, answer; + +void dfs(int y, int x) +{ + cout << y << " : " << x << "\n"; + visited[y][x] = 1; + for(int i = 0; i < 4; i++) + { + ny = y + dy[i]; + nx = x + dx[i]; + if(ny < 0 || nx < 0 || ny >= n || nx >= m) continue; + if(a[ny][nx] == 0 && !visited[ny][nx]) + { + dfs(ny, nx); + } + } + + return; +} + + +int main() +{ + cin >> n >> m; + + // 입력 + for(int i = 0; i < n; i++) + { + for(int j = 0; j < m; j++) + { + cin >> a[i][j]; + } + } + + for(int i = 0; i < n; i++) + { + for(int j = 0; j < m; j++) + { + if(a[i][j] == 0 && !visited[i][j]) + { + answer ++; + dfs(i, j); + } + } + } + + cout << answer << "\n"; + return 0; +} \ No newline at end of file diff --git a/Debug/Algo.exe.recipe b/Debug/Algo.exe.recipe deleted file mode 100644 index ebce144..0000000 --- a/Debug/Algo.exe.recipe +++ /dev/null @@ -1,11 +0,0 @@ - - - - - C:\Users\HP\source\repos\Algo\Debug\Algo.exe - - - - - - \ No newline at end of file diff --git a/Debug/Algo.ilk b/Debug/Algo.ilk deleted file mode 100644 index 6a8eba4..0000000 Binary files a/Debug/Algo.ilk and /dev/null differ diff --git a/Debug/Algo.log b/Debug/Algo.log deleted file mode 100644 index 983893f..0000000 --- a/Debug/Algo.log +++ /dev/null @@ -1,2 +0,0 @@ - Text.cpp - Algo.vcxproj -> C:\Users\HP\source\repos\Algo\Debug\Algo.exe diff --git a/Debug/Algo.tlog/Algo.lastbuildstate b/Debug/Algo.tlog/Algo.lastbuildstate deleted file mode 100644 index 289f2bd..0000000 --- a/Debug/Algo.tlog/Algo.lastbuildstate +++ /dev/null @@ -1,2 +0,0 @@ -PlatformToolSet=v142:VCToolArchitecture=Native32Bit:VCToolsVersion=14.29.30133:TargetPlatformVersion=10.0.16299.0: -Debug|Win32|C:\Users\HP\source\repos\Algo\| diff --git a/Debug/Algo.tlog/CL.command.1.tlog b/Debug/Algo.tlog/CL.command.1.tlog deleted file mode 100644 index 20c18a4..0000000 Binary files a/Debug/Algo.tlog/CL.command.1.tlog and /dev/null differ diff --git a/Debug/Algo.tlog/CL.read.1.tlog b/Debug/Algo.tlog/CL.read.1.tlog deleted file mode 100644 index 29fd386..0000000 Binary files a/Debug/Algo.tlog/CL.read.1.tlog and /dev/null differ diff --git a/Debug/Algo.tlog/CL.write.1.tlog b/Debug/Algo.tlog/CL.write.1.tlog deleted file mode 100644 index bf40988..0000000 Binary files a/Debug/Algo.tlog/CL.write.1.tlog and /dev/null differ diff --git a/Debug/Algo.tlog/link.command.1.tlog b/Debug/Algo.tlog/link.command.1.tlog deleted file mode 100644 index 218c5e1..0000000 Binary files a/Debug/Algo.tlog/link.command.1.tlog and /dev/null differ diff --git a/Debug/Algo.tlog/link.read.1.tlog b/Debug/Algo.tlog/link.read.1.tlog deleted file mode 100644 index ec28742..0000000 Binary files a/Debug/Algo.tlog/link.read.1.tlog and /dev/null differ diff --git a/Debug/Algo.tlog/link.write.1.tlog b/Debug/Algo.tlog/link.write.1.tlog deleted file mode 100644 index 5e412d2..0000000 Binary files a/Debug/Algo.tlog/link.write.1.tlog and /dev/null differ diff --git a/Debug/Text.obj b/Debug/Text.obj deleted file mode 100644 index 9108396..0000000 Binary files a/Debug/Text.obj and /dev/null differ diff --git a/Debug/vc142.idb b/Debug/vc142.idb deleted file mode 100644 index 6d1a0f1..0000000 Binary files a/Debug/vc142.idb and /dev/null differ diff --git a/Debug/vc142.pdb b/Debug/vc142.pdb deleted file mode 100644 index 982b0fc..0000000 Binary files a/Debug/vc142.pdb and /dev/null differ diff --git a/README.md b/README.md new file mode 100644 index 0000000..d889a0e --- /dev/null +++ b/README.md @@ -0,0 +1,2 @@ +# AlgorithmStudy +This is a auto push repository for Baekjoon Online Judge created with [BaekjoonHub](https://github.com/BaekjoonHub/BaekjoonHub). diff --git a/Text.cpp b/Text.cpp deleted file mode 100644 index 615f219..0000000 --- a/Text.cpp +++ /dev/null @@ -1,14 +0,0 @@ -#include - - -using namespace std; - - -int main() -{ - for (int i = 0; i < 10; i++) - { - cout << i << "\n"; - } - -} \ No newline at end of file diff --git a/desktop.ini b/desktop.ini deleted file mode 100644 index d957fd1..0000000 --- a/desktop.ini +++ /dev/null @@ -1,4 +0,0 @@ -[ViewState] -Mode= -Vid= -FolderType=Generic diff --git "a/\352\260\234\353\205\220\354\240\225\353\246\254/\353\210\204\354\240\201\355\225\251.md" "b/\352\260\234\353\205\220\354\240\225\353\246\254/\353\210\204\354\240\201\355\225\251.md" deleted file mode 100644 index dd59acd..0000000 --- "a/\352\260\234\353\205\220\354\240\225\353\246\254/\353\210\204\354\240\201\355\225\251.md" +++ /dev/null @@ -1,113 +0,0 @@ -## 누적합 - -미리 요소들의 합을 저장해 두는 누적된 수의 합을 의미 - -앞에서부터 더하는 **prefix sum** 과 뒤에서 부터 더하는 suffix sum이 있지만 주로 **prefix sum**만 나온다 . - - 누적합은 구간쿼리에 대응하기 쉽다. - -구간쿼리 : 정적배열 / 동적배열(어떤 순간에 구간안에 있는 요소가 변한다.) - -- 정적배열 : 구간합 - -- 동적배열 : 트리(세그먼트트리, 펜윅트리) - - - -**예시 문제** - -자연수로 이루어진 N개의 카드를 주며 M개의 질문을 던진다. - -질문은 나열한 카드 중 A 번째부터 B번째 까지의 합을 구하는것이다. - -입력) - -수의 개수 N, 합을 구해야 하는 횟수 M, 그 이후에 N개의 수가 주어진다. 수는 100이하의 자연수 - -그 이후 M개의 줄에는 합을 구해야 하는 구간 A, B가 주어진다. - -출력) - -M개의 줄에 A부터 B까지의 합을 구하라 - -범위) - -1 <= N, M <= 100,000 - -1 <= A <= B <= N - -예제 입력 - -``` -8 3 -1 2 3 4 5 6 7 8 -1 4 -1 5 -3 5 -``` - -예제 출력 - -``` -10 -15 -12 -``` - -**[시간초과] O(10만 * 10만)** - -```c++ -#include -using namespace std; -typedef long long ll; -int a[100004], b, c, psum[100004], n, m; - -// 시간 초과 발생 O(10만 * 10만) -int main() -{ - cin >> n >> m; - for(int i = 1; i <= n; i++) - { - cin >> a[i]; - } - - for(int i = 0; i < m; i++) - { - cin >> b >> c; - int sum = 0; - - for(int j = b; j <= c; j++) sum += a[j]; - - cout << sum << "\n"; - } - return 0; -} -``` - -**[구간합 이용]** - -```c++ -#include -using namespace std; -typedef long long ll; -int a[100004], b, c, psum[100004], n, m; - -int main() -{ - cin >> n >> m; - for (int i = 1; i <= n; i++) - { - cin >> a[i]; - psum[i] = psum[i - 1] + a[i]; - } - - for (int i = 0; i < m; i++) - { - cin >> b >> c; - cout << psum[c] - psum[b - 1] << "\n"; - } - - return 0; -} -``` - diff --git "a/\352\260\234\353\205\220\354\240\225\353\246\254/\353\254\270\354\236\220\354\227\264 \355\214\214\354\213\261\352\263\274 \354\241\260\353\246\275.md" "b/\352\260\234\353\205\220\354\240\225\353\246\254/\353\254\270\354\236\220\354\227\264 \355\214\214\354\213\261\352\263\274 \354\241\260\353\246\275.md" deleted file mode 100644 index 9065e3a..0000000 --- "a/\352\260\234\353\205\220\354\240\225\353\246\254/\353\254\270\354\236\220\354\227\264 \355\214\214\354\213\261\352\263\274 \354\241\260\353\246\275.md" +++ /dev/null @@ -1,147 +0,0 @@ -### 문자열 파싱과 조립 -- 문자열 -- 파싱 - -
- -- #### stringstream, istringstream, ostringstream 의 차이 -``` -istringstream : 값을 입력받을 수 있는 입력 스트림 - -ostringstream : 값을 출력할 수 있는 출력 스트림 - -stringstream -- istringstream 과 ostringstream 의 다중 상속 -- >>(입력) 과 <<(출력) 모두에 사용할 수 있지만, 입출력 방향을 헷갈린 경우 오류를 표시해주지 않는다. -- 위 2개에 비해 성능이 다소 떨어진다. -- istringstream 과 ostringstream 으로 명시적으로 사용하는 것이 좋다. -``` -[Why not use stringstream in every case?](https://stackoverflow.com/questions/3292107/whats-the-difference-between-istringstream-ostringstream-and-stringstream-w#answer-3292157) - -[What is the difference between istringstream, ostringstream and stringstream?](https://www.reddit.com/r/cpp_questions/comments/jq6pum/what_is_the_difference_between_istringstream/) - -
- -- #### [find 와 substr 을 활용해 파싱하는 방법](https://github.com/icarusw-code/AlgoStudy_Mtvs/blob/sj/%EA%B0%9C%EB%85%90%EC%A0%95%EB%A6%AC/%EB%AC%B8%EC%9E%90%EC%97%B4.md#split)
※ 하나의 문자가 아닌, 문자열로 이루어진 구분자에도 사용할 수 있다. - -
- -- #### 하나의 문자로 이루어진 구분자를 기준으로 파싱하는 방법
※ 구분자가 연속으로 있는 경우 빈 문자열이 저장되므로 주의 -``` -#include -#include - -vector split(string input, char delimiter) -{ - string token; - vector ret; - istringstream iss(input); - - while (getline(iss, token, delimiter)) - ret.push_back(token); - - return ret; -} -``` - -``` -#include - -using namespace std; - -void main() -{ - string input; - vector v; - - input = "aa,bb,cc,dd"; - v = split(input, ','); - - input = ",aa,,bb,,cc,,dd,,"; - v = split(input, ','); -} -``` - -실행 결과 -``` -"aa,bb,cc,dd" -["aa", "bb", "cc", "dd"] - -",aa,,bb,,cc,,dd,," -["", "aa", "", "bb", "", "cc", "", "dd", ""] -``` - -
- -- #### 공백을 기준으로 파싱하는 방법
※ 앞/뒤 혹은 연속적인 공백이 존재해도 사용할 수 있다. -``` -#include -#include - -vector split_blank(string input) -{ - string token; - vector ret; - istringstream iss(input); - - while (iss >> token) - ret.push_back(token); - - return ret; -} -``` - -``` -#include - -using namespace std; - -void main() -{ - string input; - vector v; - - input = "aa bb cc dd"; - v = split_blank(input); - - input = " aa bb cc dd "; - v = split_blank(input); -} -``` - -실행 결과 -``` -"aa bb cc dd" -["aa", "bb", "cc", "dd"] - -" aa bb cc dd " -["aa", "bb", "cc", "dd"] -``` - -
- -- #### 형이 다른 값들을 문자열로 합치는 방법 -``` -#include - -void example() -{ - string s = "Hello"; - int i = 123; - string ss = "World"; - float f = 6.0; - string sss = "!!"; - double d = 3.14; - - ostringstream oss; - - oss << s << i << ss << f << sss << d; - - cout << oss.str(); -} -``` - -실행 결과 -``` -Hello123World6!!3.14 -``` diff --git "a/\352\260\234\353\205\220\354\240\225\353\246\254/\353\254\270\354\236\220\354\227\264.md" "b/\352\260\234\353\205\220\354\240\225\353\246\254/\353\254\270\354\236\220\354\227\264.md" deleted file mode 100644 index a70efa5..0000000 --- "a/\352\260\234\353\205\220\354\240\225\353\246\254/\353\254\270\354\236\220\354\227\264.md" +++ /dev/null @@ -1,124 +0,0 @@ -## 문자열 - -- reverse : 원래의 문자열을 바꿔준다. - - begin과 end를 통해 전체를 바꿀 수 있고 s.begin(), s.begin() + 3 처럼 부분만 바꿀 수 있다. - -- substr : 시작지점으로 부터 몇개의 문자열을 뽑아낸다. - -- find : 어떠한 문자열이 들어있나 찾을 수 있다. 가장 처음 찾은 문자열의 위치를 반환한다. - - ​ 찾지못하면 문자열의 끝 위치인string::npos를 반환 - -- split : 지원을 안하니 외워 놓기 - 리스트로 받아서 주로 사용 - -## [reverse] - -```c++ -string s = "Hello World"; -int main() -{ - reverse(s.begin(), s.end()); - cout << s ; - return 0; -} -``` - -``` ->>> dlroW olleH -``` - -```c++ -string s = "Hello World"; - -int main() -{ - reverse(s.begin()+ 1, s.begin()+ 4); - cout << s ; - - return 0; -} -``` - -``` ->>> Hlleo World -``` - -## [substr] - -```c++ -string s = "Hello World"; - -int main() -{ - cout << s.substr(0, 4); -} -``` - -``` ->>> Hell -``` - -## [find] - -```c++ -string s = "Hello World"; - -int main() -{ - cout << s.find("o") << "\n"; - cout << s.find("k") << "\n"; - if(s.find("k") == string::npos) - { - cout << "NO"; - } -} -``` - -``` ->>> 4 ->>> 4294967295 ->>> NO -``` - -## [split] - -```c++ -vector split(string input, string delimiter) -{ - vector ret; - long long pos = 0; - string token = ""; - - while((pos = input.find(delimiter)) != string::npos) - { - token = input.substr(0, pos); - ret.push_back(token); - input.erase(0, pos + delimiter.length()); - } - ret.push_back(input); - return ret; -} -``` - -예시) - -```c++ -int main() -{ - string s = "aa.bb.cc.dd.ee.ff.gg"; - vector a = split(s, "."); - - for(string b : a) cout << b << "\n"; -} -``` - -``` ->>> aa ->>> bb ->>> cc ->>> dd ->>> ee ->>> ff ->>> gg -``` \ No newline at end of file diff --git "a/\352\260\234\353\205\220\354\240\225\353\246\254/\354\236\205\354\266\234\353\240\245 \354\206\215\353\217\204 \355\226\245\354\203\201.md" "b/\352\260\234\353\205\220\354\240\225\353\246\254/\354\236\205\354\266\234\353\240\245 \354\206\215\353\217\204 \355\226\245\354\203\201.md" deleted file mode 100644 index a32b847..0000000 --- "a/\352\260\234\353\205\220\354\240\225\353\246\254/\354\236\205\354\266\234\353\240\245 \354\206\215\353\217\204 \355\226\245\354\203\201.md" +++ /dev/null @@ -1,60 +0,0 @@ - -### 입출력 속도 향상 -- 팁 - -
- -- #### cout << answer << endl; 은 사실 다음과 같다. -``` -cout << answer << '\n' << flush; -``` -개행 문자 출력 후 매번 flush 를 수행하기 때문에, 시간 초과의 원인이 될 수 있다. - -
- -- #### ostringstream 을 이용해 개선하는 방법 -``` -#include - -void printA(int i) -{ - ostringstream oss; - - while (0 < i--) - oss << "A" << endl; - - cout << oss.str(); -} -``` -flush 를 하되, 출력하지는 않다가 한 번에 출력하는 것이다. - -
- -- #### 더 좋은 방법은 그냥 '\n' 을 출력하는 것이다. -``` -void printA(int i) -{ - while (0 < i--) - cout << "A" << '\n'; -} -``` - -
- -- #### 추가적인 입출력 속도 최적화 -C 와 C++ 의 입출력 동기화를 해제하고 독립적인 버퍼를 사용하도록 한다.
-입출력 속도는 향상되지만, cin/cout 을 scanf/printf/getchar 등과 함께 사용할 수 없게 된다. -``` -ios_base::sync_with_stdio(false); -``` -cin 이 입력을 받기 전에 cout 을 flush 하는 tie 동작을 수행하지 않도록 한다. -``` -cin.tie(NULL); -``` -이 코드는 의미가 없다고 하는데 테스트해 본 결과 조금 더 빨라지긴 한다. -``` -cout.tie(NULL); -``` -[[C++] sync_with_stdio() 와 cin.tie()](https://nerdooit.github.io/2020/06/20/cpp_fastio.html) - -[cout, cin 최적화 방법과 주의점](https://leeeegun.tistory.com/4) diff --git "a/\352\260\234\353\205\220\354\240\225\353\246\254/\354\236\220\353\243\214\352\265\254\354\241\260.md" "b/\352\260\234\353\205\220\354\240\225\353\246\254/\354\236\220\353\243\214\352\265\254\354\241\260.md" deleted file mode 100644 index b46bbbe..0000000 --- "a/\352\260\234\353\205\220\354\240\225\353\246\254/\354\236\220\353\243\214\352\265\254\354\241\260.md" +++ /dev/null @@ -1,4 +0,0 @@ -## 자료구조 - -### pair 와 tuple - diff --git "a/\352\260\234\353\205\220\354\240\225\353\246\254/\354\236\220\354\243\274 \354\202\254\354\232\251\355\225\230\353\212\224 \353\235\274\354\235\264\353\270\214\353\237\254\353\246\254.md" "b/\352\260\234\353\205\220\354\240\225\353\246\254/\354\236\220\354\243\274 \354\202\254\354\232\251\355\225\230\353\212\224 \353\235\274\354\235\264\353\270\214\353\237\254\353\246\254.md" deleted file mode 100644 index c4c612a..0000000 --- "a/\352\260\234\353\205\220\354\240\225\353\246\254/\354\236\220\354\243\274 \354\202\254\354\232\251\355\225\230\353\212\224 \353\235\274\354\235\264\353\270\214\353\237\254\353\246\254.md" +++ /dev/null @@ -1,3 +0,0 @@ -### 자주 사용하는 라이브러리 - -#### [] \ No newline at end of file diff --git "a/\353\260\261\354\244\200/Silver/1213.\342\200\205\355\214\260\353\246\260\353\223\234\353\241\254\342\200\205\353\247\214\353\223\244\352\270\260/README.md" "b/\353\260\261\354\244\200/Silver/1213.\342\200\205\355\214\260\353\246\260\353\223\234\353\241\254\342\200\205\353\247\214\353\223\244\352\270\260/README.md" new file mode 100644 index 0000000..314fa99 --- /dev/null +++ "b/\353\260\261\354\244\200/Silver/1213.\342\200\205\355\214\260\353\246\260\353\223\234\353\241\254\342\200\205\353\247\214\353\223\244\352\270\260/README.md" @@ -0,0 +1,30 @@ +# [Silver III] 팰린드롬 만들기 - 1213 + +[문제 링크](https://www.acmicpc.net/problem/1213) + +### 성능 요약 + +메모리: 2024 KB, 시간: 0 ms + +### 분류 + +그리디 알고리즘(greedy), 구현(implementation), 문자열(string) + +### 문제 설명 + +

임한수와 임문빈은 서로 사랑하는 사이이다.

+ +

임한수는 세상에서 팰린드롬인 문자열을 너무 좋아하기 때문에, 둘의 백일을 기념해서 임문빈은 팰린드롬을 선물해주려고 한다.

+ +

임문빈은 임한수의 영어 이름으로 팰린드롬을 만들려고 하는데, 임한수의 영어 이름의 알파벳 순서를 적절히 바꿔서 팰린드롬을 만들려고 한다.

+ +

임문빈을 도와 임한수의 영어 이름을 팰린드롬으로 바꾸는 프로그램을 작성하시오.

+ +### 입력 + +

첫째 줄에 임한수의 영어 이름이 있다. 알파벳 대문자로만 된 최대 50글자이다.

+ +### 출력 + +

첫째 줄에 문제의 정답을 출력한다. 만약 불가능할 때는 "I'm Sorry Hansoo"를 출력한다. 정답이 여러 개일 경우에는 사전순으로 앞서는 것을 출력한다.

+ diff --git "a/\353\260\261\354\244\200/Silver/1213.\342\200\205\355\214\260\353\246\260\353\223\234\353\241\254\342\200\205\353\247\214\353\223\244\352\270\260/\355\214\260\353\246\260\353\223\234\353\241\254\342\200\205\353\247\214\353\223\244\352\270\260.cc" "b/\353\260\261\354\244\200/Silver/1213.\342\200\205\355\214\260\353\246\260\353\223\234\353\241\254\342\200\205\353\247\214\353\223\244\352\270\260/\355\214\260\353\246\260\353\223\234\353\241\254\342\200\205\353\247\214\353\223\244\352\270\260.cc" new file mode 100644 index 0000000..ee28e45 --- /dev/null +++ "b/\353\260\261\354\244\200/Silver/1213.\342\200\205\355\214\260\353\246\260\353\223\234\353\241\254\342\200\205\353\247\214\353\223\244\352\270\260/\355\214\260\353\246\260\353\223\234\353\241\254\342\200\205\353\247\214\353\223\244\352\270\260.cc" @@ -0,0 +1,56 @@ +#include +#include + +int main() +{ + std::string input; + int alphabet[26]{}; + char forward[50]; + int word_length; + int index = 0; + int mid = -1; + + std::cin >> input; + word_length = input.length(); + + for (int i = 0; i < word_length; i++) + { + alphabet[input[i] - 'A']++; + } + + for (int i = 0; i < 26; i++) + { + if (alphabet[i] % 2 == 1) + { + if (mid == -1) + { + mid = i; + } + else + { + std::cout << "I'm Sorry Hansoo\n"; + return 0; + } + } + + for (int j = 0; j< alphabet[i] / 2; j++) + { + forward[index++] = (char)('A' + i); + } + } + + if (mid != -1) + { + forward[index] = ('A' + mid); + } + + for (int i = 0; i < index; i++) + { + forward[word_length - i - 1] = forward[i]; + } + forward[word_length] = '\0'; + + std::cout << forward << "\n"; + + return 0; +} \ No newline at end of file diff --git "a/\353\260\261\354\244\200/Silver/1620.\342\200\205\353\202\230\353\212\224\354\225\274\342\200\205\355\217\254\354\274\223\353\252\254\342\200\205\353\247\210\354\212\244\355\204\260\342\200\205\354\235\264\353\213\244\354\206\234/README.md" "b/\353\260\261\354\244\200/Silver/1620.\342\200\205\353\202\230\353\212\224\354\225\274\342\200\205\355\217\254\354\274\223\353\252\254\342\200\205\353\247\210\354\212\244\355\204\260\342\200\205\354\235\264\353\213\244\354\206\234/README.md" new file mode 100644 index 0000000..e74e6ef --- /dev/null +++ "b/\353\260\261\354\244\200/Silver/1620.\342\200\205\353\202\230\353\212\224\354\225\274\342\200\205\355\217\254\354\274\223\353\252\254\342\200\205\353\247\210\354\212\244\355\204\260\342\200\205\354\235\264\353\213\244\354\206\234/README.md" @@ -0,0 +1,134 @@ +# [Silver IV] 나는야 포켓몬 마스터 이다솜 - 1620 + +[문제 링크](https://www.acmicpc.net/problem/1620) + +### 성능 요약 + +메모리: 25528 KB, 시간: 200 ms + +### 분류 + +자료 구조(data_structures), 해시를 사용한 집합과 맵(hash_set) + +### 문제 설명 + +

+ +

안녕? 내 이름은 이다솜. 나의 꿈은 포켓몬 마스터야. 일단 포켓몬 마스터가 되기 위해선 포켓몬을 한 마리 잡아야겠지? 근처 숲으로 가야겠어.

+ +

(뚜벅 뚜벅)

+ +

얏! 꼬렛이다. 꼬렛? 귀여운데, 나의 첫 포켓몬으로 딱 어울린데? 내가 잡고 말겠어. 가라! 몬스터볼~

+ +

(펑!) 헐랭... 왜 안 잡히지?ㅜㅜ 몬스터 볼만 던지면 되는 게 아닌가...ㅜㅠ

+ +

(터벅터벅)

+ +

어? 누구지?

+ +

+ +

오박사 : 나는 태초마을의 포켓몬 박사 오민식 박사라네. 다솜아, 포켓몬을 잡을 때는, 일단 상대 포켓몬의 체력을 적당히 바닥으로 만들어놓고 몬스터 볼을 던져야 한단다. 자, 내 포켓몬 이상해꽃으로 한번 잡아보렴. 포켓몬의 기술을 쓰는 것을 보고 포켓몬을 줄지 안줄지 결정을 하겠네. 자 한번 해보아라. 다솜아.

+ +

이다솜 : 이상해꽃이라...음.. 꽃이니깐 왠지 햇빛을 받아서 공격을 할 것 같은데... 음... 이상해꽃! 햇빛공격!!!

+ +

(꼬렛이 이상해꽃에게 공격을 받아 체력이 25 감소했다.) 가라! 몬스터 볼!!! (꼬렛을 잡았습니다.) 야호! 신난다. 꼬렛을 잡았다.

+ +

오박사 : 오우!! 방금 쓴 공격은 솔라빔이라고 하네.. 어떻게 공격을 한 건가? 솔라빔이란 공격에 대해서 공부를 한 건가?

+ +

이다솜 : 꽃이니깐 왠지 햇빛을 제대로 받으면 광합성을 해서 음.. 그냥 그럴 것 같아서요 ☞☜

+ +

오박사 : 다른 아이들은 넝쿨채찍이나, 나뭇잎 공격을 하는데, 다솜이는 역시 뭔가 다르구나. 그럼 나와 함께 연구소로 가자꾸나. 내가 포켓몬을 한 마리 줄 테니, 너의 꿈을 펼쳐보아라. 꿈은 이루어진단다.

+ +

이다솜 : 네! 오박사님, 고마워요.ㅜㅜ

+ +

오박사 : 가자. 나의 연구소는 너의 옆집의 아랫집이란다. 같이 가도록하자. 지금 포켓몬을 주마.

+ +

이다솜 : 네. 야호!!

+ +

'

+ +

오영식 : 어? 오박사님 얘는 누구인가요?

+ +

+ +

오박사 : 얘는 너의 라이벌이 될 친구 이다솜이라고 하네. 자, 포켓몬을 한 마리 골라보도록 해봐라 다솜아. 레이디퍼스트 네가 먼저 골라봐라.

+ +

이다솜 : 저는 생각해둔 포켓몬이 있어요. 피카츄 골라도 될까요?

+ +

오박사 : 그래 여기 피카츄가 한 마리 있단다. 피카츄를 가져가거라.

+ +

오영식 : 그럼 저는 이브이를 가져가겠어요. 그럼 나중에 보자 이다솜.

+ +

이다솜 : 그럼 꼬렛을 다시 잡으러 가야겠다. 영식아, 그리고 민식박사님 빠잉!

+ +

+ +

이다솜 : 피카츄 공격!

+ +

+ +

가라 몬스터 볼!

+ +

+ +

이다솜 : 야호! 신난다. 꼬렛을 잡았다!!!!!

+ +

이다솜 : 그럼! 일단 사천왕을 이기고 오겠어!

+ +

+ +

이다솜 : 여기가 사천왕과 대결하려면 가야하는 곳인가..

+ +

+ +

경비원 : 사천왕과 대결을 하려면, 마을의 체육관 리더를 이겨서 배지를 8개를 모아야 한다네... 배지를 모아서 오도록 하게

+ +

이다솜 : 잉ㅠㅜ... 그럼 배지부터 모아야 하는구나ㅠㅜㅠㅜ 나쁘당 그냥 좀 봐주지..

+ +

<1 년 후>

+ +

그동안의 줄거리 : 이다솜은 일단 상록 숲의 체육관 리더에게 도전을 했다. 하지만 상록숲 체육관의 리더는 실종된 상태. 따라서 회색마을부터 도전하기로 했다. 체육관의 리더를 이기면서, 로켓단을 해체시키기도 하고, 여러 가지 사건도 있었다. 결국 전설의 포켓몬도 잡고, 이제 사천왕을 이기려고 도전하기로 했다. 사천왕은 모두 가볍게 이기고, 이제 마지막 라이벌 오!영!식! 이다.

+ +

+ +

오영식 : 훗. 1년 전의 그 이다솜이 사천왕을 이기고 현재 포켓몬 마스터인 나에게 덤벼? 어디 한번 덤벼보시지.

+ +

이다솜 : 헐랭... 나를 우습게보네.... 한번 두고 보시지! 그럼 대결이닷!

+ +

+ +

+ +

+ +

+ +

+ +

+ +

+ +

+ +

이다솜 : 휴... 이겼다.

+ +

오영식 : 내가 지다니 분하다. ㅜㅜ

+ +

오박사 : 그럼 다솜아 이제 진정한 포켓몬 마스터가 되기 위해 도감을 완성시키도록 하여라. 일단 네가 현재 가지고 있는 포켓몬 도감에서 포켓몬의 이름을 보면 포켓몬의 번호를 말하거나, 포켓몬의 번호를 보면 포켓몬의 이름을 말하는 연습을 하도록 하여라. 나의 시험을 통과하면, 내가 새로 만든 도감을 주도록 하겠네.

+ +### 입력 + +

첫째 줄에는 도감에 수록되어 있는 포켓몬의 개수 N이랑 내가 맞춰야 하는 문제의 개수 M이 주어져. N과 M은 1보다 크거나 같고, 100,000보다 작거나 같은 자연수인데, 자연수가 뭔지는 알지? 모르면 물어봐도 괜찮아. 나는 언제든지 질문에 답해줄 준비가 되어있어.

+ +

둘째 줄부터 N개의 줄에 포켓몬의 번호가 1번인 포켓몬부터 N번에 해당하는 포켓몬까지 한 줄에 하나씩 입력으로 들어와. 포켓몬의 이름은 모두 영어로만 이루어져있고, 또, 음... 첫 글자만 대문자이고, 나머지 문자는 소문자로만 이루어져 있어. 아참! 일부 포켓몬은 마지막 문자만 대문자일 수도 있어. 포켓몬 이름의 최대 길이는 20, 최소 길이는 2야. 그 다음 줄부터 총 M개의 줄에 내가 맞춰야하는 문제가 입력으로 들어와. 문제가 알파벳으로만 들어오면 포켓몬 번호를 말해야 하고, 숫자로만 들어오면, 포켓몬 번호에 해당하는 문자를 출력해야해. 입력으로 들어오는 숫자는 반드시 1보다 크거나 같고, N보다 작거나 같고, 입력으로 들어오는 문자는 반드시 도감에 있는 포켓몬의 이름만 주어져. 그럼 화이팅!!!

+ +### 출력 + +

첫째 줄부터 차례대로 M개의 줄에 각각의 문제에 대한 답을 말해줬으면 좋겠어!!!. 입력으로 숫자가 들어왔다면 그 숫자에 해당하는 포켓몬의 이름을, 문자가 들어왔으면 그 포켓몬의 이름에 해당하는 번호를 출력하면 돼. 그럼 땡큐~

+ +

+ +

이게 오박사님이 나에게 새로 주시려고 하는 도감이야. 너무 가지고 싶다ㅠㅜ. 꼭 만점을 받아줬으면 좋겠어!! 파이팅!!!

+ diff --git "a/\353\260\261\354\244\200/Silver/1620.\342\200\205\353\202\230\353\212\224\354\225\274\342\200\205\355\217\254\354\274\223\353\252\254\342\200\205\353\247\210\354\212\244\355\204\260\342\200\205\354\235\264\353\213\244\354\206\234/\353\202\230\353\212\224\354\225\274\342\200\205\355\217\254\354\274\223\353\252\254\342\200\205\353\247\210\354\212\244\355\204\260\342\200\205\354\235\264\353\213\244\354\206\234.cc" "b/\353\260\261\354\244\200/Silver/1620.\342\200\205\353\202\230\353\212\224\354\225\274\342\200\205\355\217\254\354\274\223\353\252\254\342\200\205\353\247\210\354\212\244\355\204\260\342\200\205\354\235\264\353\213\244\354\206\234/\353\202\230\353\212\224\354\225\274\342\200\205\355\217\254\354\274\223\353\252\254\342\200\205\353\247\210\354\212\244\355\204\260\342\200\205\354\235\264\353\213\244\354\206\234.cc" new file mode 100644 index 0000000..79f0b79 --- /dev/null +++ "b/\353\260\261\354\244\200/Silver/1620.\342\200\205\353\202\230\353\212\224\354\225\274\342\200\205\355\217\254\354\274\223\353\252\254\342\200\205\353\247\210\354\212\244\355\204\260\342\200\205\354\235\264\353\213\244\354\206\234/\353\202\230\353\212\224\354\225\274\342\200\205\355\217\254\354\274\223\353\252\254\342\200\205\353\247\210\354\212\244\355\204\260\342\200\205\354\235\264\353\213\244\354\206\234.cc" @@ -0,0 +1,44 @@ +#include +#include +#include + +int main() +{ + int i; + std::map name_map; + std::map index_map; + + int pokedex_length, problem_length; + + std::cin >> pokedex_length; + std::cin >> problem_length; + + std::string input; + + std::ios::sync_with_stdio(false); + std::cin.tie(NULL); + std::cout.tie(NULL); + + for (i = 0; i < pokedex_length; i++) + { + std::cin >> input; + name_map[input] = i; + index_map[i] = input; + } + + for (i = 0; i < problem_length; i++) + { + std::cin >> input; + + if (47 < input[0] && input[0] < 58) + { + std::cout << index_map[std::stoi(input) - 1] << '\n'; + } + else + { + std::cout << name_map[input]+1 << '\n'; + } + } + + return 0; +} \ No newline at end of file diff --git "a/\353\260\261\354\244\200/Silver/1629.\342\200\205\352\263\261\354\205\210/README.md" "b/\353\260\261\354\244\200/Silver/1629.\342\200\205\352\263\261\354\205\210/README.md" new file mode 100644 index 0000000..ef077d5 --- /dev/null +++ "b/\353\260\261\354\244\200/Silver/1629.\342\200\205\352\263\261\354\205\210/README.md" @@ -0,0 +1,24 @@ +# [Silver I] 곱셈 - 1629 + +[문제 링크](https://www.acmicpc.net/problem/1629) + +### 성능 요약 + +메모리: 2020 KB, 시간: 0 ms + +### 분류 + +분할 정복을 이용한 거듭제곱(exponentiation_by_squaring), 수학(math) + +### 문제 설명 + +

자연수 A를 B번 곱한 수를 알고 싶다. 단 구하려는 수가 매우 커질 수 있으므로 이를 C로 나눈 나머지를 구하는 프로그램을 작성하시오.

+ +### 입력 + +

첫째 줄에 A, B, C가 빈 칸을 사이에 두고 순서대로 주어진다. A, B, C는 모두 2,147,483,647 이하의 자연수이다.

+ +### 출력 + +

첫째 줄에 A를 B번 곱한 수를 C로 나눈 나머지를 출력한다.

+ diff --git "a/\353\260\261\354\244\200/Silver/1629.\342\200\205\352\263\261\354\205\210/\352\263\261\354\205\210.cc" "b/\353\260\261\354\244\200/Silver/1629.\342\200\205\352\263\261\354\205\210/\352\263\261\354\205\210.cc" new file mode 100644 index 0000000..8e8dcdc --- /dev/null +++ "b/\353\260\261\354\244\200/Silver/1629.\342\200\205\352\263\261\354\205\210/\352\263\261\354\205\210.cc" @@ -0,0 +1,34 @@ +#include + +using namespace std; + +int myPow(long long int n, long long int m, long long int C) +{ + long long int res; + if (m == 1) + return n % C; + + res = myPow(n, m / 2, C) % C; + if (m % 2 == 1) + return res * res % C * n % C; + return res * res % C; +} + +int main() +{ + std::ios::sync_with_stdio(false); + std::cin.tie(NULL); + std::cout.tie(NULL); + + int A, B, C; + double pow_double; + int res; + + cin >> A >> B >> C; + + res = myPow(A, B, C); + + cout << res; + + return 0; +} \ No newline at end of file diff --git "a/\353\260\261\354\244\200/Silver/1940.\342\200\205\354\243\274\353\252\275/README.md" "b/\353\260\261\354\244\200/Silver/1940.\342\200\205\354\243\274\353\252\275/README.md" new file mode 100644 index 0000000..ba66d90 --- /dev/null +++ "b/\353\260\261\354\244\200/Silver/1940.\342\200\205\354\243\274\353\252\275/README.md" @@ -0,0 +1,26 @@ +# [Silver IV] 주몽 - 1940 + +[문제 링크](https://www.acmicpc.net/problem/1940) + +### 성능 요약 + +메모리: 2200 KB, 시간: 4 ms + +### 분류 + +정렬(sorting), 두 포인터(two_pointer) + +### 문제 설명 + +

주몽은 철기군을 양성하기 위한 프로젝트에 나섰다. 그래서 야철대장을 통해 철기군이 입을 갑옷을 만들게 하였다. 야철대장은 주몽의 명에 따르기 위하여 연구에 착수하던 중 아래와 같은 사실을 발견하게 되었다.

+ +

갑옷을 만드는 재료들은 각각 고유한 번호를 가지고 있다. 갑옷은 두 개의 재료로 만드는데 두 재료의 고유한 번호를 합쳐서 M(1 ≤ M ≤ 10,000,000)이 되면 갑옷이 만들어 지게 된다. 야철대장은 자신이 만들고 있는 재료를 가지고 갑옷을 몇 개나 만들 수 있는지 궁금해졌다. 이러한 궁금증을 풀어 주기 위하여 N(1 ≤ N ≤ 15,000) 개의 재료와 M이 주어졌을 때 몇 개의 갑옷을 만들 수 있는지를 구하는 프로그램을 작성하시오.

+ +### 입력 + +

첫째 줄에는 재료의 개수 N(1 ≤ N ≤ 15,000)이 주어진다. 그리고 두 번째 줄에는 갑옷을 만드는데 필요한 수 M(1 ≤ M ≤ 10,000,000) 주어진다. 그리고 마지막으로 셋째 줄에는 N개의 재료들이 가진 고유한 번호들이 공백을 사이에 두고 주어진다. 고유한 번호는 100,000보다 작거나 같은 자연수이다.

+ +### 출력 + +

첫째 줄에 갑옷을 만들 수 있는 개수를 출력한다.

+ diff --git "a/\353\260\261\354\244\200/Silver/1940.\342\200\205\354\243\274\353\252\275/\354\243\274\353\252\275.cc" "b/\353\260\261\354\244\200/Silver/1940.\342\200\205\354\243\274\353\252\275/\354\243\274\353\252\275.cc" new file mode 100644 index 0000000..faf7fde --- /dev/null +++ "b/\353\260\261\354\244\200/Silver/1940.\342\200\205\354\243\274\353\252\275/\354\243\274\353\252\275.cc" @@ -0,0 +1,48 @@ +#include +#include + +int main() +{ + std::ios::sync_with_stdio(false); + std::cin.tie(NULL); + std::cout.tie(NULL); + + int length, require, count = 0; + int *materials; + int *max, *min; + + std::cin >> length; + std::cin >> require; + + // 재료들 입력 + materials = new int[length]; + for (int i = 0; i < length; i++) + std::cin >> materials[i]; + + // 재료 정렬 + std::sort(materials, materials + length); + + // 앞뒤로 포인터 생성 + min = materials; + max = materials + length - 1; + + // 포인터가 서로 교차되면 종료 + while (min < max) + { + // 요구 값과 일치하면 카운트하고 양쪽 포인터 이동 + if (*min + *max == require) + { + count++; + min++; + max--; + } + else if (*min + *max < require) + min++; + else + max--; + } + + std::cout << count; + + return 0; +} \ No newline at end of file diff --git "a/\353\260\261\354\244\200/Silver/3986.\342\200\205\354\242\213\354\235\200\342\200\205\353\213\250\354\226\264/README.md" "b/\353\260\261\354\244\200/Silver/3986.\342\200\205\354\242\213\354\235\200\342\200\205\353\213\250\354\226\264/README.md" new file mode 100644 index 0000000..8d394b0 --- /dev/null +++ "b/\353\260\261\354\244\200/Silver/3986.\342\200\205\354\242\213\354\235\200\342\200\205\353\213\250\354\226\264/README.md" @@ -0,0 +1,28 @@ +# [Silver IV] 좋은 단어 - 3986 + +[문제 링크](https://www.acmicpc.net/problem/3986) + +### 성능 요약 + +메모리: 2508 KB, 시간: 16 ms + +### 분류 + +자료 구조(data_structures), 스택(stack) + +### 문제 설명 + +

이번 계절학기에 심리학 개론을 수강 중인 평석이는 오늘 자정까지 보고서를 제출해야 한다. 보고서 작성이 너무 지루했던 평석이는 노트북에 엎드려서 꾸벅꾸벅 졸다가 제출 마감 1시간 전에 깨고 말았다. 안타깝게도 자는 동안 키보드가 잘못 눌려서 보고서의 모든 글자가 A와 B로 바뀌어 버렸다! 그래서 평석이는 보고서 작성을 때려치우고 보고서에서 '좋은 단어'나 세보기로 마음 먹었다.

+ +

평석이는 단어 위로 아치형 곡선을 그어 같은 글자끼리(A는 A끼리, B는 B끼리) 쌍을 짓기로 하였다. 만약 선끼리 교차하지 않으면서 각 글자를 정확히 한 개의 다른 위치에 있는 같은 글자와 짝 지을수 있다면, 그 단어는 '좋은 단어'이다. 평석이가 '좋은 단어' 개수를 세는 것을 도와주자.

+ +### 입력 + +

첫째 줄에 단어의 수 N이 주어진다. (1 ≤ N ≤ 100)

+ +

다음 N개 줄에는 A와 B로만 이루어진 단어가 한 줄에 하나씩 주어진다. 단어의 길이는 2와 100,000사이이며, 모든 단어 길이의 합은 1,000,000을 넘지 않는다.

+ +### 출력 + +

첫째 줄에 좋은 단어의 수를 출력한다.

+ diff --git "a/\353\260\261\354\244\200/Silver/3986.\342\200\205\354\242\213\354\235\200\342\200\205\353\213\250\354\226\264/\354\242\213\354\235\200\342\200\205\353\213\250\354\226\264.cc" "b/\353\260\261\354\244\200/Silver/3986.\342\200\205\354\242\213\354\235\200\342\200\205\353\213\250\354\226\264/\354\242\213\354\235\200\342\200\205\353\213\250\354\226\264.cc" new file mode 100644 index 0000000..e90f0af --- /dev/null +++ "b/\353\260\261\354\244\200/Silver/3986.\342\200\205\354\242\213\354\235\200\342\200\205\353\213\250\354\226\264/\354\242\213\354\235\200\342\200\205\353\213\250\354\226\264.cc" @@ -0,0 +1,58 @@ +#include +#include +#include + +using namespace std; + +int main() +{ + int n, count=0; + string* words; + stack s; + char top; + + cin >> n; + + // 단어 입력 받기 + words = new string[n]; + for (int i = 0; i < n; i++) + { + cin >> words[i]; + } + + // 각 단어를 판별 + for (int i = 0; i < n; i++) + { + for (char alpha : words[i]) + { + // 스택이 비었으면 일단 삽입 + if (s.empty()) + { + s.push(alpha); + } + // alpha와 top이 같으면 top을 뺀다. + else if (s.top() == alpha) + { + s.pop(); + } + // alpha와 top이 다르면 alpha를 스택에 삽입 + else + { + s.push(alpha); + } + } + // 스택에 남은 값이 없으면 좋은 단어로 카운트 + if (s.empty()) + { + count++; + } + // 스택 비우기 + while (!s.empty()) + { + s.pop(); + } + } + cout << count << "\n"; + + return 0; +} \ No newline at end of file diff --git "a/\353\260\261\354\244\200/Silver/9375.\342\200\205\355\214\250\354\205\230\354\231\225\342\200\205\354\213\240\355\225\264\353\271\210/README.md" "b/\353\260\261\354\244\200/Silver/9375.\342\200\205\355\214\250\354\205\230\354\231\225\342\200\205\354\213\240\355\225\264\353\271\210/README.md" new file mode 100644 index 0000000..ffc489a --- /dev/null +++ "b/\353\260\261\354\244\200/Silver/9375.\342\200\205\355\214\250\354\205\230\354\231\225\342\200\205\354\213\240\355\225\264\353\271\210/README.md" @@ -0,0 +1,31 @@ +# [Silver III] 패션왕 신해빈 - 9375 + +[문제 링크](https://www.acmicpc.net/problem/9375) + +### 성능 요약 + +메모리: 2032 KB, 시간: 0 ms + +### 분류 + +조합론(combinatorics), 자료 구조(data_structures), 해시를 사용한 집합과 맵(hash_set), 수학(math) + +### 문제 설명 + +

해빈이는 패션에 매우 민감해서 한번 입었던 옷들의 조합을 절대 다시 입지 않는다. 예를 들어 오늘 해빈이가 안경, 코트, 상의, 신발을 입었다면, 다음날은 바지를 추가로 입거나 안경대신 렌즈를 착용하거나 해야한다. 해빈이가 가진 의상들이 주어졌을때 과연 해빈이는 알몸이 아닌 상태로 며칠동안 밖에 돌아다닐 수 있을까?

+ +### 입력 + +

첫째 줄에 테스트 케이스가 주어진다. 테스트 케이스는 최대 100이다.

+ +
    +
  • 각 테스트 케이스의 첫째 줄에는 해빈이가 가진 의상의 수 n(0 ≤ n ≤ 30)이 주어진다.
  • +
  • 다음 n개에는 해빈이가 가진 의상의 이름과 의상의 종류가 공백으로 구분되어 주어진다. 같은 종류의 의상은 하나만 입을 수 있다.
  • +
+ +

모든 문자열은 1이상 20이하의 알파벳 소문자로 이루어져있으며 같은 이름을 가진 의상은 존재하지 않는다.

+ +### 출력 + +

각 테스트 케이스에 대해 해빈이가 알몸이 아닌 상태로 의상을 입을 수 있는 경우를 출력하시오.

+ diff --git "a/\353\260\261\354\244\200/Silver/9375.\342\200\205\355\214\250\354\205\230\354\231\225\342\200\205\354\213\240\355\225\264\353\271\210/\355\214\250\354\205\230\354\231\225\342\200\205\354\213\240\355\225\264\353\271\210.cc" "b/\353\260\261\354\244\200/Silver/9375.\342\200\205\355\214\250\354\205\230\354\231\225\342\200\205\354\213\240\355\225\264\353\271\210/\355\214\250\354\205\230\354\231\225\342\200\205\354\213\240\355\225\264\353\271\210.cc" new file mode 100644 index 0000000..653bc75 --- /dev/null +++ "b/\353\260\261\354\244\200/Silver/9375.\342\200\205\355\214\250\354\205\230\354\231\225\342\200\205\354\213\240\355\225\264\353\271\210/\355\214\250\354\205\230\354\231\225\342\200\205\354\213\240\355\225\264\353\271\210.cc" @@ -0,0 +1,49 @@ +#include +#include +#include +#include + +int main() +{ + std::ios::sync_with_stdio(false); + std::cin.tie(NULL); + std::cout.tie(NULL); + + int case_length, clothes_length; + std::string clothes_type, clothes_name; + std::map clothes_map; + int i, j, res; + + std::cin >> case_length; + + for (i = 0; i < case_length; i++) + { + std::cin >> clothes_length; + + for (j = 0; j < clothes_length; j++) + { + std::cin >> clothes_name; + std::cin >> clothes_type; + + if (clothes_map.find(clothes_type) != clothes_map.end()) + { + clothes_map[clothes_type]++; + } + else + { + clothes_map[clothes_type] = 1; + } + } + + res = 1; + for (auto it = clothes_map.begin(); it != clothes_map.end(); it++) + { + res *= (it->second + 1); + } + + std::cout << res - 1 << "\n"; + clothes_map.clear(); + } + + return 0; +} \ No newline at end of file