From 5588f95570ac6ad176931688a02cc284e5fe31bb Mon Sep 17 00:00:00 2001 From: Subeen Date: Mon, 14 Mar 2022 10:40:05 +0900 Subject: [PATCH 1/2] =?UTF-8?q?[=EB=A7=B5=EA=B3=BC=20=EC=85=8B]=203?= =?UTF-8?q?=EC=9B=94=208=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 2776 --- .../2776.cpp" | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 "[\353\247\265\352\263\274 \354\205\213] 3\354\233\224 8\354\235\274/2776.cpp" diff --git "a/[\353\247\265\352\263\274 \354\205\213] 3\354\233\224 8\354\235\274/2776.cpp" "b/[\353\247\265\352\263\274 \354\205\213] 3\354\233\224 8\354\235\274/2776.cpp" new file mode 100644 index 0000000..a2f8f5c --- /dev/null +++ "b/[\353\247\265\352\263\274 \354\205\213] 3\354\233\224 8\354\235\274/2776.cpp" @@ -0,0 +1,42 @@ +// +// Created by Subeen on 3/14/2022. +// +#include +#include +#include + +using namespace std; + +int main() { + ios_base::sync_with_stdio(false); + cin.tie(NULL); + cout.tie(NULL); + + int t, n, m, input; + vector v1, v2; + + cin >> t; + cin >> n; + // vector v1에 수첩1 정수 저장 + for (int i = 0; i < n; i++) { + cin >> input; + v1.push_back(input); + } + + cin >> m; + // vector v2에 수첩2 정수 저장 + for (int i = 0; i < m; i++) { + cin >> input; + v2.push_back(input); + } + // 수첩2의 정수가 수첩1에 있는지 확인 (수첩2 정수의 순서대로, 수첩1에 있으면 1, 없으면 0) + for (int i = 0; i < m; i++) { + // 수첩1에 수첩2의 정수가 없을 때 -> 0 + if (find(v1.begin(), v1.end(), v2[i]) == v1.end()) { + cout << 0 << '\n'; + } else { // 수첩1에 수첩2의 정수가 있을 때 -> 1 + cout << 1 << '\n'; + } + } + return 0; +} From 3e2c4b52d431b9ec55432b32fc2683d523a618ab Mon Sep 17 00:00:00 2001 From: Subeen Date: Tue, 15 Mar 2022 23:27:56 +0900 Subject: [PATCH 2/2] =?UTF-8?q?[=EB=A7=B5=EA=B3=BC=EC=85=8B]=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=EC=A0=9C=EC=B6=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 2776, 11478, 19583 --- .../11478_sample.cpp" | 33 +++++++++++++ .../19583_sample.cpp" | 41 ++++++++++++++++ .../2776_sample1.cpp" | 45 +++++++++++++++++ .../2776_sample2.cpp" | 49 +++++++++++++++++++ 4 files changed, 168 insertions(+) create mode 100644 "[\353\247\265\352\263\274 \354\205\213] 3\354\233\224 8\354\235\274/11478_sample.cpp" create mode 100644 "[\353\247\265\352\263\274 \354\205\213] 3\354\233\224 8\354\235\274/19583_sample.cpp" create mode 100644 "[\353\247\265\352\263\274 \354\205\213] 3\354\233\224 8\354\235\274/2776_sample1.cpp" create mode 100644 "[\353\247\265\352\263\274 \354\205\213] 3\354\233\224 8\354\235\274/2776_sample2.cpp" diff --git "a/[\353\247\265\352\263\274 \354\205\213] 3\354\233\224 8\354\235\274/11478_sample.cpp" "b/[\353\247\265\352\263\274 \354\205\213] 3\354\233\224 8\354\235\274/11478_sample.cpp" new file mode 100644 index 0000000..82693bd --- /dev/null +++ "b/[\353\247\265\352\263\274 \354\205\213] 3\354\233\224 8\354\235\274/11478_sample.cpp" @@ -0,0 +1,33 @@ +#include +#include + +using namespace std; + +// 서로 다른 부분 문자열 구하는 함수 +int cntDiff(string s) { + set sub; // 중복 없이 부분 문자열 저장 + // 문자열의 길이만큼 반복 + for (int i = 0; i < s.length(); i++) { // 문자열 시작 부분 + string temp = ""; // 빈 문자열 temp 선언 + for (int j = i; j < s.length(); j++) { // 문자열 끝 부분 + temp += s[j]; // i-j 부분 문자열 + sub.insert(temp); // 삽입 + } + } + return sub.size(); // 부분 문자열 개수 return +} + +/** + * 중복을 제거해서 저장해주는 컨테이너인 set을 활용해서 풀이 가능 + * 삽입만 하므로 트리 구조 셋(set)이나 해시 구조 셋(unordered_set) 중 무엇을 쓰든 크게 상관 X + */ + +int main() { + string s; // 문자열 s 선언 + + // 입력 + cin >> s; // 입력 받은 문자열 저장 + // 연산 & 출력 + cout << cntDiff(s); // cntDiff(s)함수 호출 + return 0; +} \ No newline at end of file diff --git "a/[\353\247\265\352\263\274 \354\205\213] 3\354\233\224 8\354\235\274/19583_sample.cpp" "b/[\353\247\265\352\263\274 \354\205\213] 3\354\233\224 8\354\235\274/19583_sample.cpp" new file mode 100644 index 0000000..40da976 --- /dev/null +++ "b/[\353\247\265\352\263\274 \354\205\213] 3\354\233\224 8\354\235\274/19583_sample.cpp" @@ -0,0 +1,41 @@ +#include +#include + +using namespace std; + +/** + * 개강총회가 시작하기 전에 입장한 학회원을 먼저 map에 삽입 + * 개강총회를 끝내고 나서부터 스트리밍을 끝낼 때까지의 시간대의 채팅 기록을 보고 퇴장 여부 확인 + * -> 이때, 한 사람이 채팅 여러 개 남겼을 수 있으므로 이미 확인한 사람 체크하는 것이 중요 (map의 value 값 활용해서 체크) + * 시간은 문자열로 받아서 처리 (대소관계 숫자와 동일) + */ + +int main() { + // 로컬에서 편하게 확인하기 위해 파일로 입력을 받아서 사용! + // freopen("input.txt", "r", stdin); + + // 입출력 처리 속도 향상 + ios_base::sync_with_stdio(false); + cin.tie(NULL); + cout.tie(NULL); + + string s, e, q, t, name; // 문자열 s, e, q, t, name 선언 + map m; // 맵 m 선언 + int ans = 0; // 출석 확인된 학회원 인원 수 + + // 입력 & 연산 + cin >> s >> e >> q; // s, e, q 입력 받음 + while (cin >> t >> name) { // 입력이 있는 동안 반복 + if (t <= s) { // 개강총회 시작하기 전 입장 시간대 + m[name] = true; // 우선 저장 + } else if (t >= e && t <= q) { // 개강총회 끝 ~ 스트리밍 끝 시간대 + if (m[name]) { // 출석 확인 + ans++; // 출석 확인 학회원 수 증가 + m[name] = false; // 같은 사람 여러 번 출석 되면 안되므로 체크 + } + } + } + // 출력 + cout << ans << '\n'; + return 0; +} \ No newline at end of file diff --git "a/[\353\247\265\352\263\274 \354\205\213] 3\354\233\224 8\354\235\274/2776_sample1.cpp" "b/[\353\247\265\352\263\274 \354\205\213] 3\354\233\224 8\354\235\274/2776_sample1.cpp" new file mode 100644 index 0000000..d7ad573 --- /dev/null +++ "b/[\353\247\265\352\263\274 \354\205\213] 3\354\233\224 8\354\235\274/2776_sample1.cpp" @@ -0,0 +1,45 @@ +#include +#include +using namespace std; + +/** + * set을 이용한 풀이 + * 정렬을 할 필요가 없이, 삽입과 검색만 일어나는 문제 + * 입력의 수가 최대 1,000,000으로 삽입과 탐색이 많이 일어남 + * 따라서, O(log N)의 set이 아니라 O(1)인 unordered_set을 사용해서 풀이 + */ + +int main() { + // 입출력 처리 속도 향상을 위한 코드 + ios_base::sync_with_stdio(false); + cin.tie(NULL); + cout.tie(NULL); + + // 입력 + int t; // 정수형 변수 t 선언 + cin >> t; // t에 입력값 저장 + while(t--) { + int n, m, input; // 정수형 변수 n, m, input 선언 (n: 수첩1 정수 개수, m: 수첩2 정수 개수, input: 수첩의 정수) + unordered_set note1; // 정렬되지 않은 set note1 선언 + + // 수첩1에 해당되는 원소들을 unordered_set에 삽입 + cin >> n; // n에 입력값을 받음 + while (n--) { // 반복해서 수첩에 추가 + cin >> input; // input에 입력값을 받음 + note1.insert(input); // note1에 input 값 추가 + } + cin >> m; // m에 입력값을 받음 + while (m--) { // 반복해서 수첩에 추가 + cin >> input; // input에 입력값을 받음 + // 반복자를 이용해서 원소가 셋에 포함되어 있는지 확인 + auto iter = note1.find(input); + // 수첩1에 없이면 0, 있으면 1 출력 + if (iter == note1.end()) { + cout << "0\n"; + } else { + cout << "1\n"; + } + } + } + return 0; +} diff --git "a/[\353\247\265\352\263\274 \354\205\213] 3\354\233\224 8\354\235\274/2776_sample2.cpp" "b/[\353\247\265\352\263\274 \354\205\213] 3\354\233\224 8\354\235\274/2776_sample2.cpp" new file mode 100644 index 0000000..fef79e6 --- /dev/null +++ "b/[\353\247\265\352\263\274 \354\205\213] 3\354\233\224 8\354\235\274/2776_sample2.cpp" @@ -0,0 +1,49 @@ +#include +#include +#include + +using namespace std; + +/** + * 이분탐색을 이용한 풀이 + * O(n)의 시간복잡도를 갖는 선형탐색과 달리, 이분탐색은 O(logN)의 시간복잡도를 가짐 + */ + +int main() { + // 입출력 처리 속도 향상 + ios_base::sync_with_stdio(false); + cin.tie(NULL); + cout.tie(NULL); + + // 입력 + int t; // 정수형 변수 t 선언 + cin >> t; // t에 입력값 저장 + // 반복 + while (t--) { + int n, m, input; // 정수형 변수 n, m, input 선언 (n: 수첩1 정수 개수, m: 수첩2 정수 개수, input: 수첩의 정수) + + // 수첩1에 해당되는 원소들을 vector에 저장 + cin >> n; // n에 입력값 저장 + vector note1(n, 0); // vector note1 생성 + // 반복문을 이용해서 수첩1에 정수 저장 + for (int i = 0; i < n; i++) { + cin >> note1[i]; + } + // 이분탐색을 하기 위해 정렬 + sort(note1.begin(), note1.end()); + + cin >> m; // m에 입력값 저장 + while (m--) { + cin >> input; // input에 입력값 저장 + // 이분탐색 라이브러리 함수를 활용해, 원소가 수첩1에 엤는지 확인 + // binary_search() -> 이분탐색으로 원소가 있는지를 확인하고 결과를 리틴하는 함수 + // 수첩1에 없이면 0, 있으면 1 출력 + if (binary_search(note1.begin(), note1.end(), input)) { + cout << "1\n"; + } else { + cout << "0\n"; + } + } + } + return 0; +}