diff --git "a/10\354\233\224 5\354\235\274 - \353\266\204\355\225\240 \354\240\225\353\263\265/1244.cpp" "b/10\354\233\224 5\354\235\274 - \353\266\204\355\225\240 \354\240\225\353\263\265/1244.cpp" new file mode 100644 index 0000000..c130d2e --- /dev/null +++ "b/10\354\233\224 5\354\235\274 - \353\266\204\355\225\240 \354\240\225\353\263\265/1244.cpp" @@ -0,0 +1,59 @@ +/* + * [스위치 켜고 끄기] : https://www.acmicpc.net/problem/1244 + */ +#include +#include + +using namespace std; + +int n, m; +vector btn; + +void changeMale(int num) { + for (int i = num; i <= n; i += num) { //배수 + btn[i] = !btn[i]; //반대로 + } +} + +void changeFemale(int num) { + btn[num] = !btn[num]; //자기 자신 + int size = 0; + while (true) { + size++; + if (num + size > n || num - size < 1) break; //범위 벗어나면 + if (btn[num + size] != btn[num - size]) break; //같지 않으면 + btn[num + size] = !btn[num + size]; + btn[num - size] = !btn[num - size]; + } + +} + +int main() { + cin >> n; + btn.assign(n + 1, false); //스위치 인덱스 : 1~n + + bool val; + for (int i = 1; i <= n; i++) { + cin >> val; + btn[i] = val; + } + + cin >> m; + int gender, num; + while (m--) { + cin >> gender >> num; + //입력되는 순서대로 차례대로 + if (gender == 1) { + changeMale(num); + } else { + changeFemale(num); + } + } + + // 20개씩 출력 + for (int i = 1; i <= n; i++) { + cout << btn[i] << " "; + if (i % 20 == 0) cout << "\n"; + } + +} \ No newline at end of file diff --git "a/10\354\233\224 5\354\235\274 - \353\266\204\355\225\240 \354\240\225\353\263\265/16198.cpp" "b/10\354\233\224 5\354\235\274 - \353\266\204\355\225\240 \354\240\225\353\263\265/16198.cpp" new file mode 100644 index 0000000..0ff3815 --- /dev/null +++ "b/10\354\233\224 5\354\235\274 - \353\266\204\355\225\240 \354\240\225\353\263\265/16198.cpp" @@ -0,0 +1,60 @@ +/* + * [에너지 모으기] : https://www.acmicpc.net/problem/16198 + */ +#include +#include +#include + +using namespace std; +vector energy; +vector visited; +int n; +int ans = -2147000000; + +int computeEnergy(int x) { //구슬 x를 지웠을 때 얻을 수 있는 에너지 + int lower = x - 1, upper = x + 1; + //이미 지워진 구슬은 제외시켜야 함. + while (lower > 0) { + if (visited[lower]) lower--; + else break; + } + while (upper < n - 1) { + if (visited[upper]) upper++; + else break; + } + return energy[lower] * energy[upper]; +} + +void getEnergy(int size, int sum) { + if (size == 2) { //맨 왼쪽, 맨 오른쪽 2개만 남았을 때 + ans = max(sum, ans); + return; + } + + //나머지 중 고르기 + for (int i = 1; i < n - 1; i++) { + if (!visited[i]) { + //얻을 수 있는 에너지 + int energy_mul = computeEnergy(i); + visited[i] = 1; + getEnergy(size - 1, sum + energy_mul); + visited[i] = 0; + } + } +} + +int main() { + cin >> n; + energy.assign(n, 0); + visited.assign(n, 0); + for (int i = 0; i < n; i++) { + cin >> energy[i]; + } + + for (int i = 1; i < n - 1; i++) { //맨 처음, 맨 끝 빼고 + visited[i] = 1; + getEnergy(n - 1, energy[i - 1] * energy[i + 1]); //i번째를 고름. + visited[i] = 0; + } + cout << ans << "\n"; +} \ No newline at end of file diff --git "a/10\354\233\224 5\354\235\274 - \353\266\204\355\225\240 \354\240\225\353\263\265/17281.cpp" "b/10\354\233\224 5\354\235\274 - \353\266\204\355\225\240 \354\240\225\353\263\265/17281.cpp" new file mode 100644 index 0000000..2146731 --- /dev/null +++ "b/10\354\233\224 5\354\235\274 - \353\266\204\355\225\240 \354\240\225\353\263\265/17281.cpp" @@ -0,0 +1,93 @@ +/* + * [⚾]: https://www.acmicpc.net/problem/17281 + */ +#include +#include +#include + +using namespace std; +vector base(4); //1루, 2루, 3루 + +// num : 1~4 전진 +int move(int num) { + int sum = 0; + for (int i = 3; i >= 1; i--) { //3루~1루순으로 전진 + if (base[i] && i + num > 3) { //홈에 도착할 수 있는 경우 + sum++; + base[i] = false; + continue; + } + if (base[i]) { + base[i + num] = base[i]; + base[i] = false; + } + } + if (num <= 3) base[num] = 1; // 홈런인 경우 빼고 + return sum; +} + +int computeScore(int n, vector &order, vector> &result) { + int total_score = 0; + int idx = 1; + int cur_order = order[idx]; //1번 타자 선수부터 시작 + for (int i = 0; i < n; i++) { // n이닝 동안 + base.assign(4, false); // 이거 안해줌; 각 이닝마다 다시 시작... + int out = 0; //3아웃되면 종료 + while (out < 3) { + switch (result[i][cur_order]) { //i번째 이닝의 cur_order 선수의 기록 + case 0: //아웃 + out++; + break; + case 1: //안타. + total_score += move(1); + break; + case 2: //2루타 + total_score += move(2); + break; + case 3: //3루타 + total_score += move(3); + break; + case 4: //홈런 + total_score += move(4); + total_score++; //타자까지 득점 + break; + } + idx++; + if (idx == 10) idx = 1; //인덱스는 1~9까지 + cur_order = order[idx]; //다음 타자 + } + } + return total_score; +} + +int main() { + int n, ans = -1; + cin >> n; + vector> result(n, vector(10, 0)); //n이닝 , 9번 타자까지 (인덱스 1~9) + vector player(8); //순열을 만들기 위함 + vector order(10); // 결정된 타순 + //input + for (int i = 0; i < n; i++) { + for (int j = 1; j <= 9; j++) { + cin >> result[i][j]; + } + } + //순열 만들기용 + for (int i = 0; i < 9; i++) { + player[i] = i + 2; //2~8 (1번은 이미 결정되었으니까) + } + //순서 순열 만들기 + do { + for (int i = 0; i < 3; i++) { + order[i + 1] = player[i]; + } + order[4] = 1; // 1번타자는 4회 고정 + for (int i = 3; i < 8; i++) { + order[i + 2] = player[i]; + } + ans = max(ans, computeScore(n, order, result)); + } while (next_permutation(player.begin(), player.end())); + cout << ans << "\n"; + return 0; +} + diff --git "a/10\354\233\224 5\354\235\274 - \353\266\204\355\225\240 \354\240\225\353\263\265/17829.cpp" "b/10\354\233\224 5\354\235\274 - \353\266\204\355\225\240 \354\240\225\353\263\265/17829.cpp" new file mode 100644 index 0000000..c41e8eb --- /dev/null +++ "b/10\354\233\224 5\354\235\274 - \353\266\204\355\225\240 \354\240\225\353\263\265/17829.cpp" @@ -0,0 +1,55 @@ +/* + * [222-풀] : https://www.acmicpc.net/problem/17829 + */ +#include +#include +#include + +using namespace std; + +vector> map; + +int findSecond(int r, int c) { + vector arr; + //2*2 + for (int i = 0; i < 2; i++) { + for (int j = 0; j < 2; j++) { + arr.push_back(map[r + i][c + j]); + } + } + sort(arr.begin(), arr.end()); + return arr[2]; //2번째로 큰 수 +} + +int pooling(int size) { + //사이즈가 1이면 + if (size == 1) { + cout << map[0][0] << "\n"; + //return map[0][0]; // 🖍 이걸로 하면 엄청나게 큰 수가 뜹니다...?! 왜일까요 cout으로 하면 잘 나오는데.. + return 0; + } + + // 2*2씩 두번째 큰 수 구하고, 배열 1/4크기 왼쪽 위에 담기 + for (int i = 0; i < size; i += 2) { + for (int j = 0; j < size; j += 2) { + map[i / 2][j / 2] = findSecond(i, j); + } + } + pooling(size / 2); + return 0; +} + +int main() { + + int n; + cin >> n; + map.assign(n, vector(n)); + for (int i = 0; i < n; i++) { + for (int j = 0; j < n; j++) { + cin >> map[i][j]; + } + } + + pooling(n); + return 0; +} \ No newline at end of file diff --git "a/10\354\233\224 5\354\235\274 - \353\266\204\355\225\240 \354\240\225\353\263\265/2447.cpp" "b/10\354\233\224 5\354\235\274 - \353\266\204\355\225\240 \354\240\225\353\263\265/2447.cpp" new file mode 100644 index 0000000..88195f7 --- /dev/null +++ "b/10\354\233\224 5\354\235\274 - \353\266\204\355\225\240 \354\240\225\353\263\265/2447.cpp" @@ -0,0 +1,43 @@ +/* + * [별 찍기 - 10] : https://www.acmicpc.net/problem/2447 + */ +#include +#include + +using namespace std; +vector> map; + +void makeStar(int n, int r, int c) { //n, r시작 위치, c시작 위치 + if (n == 3) { // 크기 3패턴 별 찍기. + for (int i = r; i < r + 3; i++) { + for (int j = c; j < c + 3; j++) { + map[i][j] = '*'; + } + } + map[r + 1][c + 1] = ' '; //가운데 + return; + } + + //3보다 큰 경우 + //테두리 8개 재귀 호출 + for (int i = 0; i < n; i += n / 3) { // 행 시작 점 + for (int j = 0; j < n; j += n / 3) { //열 시작 점 + if (i == n / 3 && j == n / 3) continue; //가운데 뚫린 거 패스 + makeStar(n / 3, r + i, c + j); + } + } +} + +int main() { + int n; + cin >> n; + map.assign(n, vector(n + 1, ' ')); + makeStar(n, 0, 0); + //출력 + for (int i = 0; i < n; i++) { + for (int j = 0; j < n; j++) { + cout << map[i][j]; + } + cout << "\n"; + } +} \ No newline at end of file