【育児】購入リスト 鼻水吸引

鼻水を吸引する

子どもが産まれて、2週間経ったころに気になることがあった。

鼻が詰まって呼吸が苦しそうなのだ。

スヤスヤ寝ているようだが、時折いびきのような音を鼻?のど?から出すのである。

心配なので調べてみると、鼻水が出せずに溜まっているのではないかということだ。

原因は二つあったと思う。

  • 鼻水吸引をしていなかった
  • 湿度が低すぎた(こちらは別の機会に書く)

ベビーお手入れセット

誕生前にベビーお手入れセットを買っていた。

ベビーザらスで買っといたほうがいいと言われたので、(Amazon で)買ったのだ。

  • 爪切りは使う
  • ブラシはたまに使う
  • ピンセットは1回だけ使った
  • 鼻水吸引器は一度も使わなかった

親がチューブを咥えて吸引するタイプはどう考えても面倒なので、使おうとも思わなかった。

電動鼻水吸引器を購入した

メルシーポットという鼻水吸引器が良いらしいと妻から言われたので、すぐに購入した。

普段であれば、すぐに購入するには躊躇するような価格(1万円くらい)なのだが、そんな余裕はなかった。

子どもの鼻詰まりが心配だったのだ。マジで。

使ってみた

電源を入れると、ちょっと怖くなるくらいでかい音がする。

でかい音がするだけあって、鼻水はよく取れる。とても気持ちがいい。(親が)

肝心の子どもはどうかというと、それはそれはこの世の終わりのように泣き叫ぶ。

暴れると危ないので、一人が抑えて、もう一人が吸引するという分担でやっている。

ボンジュールという細めのノズルがあったほうが断然良いので、最初からセットになっているものを買うのが良いと思う。

吸引するタイミングは、沐浴直後が鼻水が柔らかくなっていて取れやすいのでオススメ。

効果があった

初めて吸引をしたその日から、いびきが減り、睡眠時間がのびた。

想像以上に鼻水、鼻くそが取れているので当然と言えば当然だ。

余談だが

親というのは、子どものなんでもかんでもが心配なのである。そういうものだ。

ネットで調べて不正確な情報に惑わされることもある。

病院では、子どもはわりと丈夫で、たいていの心配事は気にしなくていいと教えてくれる。

不正確な情報で変なことをするよりは、何もしないほうがいいこともあるだろう。

これは本当にその通りなのである。鼻が詰まっていても、元気に生きていたし、機嫌もよかった(と思う)。

ただ、睡眠時間の長さに改善が見られたという効果があったのは、親が楽になるのでよかったのだ。

育児中の親はどれだけ睡眠がとれるかが大事なのだ。

【育児】購入リスト おくるみ

子どもが誕生した。

誕生前に揃えたり、育児中に必要になって揃えたものを紹介していく、

各々の家庭環境や生活環境、育児方針などで必要なもの不要なものが変わってくるだろうが、私の家ではこれを使っているよ。という話である。

おくるみ

新生児は子宮内で快適に過ごしていたのに、急に外の世界に出されて手足が自由に動くことが不安なようだ。

音とか光とかに振動とかに驚き、手足を動かしてしまう。(モロー反射という。)

それきっかけで睡眠から覚醒してしまうんだそうだ。

おくるみを使うと、手足をある程度拘束できる。「拘束」というと聞こえが悪いが、睡眠から無駄に覚醒することを減らせるので、子どもも親もハッピーというわけだ。

基本のおくるみ

広げると正方形になるガーゼ素材の布である。

何にでも使えて便利なので、4枚くらいあっていい。

最初に広げてみたときに薄っぺらでやたら大きく感じたが、それがとても役立つのである。

おくるみの使い方というか巻き方は色々あるので、適当に探してみてほしい。

私の子どもには基本巻きという巻き方が一番しっくりくるようだ。

Swaddle Up

基本のおくるみでも問題なかったのだが、Swaddle Up なるものを妻が見つけたので試したみた。

