見出し画像

[Swift] AtCoder Beginner contest 250の記録 【A問題・B問題】

概要


・開催日時:2022-05-08(日) 21:00-22:40
・参加前レーティング:0(初参加)
・言語:Swift

結果


・A:Adjacent Squares(AC - 100)
・コンテスト内順位:5,703位
・参加後レーティング:0→12 (灰色)

A問題で提出したコード


import Foundation
 
let array = readLine()!.components(separatedBy: " ").map{ Int($0)! }
var H = array[0]
var W = array[1]
 
let array1 = readLine()!.components(separatedBy: " ").map{ Int($0)! }
var R = Int(array1[0])
var C = Int(array1[1])
 
var count = 0
 
for i in 1 ... H {
    for j in 1 ... W {
        // ∣a−c∣+∣b−d∣=1
        if abs(R - i) + abs(C - j) == 1 {
            count += 1
        }
    }
}
 
print(count)

【ポイント】
・forループの入れ子の中で、面している辺の数を、絶対値を使って求める。
・該当していれば+=1

【感想】
・見返してみるとかなり易しい問題だったが、7分ほどコードの実装に時間がかかってしまったので、次回のA問題の回答速度を短縮したい。

【コードレビュー】

var R = Int(array1[0])
var C = Int(array1[1])

//tupleを使いましょう(H,Wも同様)
var (R, C) = (Int(array1[0]), Int(array1[1]))


B問題

【感想】
・大学生のプログラミングゴリゴリやってた時なら絶対解けてた問題だったので、解けなくて悔しい。
・ただの偶奇判定にこんなにハマるとは思わなかった。
・(N*A)*(N*B)の直方形を描画することは出来たものの、問題文の意味を理解するのに時間がかかったことや、Boolを用いた#と.の切り替えがうまくいかなかったことが敗因。

【正解例】
https://atcoder.jp/contests/abc250/submissions/31520438

let input = readLine()!.split(separator: " ").map{ Int(String($0))! }
let (n, a, b) = (input[0], input[1], input[2])
 
for r in 0..<(a * n) {
    var line = ""
    for c in 0..<(b * n) {
        if ((r / a) % 2) ^ ((c / b) % 2) == 0 {
            line.append(".")
        } else {
            line.append("#")
        }
    }
    print(line)
}

・Swiftを使ってACされた方の中でを一番綺麗だと思ったコードを引用させていただきました。

解答指針としては、
・(n,a,b)のtupleを使う
・for入れ子(行→列)で、行ごとにlineを定義しansの改行を表現
・列ごとの処理
 - XOR演算子で偶奇判定し、2つの条件に合致していれば"."
    - そうでないなら"#"
・ansを表示

・XOR演算子を用いるという発想は自分には思いつきませんでした。
また、自分は改行する時にprint("/n")でエスケープシーケンスを使用していましたが、こちらの方が非常に綺麗なので良さそうでした。
・また、このlineを用いた解法は他のACされた方でも見られたので、こちら
がデフォルトっぽいです。次回から使おうと思いました。

(追記)
2日後くらいに提出したコード

ある日突然急に解法が思いついたので実装してみました。ACです。

let input = readLine()!.split(separator: " ").map{ Int(String($0))! }
let (n, a, b) = (input[0], input[1], input[2]) //N,縦,横
 
var black = ""
var white = ""
var bool: Bool = false
 
for h in 0 ..< b {
	black.append("#")
    white.append(".")
}
 
for i in 1 ... n*a {
  var line = ""
  if i % a == 0 && a == 1 { 
    if(bool){bool = false} else {bool = true}
  } else if i % a == 1{
  	if(bool){bool = false} else {bool = true}
  }
  
  for j in 0 ..< n*b / b {
      if j % 2 != 0 {
        if(bool){
          line.append(black)
        } else {
          line.append(white)
        }
      } else {
        if(bool){
          line.append(white)
        } else {
          line.append(black)
        }
      }
  }
  print(line)
}

・#と.を横の分だけforループでappendしておきます。
・.と#を切り替えるスイッチを作ります
・横*#.,分だけappendします

読み返してみると非常に読みにくいコードとなってしまいました。次からは可読性も上げる必要があると思いました。

・次回は今週土曜日の「パナソニックグループプログラミングコンテスト(AtCoder Beginner Contest 251)」に参加させていただきます。よろしくお願いいたします。


いいなと思ったら応援しよう!