留学生のプログラミング勉強日記 (original) (raw)

To Do (2025-07-04)

日記

やっと昼夜逆転を完全に戻しました!(11時睡眠7時起き)

最近、やっていることも多くて、やってみたいことも多くて大変です。
そのため、プログラミング問題以外にもいろんなことに挑戦しているんですが、まだ成果は出ていません。

今後、何か成果が出たらまた報告できるのを楽しみにして、頑張ります!

今日のプログラミング問題

BOJは11000 解説とコード

感想

講義が時間的に重ならないように、最小の教室数を求める問題。 時間が重ならないためには、開始時間が早い順に、終了時間もできるだけ早いものを選んでいく必要がある。

既に割り当てた教室の中で終了時間が最も早いものから再利用できるかを確認する必要がある。

つまり、終了時間が早い順に管理するために優先度付きキューを使って、 新しい教室が必要かどうかを判定する。

今年の目標

To Do (2025-07-03)

今日のプログラミング問題

BOJは2352 解説とコード

感想

線が交差しないように、できるだけ多くの線をつなぐ本数を求める問題。 線が交差しないためには、左側のポート番号が小さい順に、 右側の接続先も小さい順になるように選ぶ必要がある。

つまり「右側の接続先の番号」が単調増加するように部分列を選ぶことを考慮するとLISを求める問題に置換可能。

今年の目標

To Do (2025-07-01)

日課

研究のために、論文のアルゴリズムを実装しています!

これまで競技プログラミングで実装力は鍛えられたのですが、Jupyter Notebook上で全体を把握して実装せず、論文の数式をそのまま段階的に実装してしまったため、コードがかなりごちゃごちゃになってしまいました。

また、せっかくオブジェクト指向を活かせるPythonを使っているのに、クラスなどの重要な機能を使わず、毎回ハードコーディングで書いているだけでは、自分の成長にもつながらないと感じました。

そこで、これまで書いていたもの(ipynb形式で関数化しただけのコード)をクラス化して、今後同じモジュールが必要になったときに再利用しやすいようにしたいと考え、実装を進めています。

特に、深層学習などで他の人が作ったクラスを使うと本当に便利だと感じたので、自分でも同じように作れるようにしたいと思いました。

しかし、コードをしっかりモジュール化したら、なぜか再現性が取れず、変な結果が出てしまいました…。

ただ、数式自体には問題がなさそうだったので、論文のハイパーパラメータを参考にして再度試してみてもダメでした。

今週は何が問題なのかをしっかり考えながら、腰を据えて実装を直していく予定です(´;ω;`)****

今年の目標

To Do (2025-06-29)

日課

今日は体調不良で、プログラミング1問とバイト、適性検査(集中できなくて時間切れ(´;ω;`))だけやりました。

たぶん、エアコンをつけっぱなしで寝てしまって風邪をひいたかもしれません。

韓国では「バカは夏風邪をひく」という言葉がありますけど、エアコンつけっぱなしの自分はやっぱりバカかもしれませんね…。

今日のプログラミング問題

BOJは11690

昨日AtCoderで解けなかったLCM問題の基礎編みたいな問題です。

でもPythonで10 ** 8までの配列を扱うメモリ管理がきつかったので、他の問題を解きました。

14719

解説とコード

'''

問題 :

    2次元の世界で、幅Wの区間に高さH以下のブロックが並んで積まれています。十分な雨が降ると、ブロックの間に水がたまります。

    ブロックの高さの配列が与えられるので、水がたまる総量(1マス=1単位)を計算してください。

解法 :

    piv = 1, 2, 3... n - 1 で

    左の最大値、右の最大値(壁の高さの最大値を示す)を求めて、

    二つの壁の中で小さいものから今の壁の高さを引くと、結局問題を満足する答えが得られる。

'''

今年の目標

To Do (2025-06-28)

Atcoder 412 (perf 1001, rating 631 -> 676)

Cまでしか解けなかったのに1001perf...初心者に厳しい問題セットだったかなーと思います

A

A - Task Failed Successfully

Pasted image 20250628230439.png

n行の入力で a_i < b_iの数を数える問題

コード

n = int(input()) ans = 0 for i in range(n):     a, b = map(int, input().split())     if a < b:         ans += 1 print(ans)

行別に入力をもらい、a, bを比較してbが大きいとansを+=1しました!

B

B - Precondition

S の先頭でない英大文字の直前の文字はすべて T に含まれるかを確認する問題。

AtCoder Total

Pythonなら.isupper()を用いると簡単に英大文字の判別ができます!

コード

n = str(input().rstrip()) m = set(str(input().rstrip()))

