問題
①2次元の1と0で表わされる配列が与えられる。
②各列ごとに、任意の2つのビットを入力するとXOR,OR,ANDいずれかの計算結果が返ってくるマシーンがある。
③マシーンは各列ごとにどの操作をするか決まっているが、どの操作が行われるかは明らかにされていない。
④このとき、与えられた配列に対して各列のマシーンがどの操作を行っているか判定することができれば”YES”、できなければ”NO”を返す。
解き方
どのような法則があるか、各操作ごとに例をいくつか出して導く。
各操作の結果について列挙する。
OR
00→0 01→1 11→1
XOR
00→0 01→1 11→0
AND
00→0 01→0 11→1
つまり、
ORとXOR 11のビット列が必要
ORとAND 01のビット列が必要
XORとAND 01か11のビット列が必要となる。
ここから、OR,XOR,ANDの判断には、001があればよいことがわかる。
これを全ての列に対して判定する。
コード
class TheDeviceDiv2 {
public: string identify(vector<string> plates) {
FORE(j,0,plates[0].size()){
int one=0,zero=0;
FORE(i,0,plates.size()){
if(plates[i][j]=='1')one++;
if(plates[i][j]=='0')zero++;
}
if(one<2 || zero<1)return "NO";
}
return "YES";
}
};
public: string identify(vector<string> plates) {
FORE(j,0,plates[0].size()){
int one=0,zero=0;
FORE(i,0,plates.size()){
if(plates[i][j]=='1')one++;
if(plates[i][j]=='0')zero++;
}
if(one<2 || zero<1)return "NO";
}
return "YES";
}
};