おくるみだとおむつを変えるときにほどくのが少し面倒だ。Swaddle Up なら前面に上から下までジッパーがついているのでとても楽である。

箱には赤ちゃんを起こさずに、おむつ交換ができるなどと書いてある。そもそも泣いて起きてからおむつ交換しているのでこれについてはわからない。

育児中は3時間程度しかまとまった睡眠を取れない

育児が始まってみて本当にしんどいと思ったのが、睡眠を3時間ごとくらいしか取れないことである。

いや、3時間もまとまって寝れれば良い方で、平均したら1.5時間程度ではないだろうか。

親の睡眠時間を伸ばすためにおくるみが必要なのである。

なんで親の睡眠欲の話してんだ。と思うかもしれないが、体力を少しでも回復しないと育児はできないのだ。

体力が尽きるとメンタルがやられてしまうのも一瞬である。体力が少しでも残っていれば、子どものかわいさでメンタルは全然問題ない。

子どもが少しでも長く寝てくれるためにあらゆることをしなければならない。

【LeetCode】Easy: Longest Common Prefix

Longest Common Prefix

https://leetcode.com/problems/longest-common-prefix/

回答

class Solution {
    func longestCommonPrefix(_ strs: [String]) -> String {
        var min = strs.min()!
        while min.count > 0 {
            if strs.filter({ $0.contains(min) }).count == strs.count { return min }
            min = String(min.dropFirst())
        }
        
        min = strs.min()!
        
        while min.count > 0 {
            if strs.filter({ $0.contains(min) }).count == strs.count { return min }
            min = String(min.dropLast())
        }
        
        return ""
    }
}

f:id:hira22_1:20200609074422p:plain

修正

class Solution {
    func longestCommonPrefix(_ strs: [String]) -> String {
        guard var dropFirstMin = strs.min() else { return "" }
        
        while dropFirstMin.count > 0 {
            if strs.filter({ $0.contains(dropFirstMin) }).count == strs.count { break }
            dropFirstMin = String(dropFirstMin.dropFirst())
        }
        
        guard var dropLastMin = strs.min() else { return "" }
        
        while dropLastMin.count > 0 {
            if strs.filter({ $0.contains(dropLastMin) }).count == strs.count { break }
            dropLastMin = String(dropLastMin.dropLast())
        }
        
        return dropFirstMin.count > dropLastMin.count ? dropFirstMin :dropLastMin
    }
}

f:id:hira22_1:20200609095436p:plain

prefix だけでいいのに、共通の文字列を探してしまった…

再修正

class Solution {
    func longestCommonPrefix(_ strs: [String]) -> String {
        guard var min = strs.min() else { return "" }
        
        while min.count > 0 {
            if strs.filter({ $0.hasPrefix(min) }).count == strs.count { break }
            min = String(min.dropLast())
        }
        
        return min
    }
}

f:id:hira22_1:20200609095631p:plain

感想

問題の勘違いで難しくしてしまった。

【LeetCode】Easy: Roman to Integer

Roman to Integer

https://leetcode.com/problems/roman-to-integer/

自分の回答

class Solution {
    func romanToInt(_ s: String) -> Int {
        var output: Int = 0
        var s: String = s

        while !s.isEmpty {
            let firstTwo = s.prefix(2)
            switch firstTwo {
            case "IV":
                output += 4
                s.removeFirst(2)
            case "IX":
                output += 9
                s.removeFirst(2)
            case "XL":
                output += 40
                s.removeFirst(2)
            case "XC":
                output += 90
                s.removeFirst(2)
            case "CD":
                output += 400
                s.removeFirst(2)
            case "CM":
                output += 900
                s.removeFirst(2)
            default:
                switch firstTwo.first {
                case "I":
                    output += 1
                    s.removeFirst(1)
                case "V":
                    output += 5
                    s.removeFirst(1)
                case "X":
                    output += 10
                    s.removeFirst(1)
                case "L":
                    output += 50
                    s.removeFirst(1)
                case "C":
                    output += 100
                    s.removeFirst(1)
                case "D":
                    output += 500
                    s.removeFirst(1)
                case "M":
                    output += 1000
                    s.removeFirst(1)
                default:
                    break
                }
            }
        }
        return output
    }
}

