回答編集履歴

1

駄解説を追加

2020/07/22 08:42

投稿

momon-ga
momon-ga

スコア4826

test CHANGED
@@ -3,6 +3,8 @@
3
3
  愚直に組み合わせをチェックしてみました。
4
4
 
5
5
 
6
+
7
+ チェック部分など
6
8
 
7
9
  適当に変更したら、うまくいくかもしれません。
8
10
 
@@ -17,6 +19,22 @@
17
19
  static int ProjectC[][] = { { 1, 0, 0, 1 }, { 0, 0, 0, 1 }, { 0, 0, 1, 0 } };
18
20
 
19
21
 
22
+
23
+ /*
24
+
25
+ * int Project[][][]=new int[3][][];
26
+
27
+ * Project[0]=Project1;
28
+
29
+ * Project[1]=Project2;
30
+
31
+ * Project[2]=Project3;
32
+
33
+ *
34
+
35
+ * 上記のコードは以下のように簡潔に書けるし、こちらの方がわかりやすいと思います。
36
+
37
+ */
20
38
 
21
39
  static int[][][] ProjectALL = {
22
40
 
@@ -34,13 +52,9 @@
34
52
 
35
53
  for (int k = j + 1; k < 9; k++) {
36
54
 
37
- if (check(i, j, k)) {
55
+ if (check(getArray(i), getArray(j), getArray(k))) {
38
56
 
39
- for (int ret = 0; ret < 9; ret++) {
40
-
41
- sysoutResult(ret, ret == i || ret == j || ret == k);
57
+ sysoutResult(i, j, k);
42
-
43
- }
44
58
 
45
59
  System.out.println("---------------");
46
60
 
@@ -56,17 +70,21 @@
56
70
 
57
71
 
58
72
 
59
- private static boolean check(int i, int j, int k) {
73
+ private static boolean check(int[] pj1, int[] pj2, int[] pj3) {
60
74
 
61
- //配列の中身の合計が{1,1,1,1}になるかチェックする
75
+ // 配列の中身の合計が{1,1,1,1}になるかチェックする
62
76
 
63
- return getArray(i)[0] + getArray(j)[0] + getArray(k)[0] == 1 &&
77
+ // 質問から読み取れなかったけど、pjは必ず3つを利用する前提
64
78
 
65
- getArray(i)[1] + getArray(j)[1] + getArray(k)[1] == 1 &&
79
+ // ※ A[1], A[2],B[1], B[2]のような4つで成り立つケースは探せない)
66
80
 
67
- getArray(i)[2] + getArray(j)[2] + getArray(k)[2] == 1 &&
81
+ return pj1[0] + pj2[0] + pj3[0] == 1 &&
68
82
 
83
+ pj1[1] + pj2[1] + pj3[1] == 1 &&
84
+
85
+ pj1[2] + pj2[2] + pj3[2] == 1 &&
86
+
69
- getArray(i)[3] + getArray(j)[3] + getArray(k)[3] == 1;
87
+ pj1[3] + pj2[3] + pj3[3] == 1;
70
88
 
71
89
  }
72
90
 
@@ -74,22 +92,68 @@
74
92
 
75
93
  private static int[] getArray(int num) {
76
94
 
95
+ /*
96
+
97
+ * ProjectALL 配列は
98
+
99
+ * { 0, 1, 2, // ProjectA[0] ,ProjectA[1] ,ProjectA[2]
100
+
101
+ * 3, 4, 5, // ProjectB[0] ,ProjectB[1] ,ProjectB[2]
102
+
103
+ * 6, 7, 8} // ProjectC[0] ,ProjectC[1] ,ProjectC[2]
104
+
105
+ *
106
+
107
+ * という位置関係で一次元配列に格納したように扱える。
108
+
109
+ * 0~8の値を3で割った答え(余り切り捨て)と、3で割った余りで、一意に配列を選択できる
110
+
111
+ */
112
+
113
+
114
+
77
115
  return ProjectALL[num / 3][num % 3];
78
116
 
79
117
  }
80
118
 
81
119
 
82
120
 
83
- private static void sysoutResult(int num, boolean ret) {
121
+ private static void sysoutResult(int pj1, int pj2, int pj3) {
84
122
 
85
- String company[] = { "A社", "B社", "C社" };
123
+ String[] companies = { "A社", "B社", "C社" };
86
124
 
87
125
 
88
126
 
89
- System.out.println(
127
+ // 元のソースに合わせて2重ループで表示
90
128
 
129
+ for (int i = 0; i < 3; i++) {
130
+
131
+ for (int j = 0; j < 3; j++) {
132
+
133
+ int pjNum = i * 3 + j; // 配列の位置をpjNumに変換(考え方は、getArrayにて説明)
134
+
135
+ boolean ret = (pjNum == pj1 || pjNum == pj2 || pjNum == pj3);
136
+
91
- company[num / 3] + "の" + (num % 3 + 1) + "位のプロジェクト=" + (ret ? "1" : "0"));
137
+ System.out.println(companies[i] + "の" + (j + 1) + "位のプロジェクト=" + (ret ? "1" : "0"));
138
+
139
+ }
140
+
141
+ }
142
+
143
+
144
+
145
+ // 修正前
146
+
147
+ // for(int i = 0; i < 9; i++) {
148
+
149
+ // boolean ret = (i == pj1 || i == pj2 || i == pj3);
150
+
151
+ // System.out.println(companies[i / 3] + "の" + (i % 3 + 1) + "位のプロジェクト=" + (ret ? "1" : "0"));
152
+
153
+ //}
92
154
 
93
155
  }
94
156
 
157
+
158
+
95
159
  ```