https://www.acmicpc.net/problem/1620
Rust언어를 공부하면서 책을 보고 예제를 보고는 있는데 그래도 코드를 좀 짜봐야지 익숙해질 것 같은 느낌이 든다. 그래서 백준 문제중에서 만만한 것들을 Rust로 좀 풀어보기로 하였다.
일단 만만한 문제의 기준은 https://solved.ac/class/에 있는 녀석 중 내가 아직 안 푼 문제들이다.
일단근데 Rust는 Input 받는것 부터 잘 몰라서, 다음 깃허브에 있는 녀석들을 한번 참고하면 좋을 듯 하다.
https://github.com/EbTech/rust-algorithms
깃허브 자체가 Rust로 Contest나가는거니... scanner도 보인다.
문제 자체는 간단하다, String 배열로 받아서 저장해놓고 그때그때 맞는 녀석 출력하면 될 듯 하다. 한번 Rust로 짜보자..!
#![allow(unused_imports)]
#![allow(dead_code)]
use std::cmp::*;
use std::collections::*;
struct Scanner {
buffer : std::collections::VecDeque<String>
}
impl Scanner {
fn new() -> Scanner {
Scanner {
buffer: std::collections::VecDeque::new()
}
}
fn next<T : std::str::FromStr >(&mut self) -> T {
if self.buffer.len() == 0 {
let mut input = String::new();
std::io::stdin().read_line(&mut input).ok();
for word in input.split_whitespace() {
self.buffer.push_back(word.to_string())
}
}
let front = self.buffer.pop_front().unwrap();
front.parse::<T>().ok().unwrap()
}
fn next_str(&mut self) -> String {
if self.buffer.len() == 0 {
let mut input = String::new();
std::io::stdin().read_line(&mut input).ok();
for word in input.split_whitespace() {
self.buffer.push_back(word.to_string())
}
}
self.buffer.pop_front().unwrap()
}
}
fn main() {
let mut cin = Scanner::new();
let n:usize = cin.next();
let m:usize = cin.next();
let mut arr = vec![]; // index to string
let mut hash = HashMap::new(); // string to index
for i in 0..n {
let name = cin.next_str();
arr.insert(i, name.clone());
hash.insert(name.clone(), i);
}
for _ in 0..m {
let query = cin.next_str();
if query.parse::<i32>().is_ok() {
let index: usize = query.parse::<usize>().unwrap();
println!("{}", arr[index-1]);
} else {
match hash.get(&query) {
Some(index) => println!("{}", index+1),
None => println!("Error case!")
}
}
}
}
어째 저째 대충 짜본 코드이다.
스캐너로 input 받는것은 아래 레퍼런스를 참고했다.
http://codeforces.com/contest/702/submission/19589375
정답은 나올거같은데, TLE가 난다. 왜그런진 모르겟음
그래서 답답한 마음에 C++로 후다닥 다시 짜서 보았다.
#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define MAXN 100005
string arr[MAXN];
map<string, int> mm;
int main() {
int n, m;
cin >> n >> m;
ios::sync_with_stdio(false);
cin.tie(NULL);
for(int i=1 ;i <= n; i++) {
string s;
cin >> s;
arr[i] = s;
mm[s] = i;
}
for (int i=0; i < m; i++) {
string v;
cin >> v;
if (v[0] >= 'A') {
cout << mm[v] << endl;
} else {
int idx = atoi(v.c_str());
cout << arr[idx] << endl;
}
}
}
하 C++로 하면 이렇게 간단하게 코드를 짤 수 있는데... 근데 보니깐 sync_with_stdio(false)를 넣지 않으면 TLE가 나는걸로 봐서는 아마 러스트 코드에서 TLE가 나는것은 Scanner가 느리거나, 인풋 받는데 vector를 선언해서 받고 하는데 이런게 느려서 그런거지 않을까 싶다.
고로... PS는 C++이 참 편하긴 한듯.
'개발 & CS 지식 > Rust' 카테고리의 다른 글
Rust로 웹 서버를 만들어 보자 (0) | 2020.07.28 |
---|---|
[Rust로 PS하기] 백준 2748번 피보나치 수 2번 풀이 (0) | 2020.05.10 |