본문 바로가기
백준/10001 - 15000

[백준] 12846번 : 무서운 아르바이트

by lms0806 2026. 4. 11.
728x90
반응형

https://www.acmicpc.net/problem/12846

 

Stack 풀이로 유명한 유형중 하나인 문제를 해결해보았습니다. 예제 출력이 정답인 이유는 [20, 30, 20]으로 설정하여 20 * 3을 구한 60이 나오기 때문입니다.

use std::io::Write;
use std::{io, str};

pub struct UnsafeScanner<R> {
    reader: R,
    buf_str: Vec<u8>,
    buf_iter: str::SplitAsciiWhitespace<'static>,
}

impl<R: io::BufRead> UnsafeScanner<R> {
    pub fn new(reader: R) -> Self {
        Self {
            reader,
            buf_str: Vec::with_capacity(1 << 16),
            buf_iter: "".split_ascii_whitespace(),
        }
    }

    #[inline(always)]
    pub fn token<T: str::FromStr>(&mut self) -> T {
        loop {
            if let Some(token) = self.buf_iter.next() {
                return token.parse().ok().expect("Failed parse");
            }
            self.buf_str.clear();
            self.reader
                .read_until(b'\n', &mut self.buf_str)
                .expect("Failed read");
            self.buf_iter = unsafe {
                let slice = str::from_utf8_unchecked(&self.buf_str);
                std::mem::transmute(slice.split_ascii_whitespace())
            };
        }
    }

    pub fn token_eof<T: str::FromStr>(&mut self) -> Option<T> {
        loop {
            if let Some(token) = self.buf_iter.next() {
                return Some(token.parse().ok()?);
            }
            self.buf_str.clear();
            let n = self.reader.read_until(b'\n', &mut self.buf_str).ok()?;
            if n == 0 {
                return None;
            }
            self.buf_iter = unsafe {
                let slice = str::from_utf8_unchecked(&self.buf_str);
                std::mem::transmute(slice.split_ascii_whitespace())
            };
        }
    }

    pub fn line(&mut self) -> String {
        self.buf_iter = "".split_ascii_whitespace();
        self.buf_str.clear();
        self.reader.read_until(b'\n', &mut self.buf_str).unwrap();
        let s = str::from_utf8(&self.buf_str).unwrap();
        s.trim_end().to_string()
    }
}

fn main() {
    let (stdin, stdout) = (io::stdin(), io::stdout());
    let reader = io::BufReader::with_capacity(1 << 20, stdin.lock());
    let mut scan = UnsafeScanner::new(reader);
    let mut out = io::BufWriter::new(stdout.lock());

    let n = scan.token::<usize>();
    let mut arr = (0..n).map(|_| scan.token::<i64>()).collect::<Vec<_>>();

    arr.push(0);

    let mut answer = 0;
    let mut stack = Vec::new();
    for i in 0..=n {
        while !stack.is_empty() && arr[*stack.last().unwrap()] > arr[i] {
            let h = arr[stack.pop().unwrap()];
            let width = if stack.is_empty() {
                i as i64
            } else {
                (i - stack.last().unwrap() - 1) as i64
            };

            answer = answer.max(h * width);
        }
        stack.push(i);
    }
    write!(out, "{}", answer).unwrap();
}

728x90
반응형

'백준 > 10001 - 15000' 카테고리의 다른 글

[백준] 11920번 : 버블 정렬  (0) 2025.11.13
[백준] 12895번 : 화려한 마을  (0) 2025.10.19
[백준] 10999번 : 구간 합 구하기 2  (0) 2025.09.08
[백준] 11962번 : Counting Haybales  (0) 2025.08.31
[백준] 12844번 : XOR  (0) 2025.08.23

댓글