타이핑을 하다 보면 키보드에서 양손을 모두 원래 위치보다 오른쪽으로 한 칸 이동한 상태에서 키를 눌러서 오타가 나오는 경우가 종종 있다. 그러면 '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();
}

 

+ Recent posts