【Java練習問題】Warmup-1: sleepIn

1問ずつ解いていくので、もっとスマートな解法があれば教えて欲しい。

問題

The parameter weekday is true if it is a weekday, and the parameter vacation is true if we are on vacation. We sleep in if it is not a weekday or we’re on vacation. Return true if we sleep in.

  • sleepIn(false, false) → true
  • sleepIn(true, false) → false
  • sleepIn(false, true) → true

http://codingbat.com/prob/p187868

問題(日本語訳)

以下の関数sleepInを実装する。

public boolean sleepIn(boolean weekday, boolean vacation) {

}

平日のとき、引数weekdaytrueが与えられる。長期休暇のときは引数vacationtrueが与えられる。

もし平日ではない、もしくは長期休暇中であるなら、寝入ることが出来る。

寝入ることが出来るとき、trueを返す関数を作成せよ。

ベン図

 {
  \overline{A} \cup B
}

f:id:KazmaArakaki:20170618135734p:plain

回答1

 {
  \overline{A} \cup B
}

上記の式はプログラミングでは!A || Bと表すことができる。

たとえば、次の式は!(A && B)と表せる。

 {
  \overline{A \cap B}
}

したがって、与えられた条件にしたがってif文を書くと次のようになる。

public boolean sleepIn(boolean weekday, boolean vacation) {
  if(!weekday || vacation) {
    return true;
  }
  else {
    return false;
  }
}

回答2

また、この関数は真偽値を返せばよいので、条件判定の論理式をそのまま返すことも出来る。

public boolean sleepIn(boolean weekday, boolean vacation) {
  return (!weekday || vacation);
}

覚えておきたい

ド・モルガンの法則

 {
  \overline{A \cap B} = \overline{A} \cup \overline{B}
}

 {
  \overline{A \cup B} = \overline{A} \cap \overline{B}
}

集合の分配法則

 {
  A \cap (B \cup C) = (A \cap B) \cup (A \cap C)
}

 {
  A \cup (B \cap C) = (A \cup B) \cap (A \cup C)
}

覚えにくいので分配のイメージをまとめる。

f:id:KazmaArakaki:20170618223902j:plain

kazmaarakaki.hatenablog.com