Sky株式会社プログラミングコンテスト2023(AtCoder Beginner Contest 329)の解説記事です。
ABC329 A – Spread
問題
問題文の要約は以下の通りです。
問題の要約
英大文字からなる文字列 \(S\) が与えられたとき、\(S\) の各文字を空白で区切り、その順で1文字ずつ出力せよ。
制約
・\(S\) は長さ2以上100以下の英大文字からなる文字列
入力
\(S\)
出力
\(S\) の各文字を空白で区切り、1文字ずつ出力せよ。
解説
*
を使用する。
解説
Pythonには、文字列を空白区切りで出力するために*
を使用できます。
入力を受け取り*
を使用して出力します。
# 入力と出力
print(*(input()))
解答
# 入力と出力
print(*(input()))
ABC329 B – Next
問題
問題文の要約は以下の通りです。
問題の要約
\(N\) 個の整数 \(A_1, A_2 , \cdots , A_N\) が与えられたとき、最大でない整数の中で最大である整数を求めよ。
制約
・\(2 \le N \le 100\)
・\(1 \le A_i \le 100\)
・\(A_1, A_2 , \cdots , A_N\) がすべて等しいということはない
・入力値はすべて整数
入力
\(N\)
\(A_1\) \(A_2\) \(\cdots\) \(A_N\)
出力
答えを出力せよ。
解説
重複を削除して2番目に大きいものを求める。
解説
まず入力 \(N\) をint
型として受け取ります。(この \(N\) は使用しません。)
# 入力(使用しない)
N=int(input())
\(A_1, A_2 , \cdots , A_N\) をint
型のset
として受け取り、重複を削除します。
これをlist
型に変換します。
# 重複を削除
A=list(set(map(int,input().split())))
降順にソートします。降順にソートするにはreverse=True
を指定します。
# 降順にソート
A.sort(reverse=True)
最後に2番目に大きいものを出力します。
# 2番目に大きいものを出力
print(A[1])
解答
# 入力(使用しない)
N=int(input())
# 重複を削除
A=list(set(map(int,input().split())))
# 降順にソート
A.sort(reverse=True)
# 2番目に大きいものを出力
print(A[1])
ABC329 C – Count xxx
問題
問題文の要約は以下の通りです。
問題の要約
英小文字からなる長さ \(N\) の文字列 \(S\) の空でない連続した部分文字列のうち、1種類の文字のみからなるものの数を求めよ。ただし、文字列として等しい部分文字列同士は、取り出し方が異なっても区別しない。
制約
・\(1 \le N \le 2 × 10^5\)
・\(S\) は英小文字からなる長さ \(N\) の文字列
入力
\(N\)
\(S\)
出力
\(S\) の空でない部分文字列であって、1種類の文字のみからなるものの数を出力せよ。
解説
ランレングス圧縮を実装する。
解説
同じ文字が何文字連続しているかを格納する辞書を用意して置き、\(S\) を前から1文字ずつ見る。
同じ文字が連続しているかを判定し、違う文字であればそれまで何文字連続していたかを辞書に格納する。
解答
# import
import collections
# 入力
N=int(input())
S=input()
# 同じ文字が何文字連続しているかを格納する辞書
ans=collections.defaultdict(int)
# 1つ前の文字
bef=''
# 何文字連続しているか
cnt=0
# Sを1文字ずつ見る
for s in S:
# 1つ前の文字と一致⇒何文字連続しているかを+1
if s==bef:
cnt+=1
# 1つ前の文字と異なる⇒辞書に格納、1つ前の文字と何文字連続しているかを初期化
else:
ans[bef]=max(ans[bef],cnt)
bef=s
cnt=1
ans[bef]=max(ans[bef],cnt)
# 辞書の値を合計する
print(sum(ans.values()))