타이핑을 하다 보면 키보드에서 양손을 모두 원래 위치보다 오른쪽으로 한 칸 이동한 상태에서 키를 눌러서 오타가 나오는 경우가 종종 있다. 그러면 'Q'는 'W', 'J'는 'K' 같은 식으로 오른쪽에 있는 키가 입력된다. 이런 식으로 입력 된 메시지가 주어졌을 때 원래 메시지로 복구시켜야 하는 임무가 주어졌다.
입력
입력은 여러 줄의 텍스트로 구성된다. 각 줄에는 숫자, 스페이스, 대문자('Q', 'A', 'Z' 제외), 구두 문자(-, =, [, ], \, /)가 들어갈 수 있다. 구두문자에서 역따옴표는 제외한다. 단어가 붙어 있는 키(Tab, BackSp, Control)등은 입력에 들어있지 않다.
출력
위에 나와있는 QWERTY 키보드를 기준으로 하여 각 글자나 기호를 바로 왼쪽에 있는 키에 해당하는 글자나 기호로 바꿔야 한다. 입력에 있는 스페이스는 그대로 둔다.
예제

오타 입력을 하면, 왼쪽에 있는 키를 찾아서 출력해준다.
해설
각 키에 대한 맵핑을 검색해서 왼쪽 키를 찾으면 되는 쉬운 문제이다.
다만 이번부터 Rust를 사용하기로 해서 조금 삽질을 했다.
Rust의 매력을 느껴 보려 한다.
use std::io::{self, Stdin};
struct Wertyu {
key_layout: [String; 4],
user_input: String
}
impl Wertyu {
fn new() -> Self {
Wertyu {
key_layout: [
"`1234567890-=".to_string(),
"QWERTYUIOP[]\\".to_string(),
"ASDFGHJKL;'".to_string(),
"ZXCVBNM,./".to_string()
],
user_input: String::new()
}
}
fn input_text(&mut self) -> bool {
let stdin: Stdin = io::stdin();
let mut buffer: String = String::new();
match stdin.read_line(&mut buffer) {
Ok(_n) => {},
Err(e) => eprintln!("Error: {}", e),
}
self.user_input = buffer.trim().to_string();
let ret : bool = self.user_input.chars().all(|c| {
c.is_ascii_uppercase() ||
c.is_ascii_digit() ||
matches!(c, ' ' | '-' | '=' | '[' | ']' | '\\' | '\'' | ',' | '.' | '/')
});
if ret == false {
print!("Error : {} is not allowed", self.user_input);
return false;
}
for ch in self.user_input.chars() {
let ret = self.find_left_text(ch);
if ret != '\0' {
print!("{}", ret);
}
else {
print!("Error : {} is not allowed", ch);
return false;
}
}
print!("\n");
return true;
}
fn find_left_text(&self, ch: char) -> char {
let mut ret: char = '\0';
if ch == ' ' {
return ch;
}
for layout in &self.key_layout {
if let Some(index) = layout.find(ch) {
if index == 0 {
break;
}
if let Some(c) = layout.chars().nth(index - 1) {
ret = c;
}
break;
}
}
return ret;
}
}
fn main() {
let mut wertyu = Wertyu::new();
wertyu.input_text();
}
'코딩 테스트' 카테고리의 다른 글
| 문제 16 : 야찌(Yahtzee) (0) | 2025.04.18 |
|---|---|
| 문제 15 : 경시 대회 점수판(Contest Scoreboard) (0) | 2023.06.19 |
| 문제 14 : 에르되시 수(Erdős Numbers) (0) | 2023.05.26 |
| 문제 13 : 쌓아 올리기 (Stack'em Up) (0) | 2023.03.03 |
| 문제 12 : 암호 깨기 (Crypt Kicker) (0) | 2022.12.11 |