f:id:hira22_1:20200609065958p:plain

回答例

課金しないと見れない…

https://leetcode.com/problems/roman-to-integer/solution/

Discussion のコードを見て修正

class Solution {
    let dic: [String.Element: Int] = [
        "I": 1,
        "V": 5,
        "X": 10,
        "L": 50,
        "C": 100,
        "D": 500,
        "M": 1000
    ]
    
    func romanToInt(_ s: String) -> Int {
        var output: Int = 0
        let arrayed = Array(s)
        for (i, sequence) in arrayed.enumerated() {
            let num: Int = dic[sequence]!
            if i < arrayed.count - 1, num < dic[arrayed[i + 1]]! {
                output -= num
                continue
            }
            output += num
        }
        return output
    }
}

f:id:hira22_1:20200609070702p:plain

遅くなった。

これが早いらしい。

class Solution {
    let numerals: [Character:Int] =
        ["I": 1,
         "V": 5,
         "X": 10,
         "L": 50,
         "C": 100,
         "D": 500,
         "M": 1000
    ]
    
    func romanToInt(_ s: String) -> Int {
        let array = Array(s)
        var i = 0
        var num = 0
        
        while i < array.count - 1 {
            
            let val = numerals[array[i]]!
            let next = numerals[array[i+1]]!
            num += (val < next) ? -val : val
            
            i += 1
        }
        num += numerals[array.last!]!
        
        return num
    }
}

感想

どうやればパフォーマンスを改善できるのかわからない

参考

https://leetcode.com/problems/roman-to-integer/discuss/?currentPage=1&orderBy=most_relevant&query=swift

【LeetCode】Easy: Palindrome Number

Palindrome Number

https://leetcode.com/problems/palindrome-number/

自分の回答

class Solution {
    func isPalindrome(_ x: Int) -> Bool {
        var string = String(x)
        while string.count != 0 {
            if string.removeFirst() != string.popLast() {
                return false
            }
        }
        return true
    }
}

while の条件間違えてて、ずっとtrue 🤷

修正

class Solution {
    func isPalindrome(_ x: Int) -> Bool {
        var string = String(x)
        while string.count > 1 {
            if string.removeFirst() != string.popLast() {
                return false
            }
        }
        return true
    }
}

f:id:hira22_1:20200605074858p:plain

回答

https://leetcode.com/problems/palindrome-number/solution/

Follow up

Coud you solve it without converting the integer to a string?

見落としてた。

説明

  • String に変換するのは、問題で禁止されている。
  • 逆数を作ると、オーバーフローする可能性がある。
  • 回文であれば、半分に分けるともう半分の反転と一致する。
    • 1221 を 12(a) と 21(b) に分ける。
    • b を反転させて 12 にすると a と一致する。

アルゴリズム

  • 負数は回文になり得ない。一の位が 0 も回文になり得ない。
  • 最後の一桁を取得するには % 10 -> x
  • 次の一桁を取得するために / 10 -> y
  • x * 10 + y で反転。

半分になったことをどうやって知るか

  • 元の数字は桁が減っている。
  • 反転した数字は桁が増えている。
  • 元の数字 < 反転した数字 となったら、半分になっている。

回答を見て修正

class  Solution {
    func isPalindrome(_ x: Int) -> Bool {
        if x < 0 || (x % 10 == 0 && x != 0) { return false }
        var x: Int = x
        var reverted: Int = 0
        
        while x > reverted {
            reverted = reverted * 10 + x % 10
            x = x / 10
        }
        
        return x == reverted || x == reverted/10
    }
}

ちなみに…

class Solution {
    func isPalindrome(_ x: Int) -> Bool {
        let string = String(x)
        return string == String(string.reversed())
    }
}

f:id:hira22_1:20200605075751p:plain

