paizaのCランク獲得問題の解答がなかったので、備忘録として残します。
明らかに簡単な問題の場合は省略しますが、個人的に少しでも考えたコードを残していきたいと思います。
初心者ですので醜いコードを書きますが、温かい目で見守っていただけると嬉しいです。
また、より良い記述方法などありましたら、コメント等で教えていただけると嬉しいです。
目次
- 文字列の検索
- 文字列の反転
- 回文判定
- 文字列の分割
- 日時データの変換その1
- 日時データの変換その2
- 数値判定
- 重複の削除
- パスワード作成
- 表記の訂正
- 数式の計算( 1 桁)
- 数式の計算
- 巨大な数の足し算(繰り上がりなし)
- 巨大な数の足し算
- 巨大な数のかけ算
文字列の検索
using System;
class Program
{
public static void Main()
{
string S =Console.ReadLine();
string T =Console.ReadLine();
if(S.Contains(T)){
Console.WriteLine("YES");
}else{
Console.WriteLine("NO");
}
}
}
文字列の反転
using System;
using System.Linq;
class Program
{
public static void Main()
{
string S=Console.ReadLine();
string reverseS=new string(S.Reverse().ToArray());
Console.WriteLine(reverseS);
}
}
回文判定
using System;
using System.Linq;
class Program
{
public static void Main()
{
string S=Console.ReadLine();
string reverseS=new string(S.Reverse().ToArray());
if(S==reverseS){
Console.WriteLine("YES");
}else{
Console.WriteLine("NO");
}
}
}
文字列の分割
using System;
class Program
{
public static void Main()
{
string [] S=Console.ReadLine().Split(',');
foreach(var result in S){
Console.WriteLine(result);
}
}
}
日時データの変換その1
using System;
class Program
{
static void Main()
{
string [] S=Console.ReadLine().Split('/');
string [] R=S[3].Split(':');
for(int i=0;i<3;i++){
Console.WriteLine(S[i]);
}
for(int i=0;i<R.Length;i++){
Console.WriteLine(R[i]);
}
}
}
日時データの変換その2
using System;
using System.Linq;
class Program
{
static void Main()
{
string []yyyyMMddhhmm= Console.ReadLine().Split(' ');
string yyyyMMdd=yyyyMMddhhmm[0];
string hhmm=yyyyMMddhhmm[1];
string [] R1=yyyyMMdd.Split('/');
string [] R2=hhmm.Split(':');
string [] R = R1.Concat(R2).ToArray();
foreach(var result in R){
Console.WriteLine(result);
}
}
}
数値判定
using System;
class Program
{
static void Main()
{
string S=Console.ReadLine();
bool result=true;
foreach(char s in S){
if (!char.IsDigit(s)){
result=false;
break;
}
}
if(result){
Console.WriteLine("YES");
}else{
Console.WriteLine("NO");
}
}
}
初めはTry.Parseを考えたのですが、intの範囲を超えると正しく判定されるので上手くいきませんでした。
重複の削除
using System;
using System.Collections.Generic;
class Program
{
public static void Main()
{
string S=Console.ReadLine();
HashSet<char> chek=new HashSet<char>();
string result="";
foreach (char c in S)
{
if (!chek.Contains(c))
{
result += c;
chek.Add(c);
}
}
Console.WriteLine(result);
}
}
ハッシュセットを用いました。
パスワード作成
using System;
class Program
{
public static void Main()
{
int N=int.Parse(Console.ReadLine());
int Q=int.Parse(Console.ReadLine());
int[] n = new int[Q];
string[] c = new string[Q];
for(int i=0;i<Q;i++){
string[] values = Console.ReadLine().Split();
n[i] = int.Parse(values[0]) - 1;
c[i] = values[1];
}
string K = Console.ReadLine();
string []pass=new string[N];
for(int i=0; i<N;i++){
pass[i]=K;
}
for(int i=0;i<Q;i++){
pass[n[i]]=c[i];
}
for(int i=0; i<N;i++){
Console.Write(pass[i]);
}
}
}
表記の訂正
using System;
class Program
{
public static void Main()
{
string S=Console.ReadLine();
string[] point =S.Split('.');
if(point.Length>2){
string []point1=new string[point.Length-1];
for(int i=0;i<point1.Length;i++){
point1[i]=point[i+1];
}
S=point[0]+"."+string.Join("",point1);
}
if (S.IndexOf('.') != -1){
S=S.TrimEnd('0');
}
S=S.TrimStart('0');
if(S.IndexOf('.')==0){
S = "0" + S.TrimStart('0');
}
if(S==""){
S="0";
}
Console.WriteLine(S);
}
}
こちらのサイトを参考にさせていただきました。
数式の計算( 1 桁)
using System;
class Program
{
public static void Main()
{
string S=Console.ReadLine();
char []s=S.ToCharArray();
int ans=(int)Char.GetNumericValue(s[0]);
for(int i=0;i<s.Length;i++){
if(s[i]=='+'){
ans+=(int)Char.GetNumericValue(s[i+1]);
}
if(s[i]=='-'){
ans-=(int)Char.GetNumericValue(s[i+1]);
}
}
Console.WriteLine(ans);
}
}
数式の計算
using System;
using System.Collections.Generic;
class Program
{
public static void Main()
{
string S = Console.ReadLine();
List <string>list =new List<string>();
int count=0;
for(int i=0;i<S.Length;i++){
if(S[i] == '+' || S[i] == '-'){
list.Add(S.Substring(count,i-count));
count=i;
}else if(i ==S.Length-1){
list.Add(S.Substring(count, i - count+ 1));
}
}
int ans=0;
foreach(string item in list){
ans+=int.Parse(item);
}
Console.WriteLine(ans);
}
}
巨大な数の足し算(繰り上がりなし)
using System;
using System.Collections.Generic;
class Program
{
public static void Main()
{
string S = Console.ReadLine();
char[] s=S.ToCharArray();
string T =Console.ReadLine();
char []t=T.ToCharArray();
int []ans =new int [S.Length];
for(int i=0;i<S.Length;i++){
int ints=(int)Char.GetNumericValue(s[i]);
int intt=(int)Char.GetNumericValue(t[i]);
ans[i]=ints+intt;
}
foreach(var result in ans){
Console.Write(result);
}
}
}
同じ桁数かつ繰り上がりがないので、出来る方法です。。
charをintに変換するのはint.Parse(s[i].ToString());で出来ます。。
巨大な数の足し算
using System;
using System.Linq;
class Program
{
public static void Main()
{
string S = Console.ReadLine();
char[] s=S.ToCharArray().Reverse().ToArray();
string T =Console.ReadLine();
char []t=T.ToCharArray().Reverse().ToArray();
string ans="";
int kuri =0;
for(int i=0;i<S.Length;i++){
int ints=int.Parse(s[i].ToString());
int intt=int.Parse(t[i].ToString());
int wa=ints+intt+kuri;
kuri=wa/10;
wa%=10;
ans+=wa.ToString();
}
if(kuri !=0){
ans+=kuri;
}
foreach(var result in ans.Reverse()){
Console.Write(result);
}
}
}
巨大な数のかけ算
using System;
using System.Linq;
class Program
{
public static void Main()
{
string S = Console.ReadLine();
char[] s=S.ToCharArray().Reverse().ToArray();
int t=int.Parse(Console.ReadLine());
string ans="";
int kuri=0;
if(t==0 ||(s.Length == 1 && int.Parse(S) == 0)){
Console.WriteLine("0");
return;
}
for(int i=0;i<S.Length;i++){
int ints=int.Parse(s[i].ToString());
int seki =ints*t+kuri;
kuri=seki/10;
seki%=10;
ans+=seki.ToString();
}
if(kuri !=0){
ans+=kuri;
}
foreach(var result in ans.Reverse()){
Console.Write(result);
}
}
}
またこちらのサイトを参考にさせていただきました。