문제
알파벳 소문자로만 이루어진 단어 S가 주어진다. 각각의 알파벳에 대해서, 단어에 포함되어 있는 경우에는 처음 등장하는 위치를, 포함되어 있지 않은 경우에는 -1을 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 단어 S가 주어진다. 단어의 길이는 100을 넘지 않으며, 알파벳 소문자로만 이루어져 있다.
출력
각각의 알파벳에 대해서, a가 처음 등장하는 위치, b가 처음 등장하는 위치, ... z가 처음 등장하는 위치를 공백으로 구분해서 출력한다.
만약, 어떤 알파벳이 단어에 포함되어 있지 않다면 -1을 출력한다. 단어의 첫 번째 글자는 0번째 위치이고, 두 번째 글자는 1번째 위치이다.
주어진 단어에 대해서 알파벳 순서로 특정 조건에 맞춰 나열하는 문제입니다. 단어의 알파벳은 쉽게 체크할 수 있지만 알파벳 증가를 어떻게 할거냐란 문제가 생깁니다.
위 방식과 같이 아스키 코드를 이용해서 소문자 증가를 체크해주면 됩니다. 그러기 위해서 아스키 코드를 잠시 살펴보겠습니다.
보시면 10진수로 97번부터 122번까지가 알파벳입니다. 이를 이용해서 알파벳을 증가하면 되겠습니다. 그럼 코드를 작성하겠습니다.
코드
static void Main(string[] args)
{
//첫째 줄에 단어 S가 주어진다. 단어의 길이는 100을 넘지 않으며, 알파벳 소문자로만 이루어져 있다.
string input = Console.ReadLine();
int alphabet = 97;
for (int j = 97; j < 123; j++)
{
for (int i = 0; i < input.Length; i++)
{
//baekjoon
char inputAlphabet = input[i];
//중복되는 숫자를 없애자.
if (inputAlphabet == Convert.ToChar(j))
{
Console.Write(i);
Console.Write(" ");
}
}
}
}
그냥 출력하면 될 줄 알았는데 보니깐 문자열에서 중복되는 부분이 체크되는것 때문에 풀지를 못했습니다. 이 문제는 중복된 문자열을 제거해야되는 문제였습니다. 이어서 풀어보겠습니다.
위 방식을 통해 중복 알파벳을 제거한 후 알파벳을 검사했는데, 이 또한 입력받은 문자열 원형을 헤치기 때문에 출력 결과가 달라졌습니다. 때문에 다른 방식으로 다시 풀어봤습니다.
아래가 최종 결과물입니다.
static void Main(string[] args)
{
//첫째 줄에 단어 S가 주어진다. 단어의 길이는 100을 넘지 않으며, 알파벳 소문자로만 이루어져 있다.
string input = Console.ReadLine();
string output = FindAlphabets(input);
Console.WriteLine(output);
}
static string FindAlphabets(string someWord)
{
StringBuilder output = new StringBuilder();
for (int i = 97; i < 123; i++)
{
char alphabet = Convert.ToChar(i);
bool hasResult = false;
bool isFirstAlphabet = false;
for (int j = 0; j < someWord.Length; j++)
{
if (someWord[j] == alphabet && !isFirstAlphabet)
{
isFirstAlphabet = true;
hasResult = true;
output.Append(j).Append(" ");
}
}
if (!hasResult)
{
output.Append("-1").Append(" ");
}
}
output.Remove(output.Length - 1, 1);
return output.ToString();
}
정상적으로 출력됩니다. 그냥 bool값을 통해 알파벳이 첫번째로 감지되는지 확인했습니다.
이상입니다.
--추가--
using System;
class Pro {
static void Main()
{
string s = Console.ReadLine();
char x = 'a';
for (int i = 0; i < 26; i++)
{
Console.Write(s.IndexOf((char)(x + i)) + " ");
}
}
}
이렇게도 풀수있네요.
Console.Write(s.IndexOf((char)(x + i)) + " ");
s.IndexOf()를 통해 알파벳과 입력받은 단어를 비교하고있습니다. x+i는 char과 int로 데이터타입이 다른데도 불구하고 덧셈이 됩니다. 그래서 살짝 테스트해봤습니다.
char은 연산자가 들어가면 숫자로 인식하여 연산이 되는 것 같습니다. 아스키코드 값으로요... 이상입니다.