感想

  • 回答例を見て、あーたしかに reverse ってあるな。と思った。

【LeetCode】Easy: Reverse Integer


Reverse Integer

https://leetcode.com/problems/reverse-integer/

自分の回答

Swift

🤦 Wrong Answer

class Solution {
    func reverse(_ x: Int) -> Int {
        
        var xx: Int = x
        var array = [Int]()
        
        while xx != 0 {
            array.append(xx % 10)
            xx = xx / 10
        }
        
        return array.reversed().enumerated().reduce(into: 0) { (result, iterator) in
            result += iterator.element * Int(pow(10, Double(iterator.offset)))
        }
    }
}

オーバーフローの考慮ができていなかった。

回答例

https://leetcode.com/problems/reverse-integer/solution/

  • pop, push で考える
  • 32bitでオーバーフローしたら0を返す方法を探す

回答例を見て修正

class Solution {
    func reverse(_ x: Int) -> Int {
        
        var x: Int = x
        var output: Int32 = 0
        
        while x != 0 {
            let pop: Int = x % 10
            x = x / 10
            let multiply = output.multipliedReportingOverflow(by: 10)
            if multiply.overflow { return 0 }
            let add = multiply.partialValue.addingReportingOverflow(Int32(pop))
            if add.overflow { return 0 }
            output = add.partialValue
        }
        
        return Int(output)
    }
}

f:id:hira22_1:20200604094456p:plain

感想

  • 難しかった

参考

【LeetCode】Easy: Two Sum

 

Two Sum

https://leetcode.com/problems/two-sum/

自分の回答

Swift Runtime: 12 ms

class Solution {
    func twoSum(_ nums: [Int], _ target: Int) -> [Int] {
        let dic = Dictionary<Int, Int>(uniqueKeysWithValues: nums.enumerated().map{($0, $1)})
        for (i, num) in nums.enumerated() {
            if dic.values.contains(target - num) {
                let j = dic.filter {$0.value == (target - num)}.keys.first!
                return [i,j]
            }
        }
        fatalError()
    }
}

回答例

https://leetcode.com/problems/two-sum/solution/

const twoSum = function(nums, target) {
    const comp = {};
    for(let i=0; i<nums.length; i++){
        if(comp[ nums[i] ] >= 0){
            return [ comp[ nums[i] ] , i]
        }
        comp[ target-nums[i] ] = i
    }
};

回答例を見て修正

class Solution {
    func twoSum(_ nums: [Int], _ target: Int) -> [Int] {
        var dic = Dictionary<Int, Int>()
        for (i, num) in nums.enumerated() {
            if let j = dic[target - num] {
                return [i,j]
            }
            dic[num] = i
        }
        fatalError("No two sum solution")
    }
}

f:id:hira22_1:20200604085655p:plain

感想

  • ヒントを見て、Dictionary を使うとこまではわかった。
  • Dictionaryの Key に与えられた数字を入れていくのは、そういうケースがなかったからか発想できなかった。
  • 回答例を実行すると 0ms で実行されるのだが、もっと早くなるのだろうか…

参考

Swift - SwiftのDictionary型でkeyを取り出す方法|teratail

let a = [
   "apple": 100,
   "orange": 200,
   "banana": 100,
]
print(Array(a.filter {$0.value == 100}.keys))
//=> ["banana", "apple"]

functional programming - Convert Swift Array to Dictionary with indexes - Stack Overflow

Xcode 9 - 10 • Swift 4.0 - 4.2

Using Swift 4 reduce(into:) method:

extension Collection  {
    var indexedDictionary: [String: Element] {
        return enumerated().reduce(into: [:]) { $0[String($1.offset)] = $1.element }
    }
}

Using Swift 4 Dictionary(uniqueKeysWithValues:) initializer and passing a new array from the enumerated collection:

extension Collection {
    var indexedDictionary: [String: Element] {
        return Dictionary(uniqueKeysWithValues: enumerated().map{(String($0),$1)})
    }
}