teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

駄解説を追加

2020/07/22 08:42

投稿

momon-ga
momon-ga

スコア4828

answer CHANGED
@@ -1,6 +1,7 @@
1
1
  元のソースよくわからなかったので意図しない動作かもしれませんが
2
2
  愚直に組み合わせをチェックしてみました。
3
3
 
4
+ チェック部分など
4
5
  適当に変更したら、うまくいくかもしれません。
5
6
 
6
7
  ```java
@@ -8,6 +9,14 @@
8
9
  static int ProjectB[][] = { { 1, 0, 1, 0 }, { 0, 0, 1, 0 }, { 1, 0, 0, 0 } };
9
10
  static int ProjectC[][] = { { 1, 0, 0, 1 }, { 0, 0, 0, 1 }, { 0, 0, 1, 0 } };
10
11
 
12
+ /*
13
+ * int Project[][][]=new int[3][][];
14
+ * Project[0]=Project1;
15
+ * Project[1]=Project2;
16
+ * Project[2]=Project3;
17
+ *
18
+ * 上記のコードは以下のように簡潔に書けるし、こちらの方がわかりやすいと思います。
19
+ */
11
20
  static int[][][] ProjectALL = {
12
21
  ProjectA, ProjectB, ProjectC
13
22
  };
@@ -16,10 +25,8 @@
16
25
  for (int i = 0; i < 9; i++) {
17
26
  for (int j = i + 1; j < 9; j++) {
18
27
  for (int k = j + 1; k < 9; k++) {
28
+ if (check(getArray(i), getArray(j), getArray(k))) {
19
- if (check(i, j, k)) {
29
+ sysoutResult(i, j, k);
20
- for (int ret = 0; ret < 9; ret++) {
21
- sysoutResult(ret, ret == i || ret == j || ret == k);
22
- }
23
30
  System.out.println("---------------");
24
31
  }
25
32
  }
@@ -27,22 +34,47 @@
27
34
  }
28
35
  }
29
36
 
30
- private static boolean check(int i, int j, int k) {
37
+ private static boolean check(int[] pj1, int[] pj2, int[] pj3) {
31
- //配列の中身の合計が{1,1,1,1}になるかチェックする
38
+ // 配列の中身の合計が{1,1,1,1}になるかチェックする
39
+ // 質問から読み取れなかったけど、pjは必ず3つを利用する前提
40
+ // ※ A[1], A[2],B[1], B[2]のような4つで成り立つケースは探せない)
32
- return getArray(i)[0] + getArray(j)[0] + getArray(k)[0] == 1 &&
41
+ return pj1[0] + pj2[0] + pj3[0] == 1 &&
33
- getArray(i)[1] + getArray(j)[1] + getArray(k)[1] == 1 &&
42
+ pj1[1] + pj2[1] + pj3[1] == 1 &&
34
- getArray(i)[2] + getArray(j)[2] + getArray(k)[2] == 1 &&
43
+ pj1[2] + pj2[2] + pj3[2] == 1 &&
35
- getArray(i)[3] + getArray(j)[3] + getArray(k)[3] == 1;
44
+ pj1[3] + pj2[3] + pj3[3] == 1;
36
45
  }
37
46
 
38
47
  private static int[] getArray(int num) {
48
+ /*
49
+ * ProjectALL 配列は
50
+ * { 0, 1, 2, // ProjectA[0] ,ProjectA[1] ,ProjectA[2]
51
+ * 3, 4, 5, // ProjectB[0] ,ProjectB[1] ,ProjectB[2]
52
+ * 6, 7, 8} // ProjectC[0] ,ProjectC[1] ,ProjectC[2]
53
+ *
54
+ * という位置関係で一次元配列に格納したように扱える。
55
+ * 0~8の値を3で割った答え(余り切り捨て)と、3で割った余りで、一意に配列を選択できる
56
+ */
57
+
39
58
  return ProjectALL[num / 3][num % 3];
40
59
  }
41
60
 
42
- private static void sysoutResult(int num, boolean ret) {
61
+ private static void sysoutResult(int pj1, int pj2, int pj3) {
43
- String company[] = { "A社", "B社", "C社" };
62
+ String[] companies = { "A社", "B社", "C社" };
44
63
 
64
+ // 元のソースに合わせて2重ループで表示
45
- System.out.println(
65
+ for (int i = 0; i < 3; i++) {
66
+ for (int j = 0; j < 3; j++) {
67
+ int pjNum = i * 3 + j; // 配列の位置をpjNumに変換(考え方は、getArrayにて説明)
68
+ boolean ret = (pjNum == pj1 || pjNum == pj2 || pjNum == pj3);
46
- company[num / 3] + "の" + (num % 3 + 1) + "位のプロジェクト=" + (ret ? "1" : "0"));
69
+ System.out.println(companies[i] + "の" + (j + 1) + "位のプロジェクト=" + (ret ? "1" : "0"));
70
+ }
71
+ }
72
+
73
+ // 修正前
74
+ // for(int i = 0; i < 9; i++) {
75
+ // boolean ret = (i == pj1 || i == pj2 || i == pj3);
76
+ // System.out.println(companies[i / 3] + "の" + (i % 3 + 1) + "位のプロジェクト=" + (ret ? "1" : "0"));
77
+ //}
47
78
  }
79
+
48
80
  ```