[백준] 1283 - 단축키 지정
1. 문제
2. 개요
한 프로그램에 N개의 옵션이 주어진다.
각 옵션에 아래와 같은 규칙을 적용하여 단축키를 지정하려고 한다.
- 먼저 하나의 옵션에 대해 왼쪽에서부터 오른쪽 순서로 단어의 첫 글자가 이미 단축키로 지정되었는지 살펴본다. 만약 단축키로 아직 지정이 안 되어있다면 그 알파벳을 단축키로 지정한다.
- 만약 모든 단어의 첫 글자가 이미 지정이 되어있다면 왼쪽에서부터 차례대로 알파벳을 보면서 단축키로 지정 안 된 것이 있다면 단축키로 지정한다.
- 어떠한 것도 단축키로 지정할 수 없다면 그냥 놔두며 대소문자를 구분치 않는다.
- 위의 규칙을 첫 번째 옵션부터 N번째 옵션까지 차례대로 적용한다.
이 때 각 옵션을 단축키로 지정된 문자에 괄호를 씌워 출력하는 문제.
3. 풀이 및 코드
3-1. 풀이
각 옵션에 대해 단축키에 괄호를 씌운 문자열을 저장하는 shortcuts, 단축키로 사용된 문자를 저장해둘 chk 딕셔너리를 각각 만들어둔다. chk에는 미리 공백값을 키로 넣어둔다.
규칙의 순서에 맞게 먼저 각 옵션의 단어의 첫 글자를 탐색한다.
chk에 해당 문자가 존재하지 않는다면 해당 문자를 chk에 넣어 저장하고, 해당 문자에 괄호를 씌운 값을 value로 원래 옵션을 key로 하여 shortcuts에 저장한다.
저장했다면 isdone을 true로 만들고 빠져나온다.
isdone이 true라면 다음 옵션으로 넘어가고 아니라면 계속 진행한다.
옵션의 첫문자부터 끝 문자까지 위와 같은 방식으로 반복한다.
만약 아직도 isdone이 true가 되지 않았다면 단축키를 지정할 수 없는 경우이므로 옵션을 key와 value로 하는 값을 저장한다.
모든 옵션에 대해 작업을 완료했다면 shortcuts에 입력 순서대로 저장되게된다.
shortcuts의 value값들을 모두 출력한다.
3-2. Python
import sys
N = int(sys.stdin.readline())
shortcuts = dict()
chk = dict()
chk[" "] = 1
for i in range(N):
option = list(sys.stdin.readline().split())
origin = " ".join(option)
isdone = False
for j in range(len(option)):
if option[j][0].upper() not in chk:
chk[option[j][0].upper()] = 1
option[j] = option[j].replace(option[j][0], "[%s]" %option[j][0], 1)
shortcuts[origin] = " ".join(option)
isdone = True
break
if isdone:
continue
for j in origin:
if j.upper() not in chk:
shortcuts[origin] = origin.replace(j, "[%s]" %j, 1)
chk[j.upper()] = 1
isdone = True
break
if isdone:
continue
shortcuts[origin] = origin
for w in shortcuts.values():
print(w)
3-3. C#
namespace boj_1283
{
internal class Program
{
static void Main(string[] args)
{
StreamReader sr = new StreamReader(Console.OpenStandardInput());
StreamWriter sw = new StreamWriter(Console.OpenStandardOutput());
int N = int.Parse(sr.ReadLine());
Dictionary<string, string> shortcuts = new Dictionary<string, string>();
Dictionary<char, bool> chk = new Dictionary<char, bool>();
chk[' '] = true;
for (int i = 0; i < N; i++)
{
string[] option = sr.ReadLine().Split();
string origin = string.Join(" ", option);
bool isdone = false;
for (int j = 0; j < option.Length; j++)
{
if (!chk.ContainsKey(char.ToUpper(option[j].First())))
{
chk[char.ToUpper(option[j].First())] = true;
option[j] = $"[{option[j][0]}]" + option[j].Substring(1);
shortcuts[origin] = string.Join(" ", option);
isdone = true;
break;
}
}
if (isdone)
continue;
for (int j = 0; j < origin.Length; j++)
{
if (!chk.ContainsKey(char.ToUpper(origin[j])))
{
chk[char.ToUpper(origin[j])] = true;
shortcuts[origin] = origin[0..j] + $"[{origin[j]}]" + origin[(j + 1)..];
isdone = true;
break;
}
}
if (isdone)
continue;
shortcuts[origin] = origin;
}
foreach (string s in shortcuts.Values)
sw.WriteLine(s);
sw.Close();
}
}
}
Comments