AtCoder Beginner Contest 237の感想

AtCoder Beginner Contest 237 - AtCoder
AtCoder is a programming contest site for anyone from beginners to experts. We hold weekly programming contests online.

A – Not Overflow

PythonのintはC++のlong longと違って上限がないので、そのまま実装。

n = int(input())

if -2 ** 31 <= n < 2 ** 31:
    print('Yes')
else:
    print('No')

B – Matrix Transposition

行と列を入れ替えてループを回す。

h, w = map(int, input().split())
a = [list(map(int, input().split())) for _ in range(h)]

ans = []
for i in range(w):
    temp = []
    for j in range(h):
        temp.append(a[j][i])
    ans.append(temp)

for i in ans:
    print(*i)

numpyを使えば.Tで行列のtransposeを得ることが出来るので簡単。

import numpy as np

h, w = map(int, input().split())
a = [list(map(int, input().split())) for _ in range(h)]
a = np.array(a)

ans = a.T
for i in ans:
    print(*i)

C – kasaka

好きなだけ先頭にaを足せるので、末尾から連続するaは全て相殺できる。

先頭と末尾から始まるポインタを2つ用意し、1つずつ進めていくことを考える。

先頭と末尾の両方にaがある場合と、末尾だけにaがある場合があるので、それぞれの状態でポインターを進めていく。

s = input()
n = len(s)

l = 0
r = n - 1

while s[l] == s[r] == 'a' and l < r:
    l += 1
    r -= 1

while s[r] == 'a' and l < r:
    r -= 1

これで、ポインタをa以外の文字の所までことが出来た。

後は残りの文字列が回分かどうか判定すれば解決。

while l < r:
    if s[l] != s[r]:
        break

    l += 1
    r -= 1

print('Yes' if l >= r else 'No')

D – LR insertion

リンクリストを使って順番に処理しようか考えていたが、うまく行かなかった。

逆順で処理することにより、両端キューを使って高速に解くことができた。

LRが反転するのことに注意。

from collections import deque

n = int(input())
s = input()

ans = deque([n])

for i in range(n - 1, -1, -1):
    if s[i] == 'R':
        ans.appendleft(i)
    else:
        ans.append(i)

print(*ans)

コメント

タイトルとURLをコピーしました