for i in range(len(n) - 1):     now = n[i + 1]     if now.isupper():         if n[i] not in m:             print('No')             sys.exit() print('Yes')

C

C - Giant Domino

問題文の条件が複雑ですので、この記事では解法の説明だけ載せます!

まず、各々のテストケースでもらう数字列中、最初のドミノと最後のドミノは決まっているため、分割しました。

また、答えは条件を満たすドミノの並べ方は存在しますか?また、存在する場合は最小で何個のドミノを並べる必要がありますか?このように、存在する場合は最小で何個を求める問題であるため、貪欲法を検討しました。

まず、lstの変数に数字列をリスト形式で入力します。

また、上述したよう最初のドミノと最後のドミノ、それ以外のドミノ数列リストで分割します。

n = int(input()) lst = list(map(int, input().split())) now = lst[0] end = lst[-1] llst = lst[1:-1] llst.sort()

まず、条件を満たすドミノの並べ方は存在するのかを確認するため、最後のドミノを倒すために必要な中間のドミノを選ぶ戦略を考えます。

最後のドミノ(end)を右に倒すためには、その直前のドミノをxとするとx * 2 ≥ end を満たす必要があります。

この条件を満たすxをllstの中からなるべく小さいものを貪欲に選んで、倒れる連鎖を作ります。

これを繰り返し、最初のドミノ(now)にたどり着けるかを判定します。

具体的には、ソートしたllstを二分探索で使い、endを倒せる最小のxを探します

そのxを使ってendを更新します(end = x)

もしllst内にx * 2 ≥ endを満たすxがなければ失敗です。

whileループでこの更新を繰り返し、最終的にend ≤ 2 * nowになれば、全てのドミノが倒せます。

したがって、正解コードは

tc = int(input()) for _ in range(tc):     n = int(input())     lst = list(map(int, input().split()))     ans = 2     now = lst[0]     end = lst[-1]     llst = lst[1:-1]     llst.sort()     flag = True

    while end > now * 2:         newlst = [i * 2 for i in llst]         lft = bisect.bisect_left(newlst, end)         llft = bisect.bisect_left(newlst, end * 2)

        if lft == llft:             print('-1')             flag = False             break

        ans += 1         end = newlst[lft] // 2                 if flag:         print(ans)

コード

n = str(input().rstrip()) m = set(str(input().rstrip()))

for i in range(len(n) - 1):     now = n[i + 1]     if now.isupper():         if n[i] not in m:             print('No')             sys.exit() print('Yes')

今年の目標

To Do (2025-06-27)

日課

研究とコーディングテストとインターンの課題

やっていることが多くて、そこから新しいことを学んだりしていますが、会社や大学の研究なので、残念ながら報告はできません(´;ω;`)

日記

今日のプログラミング問題

BOJは25418 解説とコード

数字A, Bが入力され、Aには2倍 or + 1をすることができる。

数字AがBになるまで必要な演算の回数を求める。

A, B <= 1,000,000で十分小さいし、

この問題は大きい数字が2で割れるなら割ることが有利なので、貪欲なアプローチで解いた。

感想

今年の目標

To Do (2025-06-26)

ABC409(perf 543, rating 579 -> 575)

飲酒atcoderはやめましょう

Pasted image 20250626215557.png用事があって、酒飲んでからatcoderやりました!

韓国では酒のことを勇気のポーションって言ってる人もおるんですけど

自分も酒飲んでたら勇気が湧いちゃってとんでもない答え出しすぎました。

飲酒atcoderはやめましょう!

A - Conflict

code

4 oxoo xoox

xがかぶっているときもYesを出力してしまい一回WA

B - Citation

code

長さ N の非負整数列 A=(A1,A2,…,AN)A=(A1​,A2​,…,AN​) が与えられます。次を満たす最大の非負整数 x を求めてください。

1 <= N <= 100なので

0 ~ 100の範囲だけ探索したらok

C - Equilateral Triangle

code

ABC410(perf 1023, rating 575 -> 631)

A - G1

code

for文回しで数えるとOK

B - Reverse Proxy

code

シミュレーション問題。

if, elseで条件を分けてシミュレーションを行ったらAC

C - Rotatable Array

code

dequeの回転を用いたらWA

すべてのクエリを保存し、一気にすべてのクエリを処理したらAC

lazysegのアプローチと似てると考えると楽!

D - XOR Shortest Walk

code

XORでた!!!!

今回は前苦労していたorpathのXORバージョンと似ていました!

n, m <= 1000で計算量が少なかったので、すべての場合をsetで保存し、最小値を求めました

今年の目標