CS/์๊ณ ๋ฆฌ์ฆ
[๋ฐฐ์ด] ๋ถ๋ถ์งํฉ ๊ด๋ จ ๋ฌธ์ ๋นํธ์ฐ์ฐ์ผ๋ก ํ๊ธฐ :: ์ฝ๋์๋ชฝ
๐ปโ
2019. 11. 22. 17:58
๋ถ๋ถ์งํฉ ๊ตฌํ๊ธฐ
๋ฐฐ์ด์ด ์ฃผ์ด์ก์๋ ๋ถ๋ถ์งํฉ์ ๊ตฌํ๋ ์ฝ๋๋ฅผ ์์ฑํด๋ณด์. ์๋ ๊ธฐ๋ณธ ๋ฌธ์ ๋ฅผ ์ค๋ช
๋ฐ ์ฝ๋์ํ์ ํ์ธํ์ง ์๊ณ ๋จผ์ ํ์ด๋ณด์.
๊ธฐ๋ณธ ๋ฌธ์
{1, 2, 3, 4, -1, -5}
์ ๋ฐฐ์ด์์ ํ์๋ก ๊ตฌ์ฑ๋ ๋ถ๋ถ ์งํฉ์ ๋ชจ๋ ์ถ๋ ฅ ํ์์ค.
๊ฐ๋จํด ๋ณด์ด์ง๋ง ๋นํธ์ฐ์ฐ์ ์ดํดํ์ง ๋ชปํ๋ฉด ์๊ฐ๋ณด๋ค ์ด๋ ค์ด ๋ฌธ์ ์ด๋ค.
์ ๋ฌธ์ ๋ฅผ ์์ ํ์ ํน์ ๋ฐฐ์ด์ ์์น๋ฅผ ์ด์ฉํด์ ํ๊ฒ ๋ค๊ณ ์ ๊ทผํ์๊ฒ์ด๋ผ ์๊ฐํฉ๋๋ค. ์์ ํ์ ๋ฐฉ๋ฒ์ผ๋ก ํ๋ ค๊ณ ํ๋ค๋ณด๋ for๋ฌธ์ ์ค์ฒฉํด์ ์ฌ์ฉํ๋ฉด ๋ฐฐ์ด์ด ์ปค์ง์๋ก ํจ์จ๋ ๋จ์ด์ง๊ณ ์๊ฐ๋ณต์ก๋๊ฐ ์ ๊ณฑ์ผ๋ก ๋์ด๋๋ ๊ฒ์ ํ์ธํ์ ๊ฒ์
๋๋ค. ๊ทธ๋ผ ๋ฐฐ์ด์ ์์น๋ฅผ ์ด์ฉํด์ ํธ๋ ๋ฐฉ๋ฒ์ ์๊ฐํ๋ค๋ณด๋ 0๊ณผ 1์ ์ด์ฉํ์ฌ ์๋ฆฌ๋ฅผ ํ์ํ๋ ๋ฐฉ๋ฒ์ด ๋ ์ค๋ฅด๊ฒ ๋ ๊ฒ์
๋๋ค.
์์ ๋ฌธ์ ์ฒ๋ผ ๋ถ๋ถ์งํฉ์ ๊ตฌํ๋ ๋ฌธ์ ์์๋ ๋นํธ์ฐ์ฐ์ ์ด์ฉํ๊ฒ ๋๋ฉด ์ฌ์์ง๋๋ค.
ํ์ด ์ฝ๋
import java.util.Arrays;
public class PartElements {
public static void main(String[] args) {
int[] array = {1, 2, 3, 4, -1, -5};
// ๋ชจ๋ ๋ถ๋ถ์งํฉ์ ๊ฒฝ์ฐ์ ์
for (int i = 1; i < (1 << array.length); i++) {
int[] temp = new int[array.length]; // ์์ ๋ถ๋ถ ์งํฉ
int count = 0; // ์๋ก์ด ๋ฐฐ์ด ํฌ๊ธฐ
boolean isOdd = true; // ํ์ ์ฌ๋ถ ํ์ธ
// ๋ถ๋ถ์งํฉ ์์ฑ
for (int j = 0; j < array.length; j++) {
if ((i & (1 << j)) != 0) {
if (array[j] % 2 == 0) {
isOdd = false;
}else{
temp[count++] = array[j];
}
}
}
// ์ถ๋ ฅ
if (isOdd) System.out.println(Arrays.toString(Arrays.copyOf(temp,count)));
}
}
}
์ค๋ช
๋นํธ์ฐ์ฐ์ ์ด์ฉํ ๋ฌธ์ ํ์ด๋ ๋ฐฐ์ด์ ์์น๋ฅผ 2์ง์ํํ๋ก ํํํ์ฌ ์ ๊ทผํ๋ ๋ฐฉ๋ฒ์
๋๋ค.
๋นํธ์ฐ์ฐ์ ๋ํ ๋ด์ฉ์ ์๋ ๊ธ์ ํตํด ์์ธํ ์์๋ณด์.
7
for (int i = 1; i < (1 << array.length); i++) {
๋ชจ๋ ๋ถ๋ถ ์งํฉ์ ๊ฒฝ์ฐ์ ์๋ฅผ ํ์ธ ํ๊ธฐ for๋ฌธ์ผ๋ก ํ์ธํ๋ค. i์ ๋ฒ์๋ 1 ~ 63๊น์ง๊ฐ ๋ฉ๋๋ค.
8 ~ 10
int[] temp = new int[array.length]; // ์์ ๋ถ๋ถ ์งํฉ
int count = 0; // ์๋ก์ด ๋ฐฐ์ด ํฌ๊ธฐ
boolean isOdd = true; // ํ์ ์ฌ๋ถ ํ์ธ
์ถ์ถํ ๋ถ๋ถ์งํฉ์ ์์ ๋ฐฐ์ด ์์ฑํ๊ณ ๋์ค์ ์์ฑํ ๋ฐฐ์ด์ ํ๋ฒ ๋ ์์ ํด์ฃผ๊ธฐ ์ํด ๋ฐฐ์ด์ ํฌ๊ธฐ๋ก ์ฌ์ฉํ ๋ณ์๋ฅผ ์์๋ก ๋ง๋ค์ด์ค๋ค.
12 ~ 20
for (int j = 0; j < array.length; j++) {
if ((i & (1 << j)) != 0) {
if (array[j] % 2 == 0) {
isOdd = false;
}else{
temp[count++] = array[j];
}
}
}
์ด ๋ถ๋ถ์ด ์ด๋ฒ ํ์ด์์์ ํต์ฌ์ด๋ค.
i์ ์ซ์์ for๋ฌธ์ ์ด์ฉํด์ 0 ~ 5๊น์ง ๊ฐ ์์ ๊ฐ์ด ์๋์ง ํ์ธํ๋ ์์
์
๋๋ค.
if ((i & (1 << j)) != 0) { ์ if๊ตฌ๋ฌธ์์i ์ (1 << j) ์ & ๋น๊ต๊ฐ ํ๋ ์ผ์ ํ๋ก ํ์ธํด๋ด
์๋ค.
i๋ 1 ~ 63์ ๋ฐ๋ณต๋ฌธ์ด๊ณ j๋ 0 ~ 5๊น์ง์ ๋ฐ๋ณต๋ฌธ์
๋๋ค.
i์ ๋นํธ์ ๋ณด๊ธฐ ์ฝ๊ฒ 5์๋ฆฌ๋ก ํ์ํ์ต๋๋ค.
i | i์ ๋นํธ๊ฐ | j | (1 << j) | i & (1 << j) | i & (1 << j)์ ๊ฐ |
1 | 000001 | 0 | 000001 | 000001 | 1 |
1 | 000001 | 1 | 000010 | 000000 | 0 |
1 | 000001 | 2 | 000100 | 000000 | 0 |
1 | 000001 | 3 | 001000 | 000000 | 0 |
1 | 000001 | 4 | 010000 | 000000 | 0 |
1 | 000001 | 5 | 100000 | 000000 | 0 |
2 | 000010 | 0 | 000001 | 000000 | 0 |
2 | 000010 | 1 | 000010 | 000010 | 2 |
2 | 000010 | 2 | 000100 | 000000 | 0 |
2 | 000010 | 3 | 001000 | 000000 | 0 |
2 | 000010 | 4 | 010000 | 000000 | 0 |
2 | 000010 | 5 | 100000 | 000000 | 0 |
... | |||||
63 | 111111 | 0 | 000001 | 000001 | 1 |
63 | 111111 | 1 | 000010 | 000010 | 2 |
63 | 111111 | 2 | 000100 | 000100 | 4 |
63 | 111111 | 3 | 001000 | 001000 | 8 |
63 | 111111 | 4 | 010000 | 010000 | 16 |
63 | 111111 | 5 | 100000 | 100000 | 32 |
์ ํ์ ๊ฐ์ด i & (1 << j) ๊ฐ์ด 0์ด ์๋๋ if๋ฌธ ์์ผ๋ก ๋ค์ด๊ฐ๊ฒ๋ ํ๋ค. ์ฆ, 1~63๊น์ง ์ด์ง์๋ก ๋ํ๋ด๋ฉด ๋ชจ๋ ๋ถ๋ถ์งํฉ์ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ตฌํ ์ ์๋ค. ๋๋จธ์ง ํ์๋ง ๊ฑธ๋ฌ์ฃผ๋ ๋ก์ง์ ํด๋น if๋ฌธ์์ ์ถ๊ฐ์ ์ผ๋ก ๋ฃ์ด์ฃผ๋ฉด ๋๋ค.
22
if (isOdd) System.out.println(Arrays.toString(Arrays.copyOf(temp,count)));
๊ธฐ์กด์ temp๋ผ๋ ๋ฐฐ์ด์ array๋ฐฐ์ด์ ํฌ๊ธฐ ๊ทธ๋๋ก ์์ฑํด์ฃผ์๋ค. ํ์๋ง ๋ฐ๋ก ๋ฝ์๋๊ธฐ ๋๋ฌธ์ ๋๋จธ์ง ์๋ฆฌ์๋ 0์ด ์ฑ์์ก์ ๊ฒ์ด๋ค. 0์ ๋ชจ๋ ์ญ์ ํด์ฃผ๊ธฐ ์ํด ๋ฝ์๋ธ ๋ฐฐ์ด์ ํฌ๊ธฐ ๋งํผ๋ง ๋ฐฐ์ด ๋ณต์ฌ๋ฅผ ํด์ฃผ์๋ค.
๊ฒฐ๊ณผ
๋นํธ์ฐ์ฐ์ผ๋ก ์ ๊ทผํ์ฌ ๋ถ๋ถ์งํฉ์ ๊ตฌํ๋ ๋ฌธ์ ๋ฅผ ํ๋ ๋ ํ์ด๋ณด์.
๋ณํ ๋ฌธ์ : ํฉ๊ธ๋ก๋ณถ์ด๊ฐ ๋จน๊ณ ์ถ์ด์
์๋ชฝ์ด๋ฑํ๊ต 3ํ๋
1๋ฐ ํ์๋ค์ ๋งค์ผ ์ฉ๋์ ๋ฐ๋๋ค. {์๋ชฝ, ๋ฐ๋๋, ์ ํ๋ง๊ณ , ๋ฉ๋ก , ์ค๋ ์ง, ์ฒด๋ฆฌ, ์คํธ๋ก๋ฒ ๋ฆฌ, ํค์, ๋ฆฌ์น}๋
๊ฐ๊ฐ {15000, 2000, 10000, 7000, 15000, 1000, 2000, 4000, 5000}์์ฉ ๋ฐ๋๋ค. 3ํ๋
1๋ฐ ํ์๋ค์ ํฉ๊ธ๋ถ์์์ ํ๋งคํ๋ ํฉ๊ธ ๋ก๋ณถ์ด๋ฅผ ๋จน๊ธฐ์ํด ๊ทธ๋ฃน์ ๋ชจ์งํ๊ณ ์์ต๋๋ค. ํฉ๊ธ ๋ก๋ณถ์ด๋ 30000์์
๋๋ค. 3๋ช
์ดํ์ ๊ทธ๋ฃน์ผ๋ก ํฉ๊ธ๋ก๋ณถ์ด๋ฅผ ์ฌ ๋จน์ ์ ์๋ ๊ทธ๋ฃน์ ๋ชจ๋ ์ถ๋ ฅ ํ์์ค.
ํ์ด ์ฝ๋
import java.util.Arrays;
public class Gold {
public static void main(String[] args) {
String[] names = {"์๋ชฝ", "๋ฐ๋๋", "์ ํ๋ง๊ณ ", "๋ฉ๋ก ", "์ค๋ ์ง", "์ฒด๋ฆฌ", "์คํธ๋ก๋ฒ ๋ฆฌ", "ํค์", "๋ฆฌ์น"};
int[] array = {15000, 2000, 10000, 7000, 15000, 1000, 2000, 4000, 5000};
for (int i = 1; i < (1 << array.length); i++) {
String[] temp = new String[array.length];
int count = 0;
int sum = 0;
for (int j = 0; j < array.length; j++) {
if ((i & (1 << j)) != 0) {
sum += array[j];
temp[count++] = names[j];
}
}
String[] resultArr = Arrays.copyOf(temp, count);
if (sum >= 30000 && resultArr.length <=3) System.out.println(Arrays.toString(resultArr));
}
}
}
๊ฒฐ๊ณผ