トップページに戻る
次の競技プログラミングの問題へ
前の競技プログラミングの問題へ
No.39 桁の数字を入れ替え
■■■問題■■■
2桁以上9桁以下の数字Nが与えられる。
数字Nはいずれの桁にも数字の0を含まない。
どの桁の数字も1から9の数字で構成される。
いま、2つの桁の数字を自由に選んで、
1回だけ入れ替えることが許される。
入れ替えないという選択もできる。
最も大きな数字を作ろうとするとき、
その最も大きな数字はいくつか?
■■■入力■■■
N
Nは2桁以上9桁以下の数字。
各桁の数字は1から9で構成される。
いずれの桁にも0の数字は存在しない。
■■■出力■■■
最も大きな数字を出力せよ。
改行を忘れずに。
C#のソース
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
static string InputPattern = "Input1";
static List<string> GetInputList()
{
var WillReturn = new List<string>();
if (InputPattern == "Input1") {
WillReturn.Add("12");
//21
//12の1と2を入れ替えることで21が作れる。
}
else if (InputPattern == "Input2") {
WillReturn.Add("21");
//21
//入れ替えないという選択もできる。
}
else if (InputPattern == "Input3") {
WillReturn.Add("1122");
//2121
//最初の1と最後の2を入れ替えるとき、
//2121が最も大きな数字になる。
//入れ替えは1回のみ許される。
}
else if (InputPattern == "Input4") {
WillReturn.Add("999999999");
//999999999
//どのようにしても999999999にしかならない。
}
else {
string wkStr;
while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
}
return WillReturn;
}
static void Main()
{
List<string> InputList = GetInputList();
char[] StrArr = InputList[0].ToCharArray();
char[] DescStr = StrArr.OrderByDescending(X => X).ToArray(); ;
//降順に並べた配列と、差異がある中で最も左の添字
int ChangeInd1 = -1;
for (int I = 0; I <= StrArr.Length - 1; I++) {
if (StrArr[I] != DescStr[I]) {
ChangeInd1 = I;
break;
}
}
if (ChangeInd1 == -1) {
Console.WriteLine(StrArr);
return;
}
//降順に並べた配列のChangeInd1にある数字を持つ、最も右側の添字
int ChangeInd2 = Array.LastIndexOf(StrArr, DescStr[ChangeInd1]);
//三角交換
char wkSankaku = StrArr[ChangeInd1];
StrArr[ChangeInd1] = StrArr[ChangeInd2];
StrArr[ChangeInd2] = wkSankaku;
Console.WriteLine(new string(StrArr));
}
}
解説
入力された文字列を、降順にソートした配列を使ってます。