<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>tain.log</title>
        <link>https://velog.io/</link>
        <description>블록체인 개발자</description>
        <lastBuildDate>Thu, 17 Oct 2024 03:47:14 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>tain.log</title>
            <url>https://velog.velcdn.com/images/sann_n/profile/6f62d93d-1e8e-4253-b553-b78e05e67cf7/social_profile.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. tain.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/sann_n" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[Rust로 백준 하루 하나] 16-11. queuestack]]></title>
            <link>https://velog.io/@sann_n/Rust%EB%A1%9C-%EB%B0%B1%EC%A4%80-%ED%95%98%EB%A3%A8-%ED%95%98%EB%82%98-16-11.-queuestack</link>
            <guid>https://velog.io/@sann_n/Rust%EB%A1%9C-%EB%B0%B1%EC%A4%80-%ED%95%98%EB%A3%A8-%ED%95%98%EB%82%98-16-11.-queuestack</guid>
            <pubDate>Thu, 17 Oct 2024 03:47:14 GMT</pubDate>
            <description><![CDATA[<h2 id="문제-24511번"><strong>문제 (24511번)</strong></h2>
<p>한가롭게 방학에 놀고 있던 도현이는 갑자기 재밌는 자료구조를 생각해냈다. 그 자료구조의 이름은 queuestack이다.</p>
<p>queuestack의 구조는 다음과 같다. 1번, 2번, ... , N번의 자료구조(queue 혹은 stack)가 나열되어있으며, 각각의 자료구조에는 한 개의 원소가 들어있다.</p>
<p>queuestack의 작동은 다음과 같다.</p>
<ul>
<li> x_0을 입력받는다.</li>
<li> x_0을 1번 자료구조에 삽입한 뒤 1번 자료구조에서 원소를 pop한다. 그때 pop된 원소를 x1이라 한다.</li>
<li> x_1을 2번 자료구조에 삽입한 뒤 2번 자료구조에서 원소를 pop한다. 그때 pop된 원소를 x2이라 한다.</li>
<li>...</li>
<li> x_N−1을 N번 자료구조에 삽입한 뒤 N$N$번 자료구조에서 원소를 pop한다. 그때 pop된 원소를 x_N이라 한다.</li>
<li> x_N을 리턴한다.</li>
</ul>
<p>도현이는 길이 M의 수열 C를 가져와서 수열의 원소를 앞에서부터 차례대로 queuestack에 삽입할 것이다. 이전에 삽입한 결과는 남아 있다. (예제 1 참고)</p>
<p>queuestack에 넣을 원소들이 주어졌을 때, 해당 원소를 넣은 리턴값을 출력하는 프로그램을 작성해보자.</p>
<h3 id="입력"><strong>입력</strong></h3>
<p>첫째 줄에 queuestack을 구성하는 자료구조의 개수 N이 주어진다. (1≤N≤100000)</p>
<p>둘째 줄에 길이 N의 수열 A가 주어진다. i번 자료구조가 큐라면 A_i=0, 스택이라면 A_i=1이다.</p>
<p>셋째 줄에 길이 N의 수열 B가 주어진다. B_i는 i번 자료구조에 들어 있는 원소이다. (1≤B_i≤1000000000)</p>
<p>넷째 줄에 삽입할 수열의 길이 M이 주어진다. (1≤M≤100000)</p>
<p>다섯째 줄에 queuestack에 삽입할 원소를 담고 있는 길이 M의 수열 C가 주어진다. (1≤C_i≤1000000000)</p>
<p>입력으로 주어지는 모든 수는 정수이다.</p>
<h3 id="출력"><strong>출력</strong></h3>
<p>수열 C의 원소를 차례대로 queuestack에 삽입했을 때의 리턴값을 공백으로 구분하여 출력한다.</p>
<hr>
<h2 id="풀이"><strong>풀이</strong></h2>
<h3 id="코드"><strong>코드</strong></h3>
<pre><code class="language-rust">use std::io::{self, BufReader, BufRead, BufWriter, Write};
use std::collections::VecDeque;

fn main() {
    let mut reader = BufReader::new(io::stdin().lock());
    let mut writer = BufWriter::new(io::stdout().lock());

    let mut input = String::new();
    reader.read_line(&amp;mut input).unwrap();
    let n: usize = input.trim().parse().unwrap();

    input.clear();
    reader.read_line(&amp;mut input).unwrap();
    let a: Vec&lt;i32&gt; = input
        .trim()
        .split_whitespace()
        .map(|i| i.parse().unwrap())
        .collect();

    input.clear();
    reader.read_line(&amp;mut input).unwrap();
    let b: Vec&lt;i32&gt; = input
        .trim()
        .split_whitespace()
        .map(|i| i.parse().unwrap())
        .collect();

    input.clear();
    reader.read_line(&amp;mut input).unwrap();
    let m: usize = input.trim().parse().unwrap();

    input.clear();
    reader.read_line(&amp;mut input).unwrap();
    let c: Vec&lt;i32&gt; = input
        .trim()
        .split_whitespace()
        .map(|i| i.parse().unwrap())
        .collect();

    let mut queuestack: VecDeque&lt;i32&gt; = VecDeque::new();
    for (i, v) in b.iter().enumerate() {
        if a[i] == 0 { queuestack.push_back(b[i]); }
    }
    // println!(&quot;{:?}&quot;, queuestack);

    for i in c {
        queuestack.push_front(i);
        let output = queuestack.pop_back().unwrap();
        write!(writer, &quot;{output} &quot;).unwrap();
    }
}</code></pre>
<h3 id="해설"><strong>해설</strong></h3>
<pre><code class="language-rust">use std::io::{self, BufReader, BufRead, BufWriter, Write};

fn main() {
    let mut reader = BufReader::new(io::stdin().lock());
    let mut writer = BufWriter::new(io::stdout().lock());

    let mut n = String::new();
    reader.read_line(&amp;mut n).unwrap();
    let n: usize = n.trim().parse().unwrap();

    let mut a = String::new();
    reader.read_line(&amp;mut a).unwrap();
    let a: Vec&lt;i32&gt; = a
        .trim()
        .split_whitespace()
        .map(|i| i.parse().unwrap())
        .collect();

    let mut b = String::new();
    reader.read_line(&amp;mut b).unwrap();
    let mut b: Vec&lt;i32&gt; = b
        .trim()
        .split_whitespace()
        .map(|i| i.parse().unwrap())
        .collect();

    let mut m = String::new();
    reader.read_line(&amp;mut m).unwrap();
    let m: usize = m.trim().parse().unwrap();

    let mut c = String::new();
    reader.read_line(&amp;mut c).unwrap();
    let c: Vec&lt;i32&gt; = c
        .trim()
        .split_whitespace()
        .map(|i| i.parse().unwrap())
        .collect();

    for i in 0..m {
        let mut output = c[i];
        for j in 0..n {
            if a[j] == 0 {
                let temp = output;
                output = b[j];
                b[j] = temp;
            }
        }
        write!(writer, &quot;{output} &quot;).unwrap();
    }
}</code></pre>
<hr>
<h2 id="추가-학습"><strong>추가 학습</strong></h2>
<ul>
<li>특이사항 없음</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Rust로 백준 하루 하나] 16-10. 풍선 터뜨리기]]></title>
            <link>https://velog.io/@sann_n/Rust%EB%A1%9C-%EB%B0%B1%EC%A4%80-%ED%95%98%EB%A3%A8-%ED%95%98%EB%82%98-16-10.-%ED%92%8D%EC%84%A0-%ED%84%B0%EB%9C%A8%EB%A6%AC%EA%B8%B0</link>
            <guid>https://velog.io/@sann_n/Rust%EB%A1%9C-%EB%B0%B1%EC%A4%80-%ED%95%98%EB%A3%A8-%ED%95%98%EB%82%98-16-10.-%ED%92%8D%EC%84%A0-%ED%84%B0%EB%9C%A8%EB%A6%AC%EA%B8%B0</guid>
            <pubDate>Thu, 17 Oct 2024 03:45:51 GMT</pubDate>
            <description><![CDATA[<h2 id="문제-2346번"><strong>문제 (2346번)</strong></h2>
<p>1번부터 N번까지 N개의 풍선이 원형으로 놓여 있고. i번 풍선의 오른쪽에는 i+1번 풍선이 있고, 왼쪽에는 i-1번 풍선이 있다. 단, 1번 풍선의 왼쪽에 N번 풍선이 있고, N번 풍선의 오른쪽에 1번 풍선이 있다. 각 풍선 안에는 종이가 하나 들어있고, 종이에는 -N보다 크거나 같고, N보다 작거나 같은 정수가 하나 적혀있다. 이 풍선들을 다음과 같은 규칙으로 터뜨린다.</p>
<p>우선, 제일 처음에는 1번 풍선을 터뜨린다. 다음에는 풍선 안에 있는 종이를 꺼내어 그 종이에 적혀있는 값만큼 이동하여 다음 풍선을 터뜨린다. 양수가 적혀 있을 경우에는 오른쪽으로, 음수가 적혀 있을 때는 왼쪽으로 이동한다. 이동할 때에는 이미 터진 풍선은 빼고 이동한다.</p>
<p>예를 들어 다섯 개의 풍선 안에 차례로 3, 2, 1, -3, -1이 적혀 있었다고 하자. 이 경우 3이 적혀 있는 1번 풍선, -3이 적혀 있는 4번 풍선, -1이 적혀 있는 5번 풍선, 1이 적혀 있는 3번 풍선, 2가 적혀 있는 2번 풍선의 순서대로 터지게 된다.</p>
<h3 id="입력"><strong>입력</strong></h3>
<p>첫째 줄에 자연수 N(1 ≤ N ≤ 1,000)이 주어진다. 다음 줄에는 차례로 각 풍선 안의 종이에 적혀 있는 수가 주어진다. 종이에 0은 적혀있지 않다.</p>
<h3 id="출력"><strong>출력</strong></h3>
<p>첫째 줄에 터진 풍선의 번호를 차례로 나열한다.</p>
<hr>
<h2 id="풀이"><strong>풀이</strong></h2>
<h3 id="코드"><strong>코드</strong></h3>
<pre><code class="language-rust">use std::collections::VecDeque;
use std::io::{self, BufReader, BufRead, BufWriter, Write};

fn main() {
    let mut reader = BufReader::new(io::stdin().lock());
    let mut writer = BufWriter::new(io::stdout().lock());

    let mut n = String::new();
    reader.read_line(&amp;mut n).unwrap();
    let n: usize = n.trim().parse().unwrap();

    let mut input = String::new();
    reader.read_line(&amp;mut input).unwrap();
    let balloons: Vec&lt;i32&gt; = input
        .trim()
        .split_whitespace()
        .map(|i| i.parse().unwrap())
        .collect();

    // 풍선 번호와 이동 값을 저장하는 VecDeque
    let mut queue: VecDeque&lt;(usize, i32)&gt; = VecDeque::new();
    for i in 0..n {
        queue.push_back((i + 1, balloons[i])); // (풍선 번호, 종이에 적힌 값)
    }

    // 첫 번째 풍선을 터뜨리고 시작
    let mut result = Vec::new();
    let mut current = queue.pop_front().unwrap();
    result.push(current.0);

    while !queue.is_empty() {
        let steps = current.1;
        if steps &gt; 0 {
            // 오른쪽으로 이동 (steps-1만큼 이동)
            for _ in 0..(steps - 1) {
                let front = queue.pop_front().unwrap();
                queue.push_back(front);
            }
        } else {
            // 왼쪽으로 이동 (steps만큼 이동)
            for _ in 0..(-steps) {
                let back = queue.pop_back().unwrap();
                queue.push_front(back);
            }
        }

        // 다음 터뜨릴 풍선 선택
        current = queue.pop_front().unwrap();
        result.push(current.0);
    }

    // 결과 출력
    writeln!(writer, &quot;{}&quot;, result.iter().map(|x| x.to_string()).collect::&lt;Vec&lt;_&gt;&gt;().join(&quot; &quot;)).unwrap();
}
</code></pre>
<h3 id="해설"><strong>해설</strong></h3>
<pre><code class="language-rust">use std::io::{self, BufReader, BufRead, BufWriter, Write};

fn main() {
    let mut reader = BufReader::new(io::stdin().lock());
    let mut writer = BufWriter::new(io::stdout().lock());

    let mut n = String::new();
    reader.read_line(&amp;mut n).unwrap();
    let n: usize = n.trim().parse().unwrap();

    let mut input = String::new();
    reader.read_line(&amp;mut input).unwrap();
    let input: Vec&lt;i32&gt; = input
        .trim()
        .split_whitespace()
        .map(|i| i.parse().unwrap())
        .collect();

    let mut visited: Vec&lt;bool&gt; = vec![false; n];
    let mut pointer: usize = 0;
    write!(writer, &quot;{}&quot;, pointer + 1).unwrap();
    for _ in 1..n {
        let mut counter = input[pointer];
        visited[pointer] = true;
        while counter != 0 {
            if counter &lt; 0 {
                counter += 1;
                pointer -= 1;
                if pointer == 0 { pointer += n-1; }
                while visited[pointer] == true { pointer -= 1; }
            } else {
                counter -= 1;
                pointer += 1;
                if pointer == n-1 { pointer -= n-1; }
                while visited[pointer] == true { pointer -= 1; }
            }
        }
        write!(writer, &quot; {}&quot;, pointer + 1).unwrap();
    }
}</code></pre>
<hr>
<h2 id="추가-학습"><strong>추가 학습</strong></h2>
<ul>
<li>특이사항 없음</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Rust로 백준 하루 하나] 16-9. 덱 2]]></title>
            <link>https://velog.io/@sann_n/Rust%EB%A1%9C-%EB%B0%B1%EC%A4%80-%ED%95%98%EB%A3%A8-%ED%95%98%EB%82%98-16-9.-%EB%8D%B1-2</link>
            <guid>https://velog.io/@sann_n/Rust%EB%A1%9C-%EB%B0%B1%EC%A4%80-%ED%95%98%EB%A3%A8-%ED%95%98%EB%82%98-16-9.-%EB%8D%B1-2</guid>
            <pubDate>Wed, 16 Oct 2024 04:10:43 GMT</pubDate>
            <description><![CDATA[<h2 id="문제-28279번"><strong>문제 (28279번)</strong></h2>
<p>정수를 저장하는 덱을 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램을 작성하시오.</p>
<p>명령은 총 여덟 가지이다.</p>
<ol>
<li><code>1 X</code>: 정수 X를 덱의 앞에 넣는다. (1 ≤ X ≤ 100,000)</li>
<li><code>2 X</code>: 정수 X를 덱의 뒤에 넣는다. (1 ≤ X ≤ 100,000)</li>
<li><code>3</code>: 덱에 정수가 있다면 맨 앞의 정수를 빼고 출력한다. 없다면 <code>-1</code>을 대신 출력한다.</li>
<li><code>4</code>: 덱에 정수가 있다면 맨 뒤의 정수를 빼고 출력한다. 없다면 <code>-1</code>을 대신 출력한다.</li>
<li><code>5</code>: 덱에 들어있는 정수의 개수를 출력한다.</li>
<li><code>6</code>: 덱이 비어있으면 <code>1</code>, 아니면 <code>0</code>을 출력한다.</li>
<li><code>7</code>: 덱에 정수가 있다면 맨 앞의 정수를 출력한다. 없다면 <code>-1</code>을 대신 출력한다.</li>
<li><code>8</code>: 덱에 정수가 있다면 맨 뒤의 정수를 출력한다. 없다면 <code>-1</code>을 대신 출력한다.</li>
</ol>
<h3 id="입력"><strong>입력</strong></h3>
<p>첫째 줄에 명령의 수 N이 주어진다. (1 ≤ N ≤ 1,000,000)</p>
<p>둘째 줄부터 N개 줄에 명령이 하나씩 주어진다.</p>
<p>출력을 요구하는 명령은 하나 이상 주어진다.</p>
<h3 id="출력"><strong>출력</strong></h3>
<p>출력을 요구하는 명령이 주어질 때마다 명령의 결과를 한 줄에 하나씩 출력한다.</p>
<hr>
<h2 id="풀이"><strong>풀이</strong></h2>
<h3 id="코드"><strong>코드</strong></h3>
<pre><code class="language-rust">use std::io::{self, BufReader, BufRead, BufWriter, Write};
use std::collections::VecDeque;

fn main() {
    let mut reader = BufReader::new(io::stdin().lock());
    let mut writer = BufWriter::new(io::stdout().lock());

    let mut n = String::new();
    reader.read_line(&amp;mut n).unwrap();
    let n: usize = n.trim().parse().unwrap();

    let mut output: VecDeque&lt;i32&gt; = VecDeque::new();
    let mut input = String::new();
    for _ in 0..n {
        reader.read_line(&amp;mut input).unwrap();
        let mut input_iter = input
            .trim()
            .split_whitespace();
        let inst = input_iter.next().unwrap();
        match inst {
            &quot;1&quot; =&gt; {
                let x = input_iter.next().unwrap().parse::&lt;i32&gt;().unwrap();
                output.push_front(x);
            },
            &quot;2&quot; =&gt; {
                let x = input_iter.next().unwrap().parse::&lt;i32&gt;().unwrap();
                output.push_back(x);
            },
            &quot;3&quot; =&gt; {
                if let Some(x) = output.pop_front() {
                    writeln!(writer, &quot;{x}&quot;).unwrap();
                } else {
                    writeln!(writer, &quot;-1&quot;).unwrap();
                }
            },
            &quot;4&quot; =&gt; {
                if let Some(x) = output.pop_back() {
                    writeln!(writer, &quot;{x}&quot;).unwrap();
                } else {
                    writeln!(writer, &quot;-1&quot;).unwrap();
                }
            },
            &quot;5&quot; =&gt; writeln!(writer, &quot;{}&quot;, output.len()).unwrap(),
            &quot;6&quot; =&gt; {
                if output.len() == 0 {
                    writeln!(writer, &quot;1&quot;).unwrap();
                } else {
                    writeln!(writer, &quot;0&quot;).unwrap();
                }
            },
            &quot;7&quot; =&gt; {
                if output.len() != 0 {
                    writeln!(writer, &quot;{}&quot;, output[0]).unwrap();
                } else {
                    writeln!(writer, &quot;-1&quot;).unwrap();
                }
            },
            &quot;8&quot; =&gt; {
                if output.len() != 0 {
                    writeln!(writer, &quot;{}&quot;, output[output.len()-1]).unwrap();
                } else {
                    writeln!(writer, &quot;-1&quot;).unwrap();
                }
            },
            _ =&gt; (),
        }
        input.clear();
    }
}</code></pre>
<h3 id="해설"><strong>해설</strong></h3>
<p>특이사항 없음</p>
<hr>
<h2 id="추가-학습"><strong>추가 학습</strong></h2>
<ul>
<li>특이사항 없음</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Rust로 백준 하루 하나] 16-8. 요세푸스 문제 0]]></title>
            <link>https://velog.io/@sann_n/Rust%EB%A1%9C-%EB%B0%B1%EC%A4%80-%ED%95%98%EB%A3%A8-%ED%95%98%EB%82%98-16-8.-%EC%9A%94%EC%84%B8%ED%91%B8%EC%8A%A4-%EB%AC%B8%EC%A0%9C-0</link>
            <guid>https://velog.io/@sann_n/Rust%EB%A1%9C-%EB%B0%B1%EC%A4%80-%ED%95%98%EB%A3%A8-%ED%95%98%EB%82%98-16-8.-%EC%9A%94%EC%84%B8%ED%91%B8%EC%8A%A4-%EB%AC%B8%EC%A0%9C-0</guid>
            <pubDate>Wed, 16 Oct 2024 04:09:20 GMT</pubDate>
            <description><![CDATA[<h2 id="문제-11866번"><strong>문제 (11866번)</strong></h2>
<p>요세푸스 문제는 다음과 같다.</p>
<p>1번부터 N번까지 N명의 사람이 원을 이루면서 앉아있고, 양의 정수 K(≤ N)가 주어진다. 이제 순서대로 K번째 사람을 제거한다. 한 사람이 제거되면 남은 사람들로 이루어진 원을 따라 이 과정을 계속해 나간다. 이 과정은 N명의 사람이 모두 제거될 때까지 계속된다. 원에서 사람들이 제거되는 순서를 (N, K)-요세푸스 순열이라고 한다. 예를 들어 (7, 3)-요세푸스 순열은 &lt;3, 6, 2, 7, 5, 1, 4&gt;이다.</p>
<p>N과 K가 주어지면 (N, K)-요세푸스 순열을 구하는 프로그램을 작성하시오.</p>
<h3 id="입력"><strong>입력</strong></h3>
<p>첫째 줄에 N과 K가 빈 칸을 사이에 두고 순서대로 주어진다. (1 ≤ K ≤ N ≤ 1,000)</p>
<h3 id="출력"><strong>출력</strong></h3>
<p>예제와 같이 요세푸스 순열을 출력한다.</p>
<hr>
<h2 id="풀이"><strong>풀이</strong></h2>
<h3 id="코드"><strong>코드</strong></h3>
<pre><code class="language-rust">use std::io::{self, BufReader, BufRead, BufWriter, Write};

fn main() {
    let mut reader = BufReader::new(io::stdin().lock());
    let mut writer = BufWriter::new(io::stdout().lock());

    let mut input = String::new();
    reader.read_line(&amp;mut input).unwrap();
    let mut input_iter = input
        .trim()
        .split_whitespace()
        .map(|i| i.parse::&lt;usize&gt;().unwrap());
    let n = input_iter.next().unwrap();
    let k = input_iter.next().unwrap();

    let mut people: Vec&lt;bool&gt; = vec![true; n];
    let mut index: usize = 0;
    write!(writer, &quot;&lt;&quot;).unwrap();
    loop {
        let mut count = k;
        while count != 0 {
            if people[index] == true { count -= 1; }
            if count != 0 { index += 1; }
            if index == n { index = 0; }
        }
        people[index] = false;
        write!(writer, &quot;{}&quot;, index+1).unwrap();
        if people.iter().all(|&amp;i| i == false) { break; }
        else { write!(writer, &quot;, &quot;).unwrap(); }
    }
    write!(writer, &quot;&gt;&quot;).unwrap();
}</code></pre>
<h3 id="해설"><strong>해설</strong></h3>
<pre><code class="language-rust">fn all&lt;F&gt;(&amp;mut self, f: F) -&gt; bool
where Self: Sized,
      F: FnMut(Self::Item) -&gt; bool,</code></pre>
<p><a href="https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.all">https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.all</a></p>
<hr>
<h2 id="추가-학습"><strong>추가 학습</strong></h2>
<p>큐를 쓰지 않고 저만의 방법을 생각해내서 풀었지만 큐를 사용하여 푸는 방법도 알아갑시다.</p>
<pre><code class="language-rust">use std::io::{self, BufWriter, Write};

fn main() {
    let stdin = io::stdin();
    let mut writer = BufWriter::new(io::stdout());

    // 입력받기
    let mut input = String::new();
    stdin.read_line(&amp;mut input).unwrap();
    let mut input = input.trim().split_whitespace();

    let n: usize = input.next().unwrap().parse().unwrap(); // N명의 사람
    let k: usize = input.next().unwrap().parse().unwrap(); // K번째 사람 제거

    let mut people: Vec&lt;usize&gt; = (1..=n).collect(); // 1번부터 N번까지 사람트
    let mut result = Vec::with_capacity(n); // 요세푸스 순열을 저장할 벡터

    let mut index = 0;

    // 사람들이 모두 제거될 때까지 반복
    while !people.is_empty() {
        // 제거할 사람의 위치 계산
        index = (index + k - 1) % people.len();
        // 사람 제거하고 결과에 추가
        result.push(people.remove(index));
    }

    // 요세푸스 순열 출력
    write!(writer, &quot;&lt;&quot;).unwrap();
    for (i, person) in result.iter().enumerate() {
        if i == result.len() - 1 {
            writeln!(writer, &quot;{}&quot;, person).unwrap();
        } else {
            write!(writer, &quot;{}, &quot;, person).unwrap();
        }
    }
}</code></pre>
<p>이 코드는 chatGPT 코드이므로 그대로 복붙하면 틀릴 가능성이 있습니다. 그냥 보기에도 닫는 괄호가 없어서 틀릴 것 같습니다.</p>
<p>큐와 모듈러 연산, <code>remove</code> 메서드를 사용하여 문제를 해결한 방식을 보면 좋을 것 같습니다.</p>
<p>추가로 이 문제는 n과 k가 1000이하이기 때문에 괜찮지만 숫자가 커진다면 Linked List를 사용하는게 효율적이지 않을까 생각이 듭니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Rust로 백준 하루 하나] 16-7. 카드2]]></title>
            <link>https://velog.io/@sann_n/Rust%EB%A1%9C-%EB%B0%B1%EC%A4%80-%ED%95%98%EB%A3%A8-%ED%95%98%EB%82%98-16-7.-%EC%B9%B4%EB%93%9C2</link>
            <guid>https://velog.io/@sann_n/Rust%EB%A1%9C-%EB%B0%B1%EC%A4%80-%ED%95%98%EB%A3%A8-%ED%95%98%EB%82%98-16-7.-%EC%B9%B4%EB%93%9C2</guid>
            <pubDate>Wed, 16 Oct 2024 04:08:00 GMT</pubDate>
            <description><![CDATA[<h2 id="문제-2164번"><strong>문제 (2164번)</strong></h2>
<p>N장의 카드가 있다. 각각의 카드는 차례로 1부터 N까지의 번호가 붙어 있으며, 1번 카드가 제일 위에, N번 카드가 제일 아래인 상태로 순서대로 카드가 놓여 있다.</p>
<p>이제 다음과 같은 동작을 카드가 한 장 남을 때까지 반복하게 된다. 우선, 제일 위에 있는 카드를 바닥에 버린다. 그 다음, 제일 위에 있는 카드를 제일 아래에 있는 카드 밑으로 옮긴다.</p>
<p>예를 들어 N=4인 경우를 생각해 보자. 카드는 제일 위에서부터 1234 의 순서로 놓여있다. 1을 버리면 234가 남는다. 여기서 2를 제일 아래로 옮기면 342가 된다. 3을 버리면 42가 되고, 4를 밑으로 옮기면 24가 된다. 마지막으로 2를 버리고 나면, 남는 카드는 4가 된다.</p>
<p>N이 주어졌을 때, 제일 마지막에 남게 되는 카드를 구하는 프로그램을 작성하시오.</p>
<h3 id="입력"><strong>입력</strong></h3>
<p>첫째 줄에 정수 N(1 ≤ N ≤ 500,000)이 주어진다.</p>
<h3 id="출력"><strong>출력</strong></h3>
<p>첫째 줄에 남게 되는 카드의 번호를 출력한다.</p>
<hr>
<h2 id="풀이"><strong>풀이</strong></h2>
<h3 id="코드"><strong>코드</strong></h3>
<pre><code class="language-rust">use std::io::{self, BufReader, BufRead, BufWriter, Write};
use std::collections::VecDeque;

fn main() {
    let mut reader = BufReader::new(io::stdin().lock());
    let mut writer = BufWriter::new(io::stdout().lock());

    let mut n = String::new();
    reader.read_line(&amp;mut n).unwrap();
    let n: usize = n.trim().parse().unwrap();

    let mut cards: VecDeque&lt;usize&gt; = (1..=n).collect();
    while cards.len() != 1 {
        cards.pop_front().unwrap();
        let card = cards.pop_front().unwrap();
        cards.push_back(card);
    }
    writeln!(writer, &quot;{}&quot;, cards[0]).unwrap();
}</code></pre>
<h3 id="해설"><strong>해설</strong></h3>
<p>특이사항 없음</p>
<hr>
<h2 id="추가-학습"><strong>추가 학습</strong></h2>
<ul>
<li>특이사항 없음</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Rust로 백준 하루 하나] 16-6. 큐 2]]></title>
            <link>https://velog.io/@sann_n/Rust%EB%A1%9C-%EB%B0%B1%EC%A4%80-%ED%95%98%EB%A3%A8-%ED%95%98%EB%82%98-16-6.-%ED%81%90-2-x7bs0j4m</link>
            <guid>https://velog.io/@sann_n/Rust%EB%A1%9C-%EB%B0%B1%EC%A4%80-%ED%95%98%EB%A3%A8-%ED%95%98%EB%82%98-16-6.-%ED%81%90-2-x7bs0j4m</guid>
            <pubDate>Tue, 15 Oct 2024 03:36:27 GMT</pubDate>
            <description><![CDATA[<h2 id="문제-18258번"><strong>문제 (18258번)</strong></h2>
<p>정수를 저장하는 큐를 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램을 작성하시오.</p>
<p>명령은 총 여섯 가지이다.</p>
<ul>
<li>push X: 정수 X를 큐에 넣는 연산이다.</li>
<li>pop: 큐에서 가장 앞에 있는 정수를 빼고, 그 수를 출력한다. 만약 큐에 들어있는 정수가 없는 경우에는 -1을 출력한다.</li>
<li>size: 큐에 들어있는 정수의 개수를 출력한다.</li>
<li>empty: 큐가 비어있으면 1, 아니면 0을 출력한다.</li>
<li>front: 큐의 가장 앞에 있는 정수를 출력한다. 만약 큐에 들어있는 정수가 없는 경우에는 -1을 출력한다.</li>
<li>back: 큐의 가장 뒤에 있는 정수를 출력한다. 만약 큐에 들어있는 정수가 없는 경우에는 -1을 출력한다.</li>
</ul>
<h3 id="입력"><strong>입력</strong></h3>
<p>첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 2,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지 않은 명령이 주어지는 경우는 없다.</p>
<h3 id="출력"><strong>출력</strong></h3>
<p>출력해야하는 명령이 주어질 때마다, 한 줄에 하나씩 출력한다.</p>
<hr>
<h2 id="풀이"><strong>풀이</strong></h2>
<h3 id="코드"><strong>코드</strong></h3>
<pre><code class="language-rust">use std::io::{self, BufReader, BufRead, BufWriter, Write};
use std::collections::VecDeque;

fn main() {
    let mut reader = BufReader::new(io::stdin().lock());
    let mut writer = BufWriter::new(io::stdout().lock());

    let mut n = String::new();
    reader.read_line(&amp;mut n).unwrap();
    let n: usize = n.trim().parse().unwrap();

    let mut queue: VecDeque&lt;i32&gt; = VecDeque::new();
    let mut input = String::new();
    for _ in 0..n {
        reader.read_line(&amp;mut input).unwrap();
        let mut line_iter = input.trim().split_whitespace();

        let inst = line_iter.next().unwrap();
        let mut output = 0;
        match inst {
            &quot;push&quot; =&gt; {
                let x: i32 = line_iter.next().unwrap().parse().unwrap();
                queue.push_back(x);
                input.clear();
                continue;
            },
            &quot;pop&quot; =&gt; {
                if queue.is_empty() { output = -1; }
                else {
                    output = queue.pop_front().unwrap();
                }
            },
            &quot;size&quot; =&gt; output = queue.len() as i32,
            &quot;empty&quot; =&gt; {
                if queue.is_empty() { output = 1; }
                else { output = 0; }
            },
            &quot;front&quot; =&gt; {
                if queue.is_empty() { output = -1; }
                else { output = queue[0] }
            },
            &quot;back&quot; =&gt; {
                if queue.is_empty() { output = -1; }
                else { output = queue[queue.len()-1] as i32; }
            },
            _ =&gt; ()
        }
        writeln!(writer, &quot;{}&quot;, output).unwrap();
        input.clear();
    }
}</code></pre>
<h3 id="해설"><strong>해설</strong></h3>
<p>처음엔 <code>Vec</code>을 가지고 풀어봤는데 시간초과를 만났습니다. 이유는 &quot;pop&quot;에서 맨 앞 요소를 제거할 때 사용한 <code>remove</code>가 요소를 제거할 때 나머지 요소를 전부 앞으로 이동시키기 때문에 시간 복잡도가 최악의 경우 O(n²)의 시간이 걸리기 때문입니다.</p>
<pre><code class="language-rust">use std::io::{self, BufReader, BufRead, BufWriter, Write};

fn main() {
    let mut reader = BufReader::new(io::stdin().lock());
    let mut writer = BufWriter::new(io::stdout().lock());

    let mut n = String::new();
    reader.read_line(&amp;mut n).unwrap();
    let n: usize = n.trim().parse().unwrap();

    let mut queue: Vec&lt;i32&gt; = Vec::new();
    let mut input = String::new();
    for _ in 0..n {
        reader.read_line(&amp;mut input).unwrap();
        let mut line_iter = input.trim().split_whitespace();

        let inst = line_iter.next().unwrap();
        let mut output = 0;
        match inst {
            &quot;push&quot; =&gt; {
                let x: i32 = line_iter.next().unwrap().parse().unwrap();
                queue.push(x);
                input.clear();
                continue;
            },
            &quot;pop&quot; =&gt; {
                if queue.is_empty() { output = -1; }
                else {
                    output = queue.remove(0);
                }
            },
            &quot;size&quot; =&gt; output = queue.len() as i32,
            &quot;empty&quot; =&gt; {
                if queue.is_empty() { output = 1; }
                else { output = 0; }
            },
            &quot;front&quot; =&gt; {
                if queue.is_empty() { output = -1; }
                else { output = queue[0] }
            },
            &quot;back&quot; =&gt; {
                if queue.is_empty() { output = -1; }
                else { output = queue[queue.len()-1] as i32; }
            },
            _ =&gt; ()
        }
        writeln!(writer, &quot;{}&quot;, output).unwrap();
        input.clear();
    }
}</code></pre>
<p>따라서 러스트에서 큐를 구현할 때는 맨 앞에 추가/삭제 할 수 있는 메서드(<code>push_front</code>, <code>pop_front</code>)가 구현되어 있는 <code>VecDeque</code>를 사용해야 합니다.</p>
<hr>
<h2 id="추가-학습"><strong>추가 학습</strong></h2>
<ul>
<li><a href="https://stackoverflow.com/questions/40848918/are-there-queue-and-stack-collections-in-rust">https://stackoverflow.com/questions/40848918/are-there-queue-and-stack-collections-in-rust</a></li>
<li><a href="https://doc.rust-lang.org/std/collections/struct.VecDeque.html">https://doc.rust-lang.org/std/collections/struct.VecDeque.html</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Rust로 백준 하루 하나] 16-5. 도키도키 간식드리미]]></title>
            <link>https://velog.io/@sann_n/Rust%EB%A1%9C-%EB%B0%B1%EC%A4%80-%ED%95%98%EB%A3%A8-%ED%95%98%EB%82%98-16-5.-%EB%8F%84%ED%82%A4%EB%8F%84%ED%82%A4-%EA%B0%84%EC%8B%9D%EB%93%9C%EB%A6%AC%EB%AF%B8</link>
            <guid>https://velog.io/@sann_n/Rust%EB%A1%9C-%EB%B0%B1%EC%A4%80-%ED%95%98%EB%A3%A8-%ED%95%98%EB%82%98-16-5.-%EB%8F%84%ED%82%A4%EB%8F%84%ED%82%A4-%EA%B0%84%EC%8B%9D%EB%93%9C%EB%A6%AC%EB%AF%B8</guid>
            <pubDate>Tue, 15 Oct 2024 03:34:55 GMT</pubDate>
            <description><![CDATA[<h2 id="문제-12789번"><strong>문제 (12789번)</strong></h2>
<p>인하대학교 학생회에서는 중간, 기말고사 때마다 시험 공부에 지친 학우들을 위해 간식을 나눠주는 간식 드리미 행사를 실시한다. 승환이는 시험 기간이 될 때마다 간식을 받을 생각에 두근두근 설레서 시험 공부에 집중을 못 한다. 이번 중간고사에서도 역시 승환이는 설레는 가슴을 안고 간식을 받기 위해 미리 공지된 장소에 시간 맞춰 도착했다. 그런데 이게 무슨 날벼락인가! 그 곳에는 이미 모든 학생들이 모여있었고, 승환이는 마지막 번호표를 받게 되었다. 설상가상으로 몇몇 양심에 털이 난 학생들이 새치기를 거듭한 끝에 대기열의 순서마저 엉망이 되고 말았다. 간식을 나눠주고 있던 인규는 학우들의 터져 나오는 불만에 번호표 순서로만 간식을 줄 수 있다고 말했다. </p>
<p>그제야 학생들이 순서대로 줄을 서려고 했지만 공간이 너무 협소해서 마음대로 이동할 수 없었다. 다행히도 대기열의 왼쪽에는 1열로 설 수 있는 공간이 존재하여 이 공간을 잘 이용하면 모두가 순서대로 간식을 받을 수 있을지도 모른다. 자칫 간식을 못 받게 될지도 모른다는 위기감을 느낀 승환이는 자신의 컴퓨터 알고리즘적 지식을 활용해 과연 모든 사람들이 순서대로 간식을 받을 수 있는지 확인하는 프로그램을 만들기로 했다. 만약 불가능 하다면 승환이는 이번 중간고사를 망치게 될 것 이고 가능하다면 힘을 얻어 중간고사를 잘 볼 수 있을지도 모른다.</p>
<p>사람들은 현재 1열로 줄을 서있고, 맨 앞의 사람만 이동이 가능하다. 인규는 번호표 순서대로만 통과할 수 있는 라인을 만들어 두었다. 이 라인과 대기열의 맨 앞 사람 사이에는 한 사람씩 1열이 들어갈 수 있는 공간이 있다. 현재 대기열의 사람들은 이 공간으로 올 수 있지만 반대는 불가능하다. 승환이를 도와 프로그램을 완성하라.</p>
<p>현재 간식 배부 공간을 그림으로 나타내면 다음과 같다.</p>
<p><img src="https://onlinejudgeimages.s3-ap-northeast-1.amazonaws.com/problem/12789/1.png" alt=""></p>
<p>위 예제는 다음 그림과 같이 움직였을 때 모두가 순서대로 간식을 받을 수 있다..</p>
<p><img src="https://onlinejudgeimages.s3-ap-northeast-1.amazonaws.com/problem/12789/2.png" alt=""></p>
<h3 id="입력"><strong>입력</strong></h3>
<p>입력의 첫째 줄에는 현재 승환이의 앞에 서 있는 학생들의 수 <em>N</em>(1 ≤ <em>N</em> ≤ 1,000,자연수)이 주어진다.</p>
<p>다음 줄에는 승환이 앞에 서있는 모든 학생들의 번호표(1,2,...,<em>N</em>) 순서가 앞에서부터 뒤 순서로 주어진다.</p>
<h3 id="출력"><strong>출력</strong></h3>
<p>승환이가 무사히 간식을 받을 수 있으면 &quot;Nice&quot;(따옴표는 제외)를 출력하고 그렇지 않다면 &quot;Sad&quot;(따옴표는 제외)를 출력한다.</p>
<hr>
<h2 id="풀이"><strong>풀이</strong></h2>
<h3 id="코드"><strong>코드</strong></h3>
<pre><code class="language-rust">use std::collections::VecDeque;
use std::io::{self, BufReader, BufRead, BufWriter, Write};

fn main() {
    let mut reader = BufReader::new(io::stdin().lock());
    let mut writer = BufWriter::new(io::stdout().lock());

    let mut n = String::new();
    reader.read_line(&amp;mut n).unwrap();
    let n: usize = n.trim().parse().unwrap();

    let mut input = String::new();
    reader.read_line(&amp;mut input).unwrap();
    let balloons: Vec&lt;i32&gt; = input
        .trim()
        .split_whitespace()
        .map(|i| i.parse().unwrap())
        .collect();

    // 풍선 번호와 이동 값을 저장하는 VecDeque
    let mut queue: VecDeque&lt;(usize, i32)&gt; = VecDeque::new();
    for i in 0..n {
        queue.push_back((i + 1, balloons[i])); // (풍선 번호, 종이에 적힌 값)
    }

    // 첫 번째 풍선을 터뜨리고 시작
    let mut result = Vec::new();
    let mut current = queue.pop_front().unwrap();
    result.push(current.0);

    while !queue.is_empty() {
        let steps = current.1;
        if steps &gt; 0 {
            // 오른쪽으로 이동 (steps-1만큼 이동)
            for _ in 0..(steps - 1) {
                let front = queue.pop_front().unwrap();
                queue.push_back(front);
            }
        } else {
            // 왼쪽으로 이동 (steps만큼 이동)
            for _ in 0..(-steps) {
                let back = queue.pop_back().unwrap();
                queue.push_front(back);
            }
        }

        // 다음 터뜨릴 풍선 선택
        current = queue.pop_front().unwrap();
        result.push(current.0);
    }

    // 결과 출력
    writeln!(writer, &quot;{}&quot;, result.iter().map(|x| x.to_string()).collect::&lt;Vec&lt;_&gt;&gt;().join(&quot; &quot;)).unwrap();
}
</code></pre>
<h3 id="해설"><strong>해설</strong></h3>
<pre><code class="language-rust">use std::io::{self, BufReader, BufRead, BufWriter, Write};

fn main() {
    let mut reader = BufReader::new(io::stdin().lock());
    let mut writer = BufWriter::new(io::stdout().lock());

    let mut n = String::new();
    reader.read_line(&amp;mut n).unwrap();
    let n: usize = n.trim().parse().unwrap();

    let mut input = String::new();
    reader.read_line(&amp;mut input).unwrap();
    let input: Vec&lt;i32&gt; = input
        .trim()
        .split_whitespace()
        .map(|i| i.parse().unwrap())
        .collect();

    let mut visited: Vec&lt;bool&gt; = vec![false; n];
    let mut pointer: usize = 0;
    write!(writer, &quot;{}&quot;, pointer + 1).unwrap();
    for _ in 1..n {
        let mut counter = input[pointer];
        visited[pointer] = true;
        while counter != 0 {
            if counter &lt; 0 {
                counter += 1;
                pointer -= 1;
                if pointer == 0 { pointer += n-1; }
                while visited[pointer] == true { pointer -= 1; }
            } else {
                counter -= 1;
                pointer += 1;
                if pointer == n-1 { pointer -= n-1; }
                while visited[pointer] == true { pointer -= 1; }
            }
        }
        write!(writer, &quot; {}&quot;, pointer + 1).unwrap();
    }
}</code></pre>
<hr>
<h2 id="추가-학습"><strong>추가 학습</strong></h2>
<ul>
<li>특이사항 없음</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Rust로 백준 하루 하나] 16-4. 균형잡힌 세상]]></title>
            <link>https://velog.io/@sann_n/Rust%EB%A1%9C-%EB%B0%B1%EC%A4%80-%ED%95%98%EB%A3%A8-%ED%95%98%EB%82%98-16-4.-%EA%B7%A0%ED%98%95%EC%9E%A1%ED%9E%8C-%EC%84%B8%EC%83%81</link>
            <guid>https://velog.io/@sann_n/Rust%EB%A1%9C-%EB%B0%B1%EC%A4%80-%ED%95%98%EB%A3%A8-%ED%95%98%EB%82%98-16-4.-%EA%B7%A0%ED%98%95%EC%9E%A1%ED%9E%8C-%EC%84%B8%EC%83%81</guid>
            <pubDate>Tue, 15 Oct 2024 03:32:55 GMT</pubDate>
            <description><![CDATA[<h2 id="문제-4949번"><strong>문제 (4949번)</strong></h2>
<p>세계는 균형이 잘 잡혀있어야 한다. 양과 음, 빛과 어둠 그리고 왼쪽 괄호와 오른쪽 괄호처럼 말이다.</p>
<p>정민이의 임무는 어떤 문자열이 주어졌을 때, 괄호들의 균형이 잘 맞춰져 있는지 판단하는 프로그램을 짜는 것이다.</p>
<p>문자열에 포함되는 괄호는 소괄호(&quot;()&quot;) 와 대괄호(&quot;[]&quot;)로 2종류이고, 문자열이 균형을 이루는 조건은 아래와 같다.</p>
<ul>
<li>모든 왼쪽 소괄호(&quot;(&quot;)는 오른쪽 소괄호(&quot;)&quot;)와만 짝을 이뤄야 한다.</li>
<li>모든 왼쪽 대괄호(&quot;[&quot;)는 오른쪽 대괄호(&quot;]&quot;)와만 짝을 이뤄야 한다.</li>
<li>모든 오른쪽 괄호들은 자신과 짝을 이룰 수 있는 왼쪽 괄호가 존재한다.</li>
<li>모든 괄호들의 짝은 1:1 매칭만 가능하다. 즉, 괄호 하나가 둘 이상의 괄호와 짝지어지지 않는다.</li>
<li>짝을 이루는 두 괄호가 있을 때, 그 사이에 있는 문자열도 균형이 잡혀야 한다.</li>
</ul>
<p>정민이를 도와 문자열이 주어졌을 때 균형잡힌 문자열인지 아닌지를 판단해보자.</p>
<h3 id="입력"><strong>입력</strong></h3>
<p>각 문자열은 마지막 글자를 제외하고 영문 알파벳, 공백, 소괄호(&quot;( )&quot;), 대괄호(&quot;[ ]&quot;)로 이루어져 있으며, 온점(&quot;.&quot;)으로 끝나고, 길이는 100글자보다 작거나 같다.</p>
<p>입력의 종료조건으로 맨 마지막에 온점 하나(&quot;.&quot;)가 들어온다.</p>
<h3 id="출력"><strong>출력</strong></h3>
<p>각 줄마다 해당 문자열이 균형을 이루고 있으면 &quot;yes&quot;를, 아니면 &quot;no&quot;를 출력한다.</p>
<hr>
<h2 id="풀이"><strong>풀이</strong></h2>
<h3 id="코드"><strong>코드</strong></h3>
<pre><code class="language-rust">use std::io::{self, BufReader, BufRead, BufWriter, Write};

fn main() {
    let mut reader = BufReader::new(io::stdin().lock());
    let mut writer = BufWriter::new(io::stdout().lock());

    let mut input = String::new();
    loop {
        reader.read_line(&amp;mut input).unwrap();
        input.pop();

        let mut stack: Vec&lt;char&gt; = Vec::new();
        if input == &quot;.&quot; { break; }
        for c in input.chars() {
            match c {
                &#39;[&#39; =&gt; stack.push(c),
                &#39;(&#39; =&gt; stack.push(c),
                &#39;]&#39; =&gt; {
                    if stack.len() &gt; 0 &amp;&amp; stack[stack.len()-1] == &#39;[&#39; { stack.pop(); }
                    else { 
                        writeln!(writer, &quot;no&quot;).unwrap();
                        break;
                    }
                },
                &#39;)&#39; =&gt; {
                    if stack.len() &gt; 0 &amp;&amp; stack[stack.len()-1] == &#39;(&#39; { stack.pop(); }
                    else { 
                        writeln!(writer, &quot;no&quot;).unwrap();
                        break;
                    }
                },
                &#39;.&#39; =&gt; {
                    if stack.is_empty() {
                        writeln!(writer, &quot;yes&quot;).unwrap();
                    } else {
                        writeln!(writer, &quot;no&quot;).unwrap();
                    }
                },
                _ =&gt; (),

            }
        }
        input.clear();
    }
}</code></pre>
<h3 id="해설"><strong>해설</strong></h3>
<p>처음에 문장이 끝나는 온점<code>.</code>에서 남은 괄호가 있는지 확인하는 코드를 작성하지 않아 틀렸는데 조심하도록 하자.</p>
<hr>
<h2 id="추가-학습"><strong>추가 학습</strong></h2>
<ul>
<li>특이사항 없음</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Rust로 백준 하루 하나] 16-3. 괄호]]></title>
            <link>https://velog.io/@sann_n/Rust%EB%A1%9C-%EB%B0%B1%EC%A4%80-%ED%95%98%EB%A3%A8-%ED%95%98%EB%82%98-16-3.-%EA%B4%84%ED%98%B8</link>
            <guid>https://velog.io/@sann_n/Rust%EB%A1%9C-%EB%B0%B1%EC%A4%80-%ED%95%98%EB%A3%A8-%ED%95%98%EB%82%98-16-3.-%EA%B4%84%ED%98%B8</guid>
            <pubDate>Sun, 13 Oct 2024 02:44:24 GMT</pubDate>
            <description><![CDATA[<h2 id="문제-9012번"><strong>문제 (9012번)</strong></h2>
<p>괄호 문자열(Parenthesis String, PS)은 두 개의 괄호 기호인 ‘(’ 와 ‘)’ 만으로 구성되어 있는 문자열이다. 그 중에서 괄호의 모양이 바르게 구성된 문자열을 올바른 괄호 문자열(Valid PS, VPS)이라고 부른다. 한 쌍의 괄호 기호로 된 “( )” 문자열은 기본 VPS 이라고 부른다. 만일 x 가 VPS 라면 이것을 하나의 괄호에 넣은 새로운 문자열 “(x)”도 VPS 가 된다. 그리고 두 VPS x 와 y를 접합(concatenation)시킨 새로운 문자열 xy도 VPS 가 된다. 예를 들어 “(())()”와 “((()))” 는 VPS 이지만 “(()(”, “(())()))” , 그리고 “(()” 는 모두 VPS 가 아닌 문자열이다. </p>
<p>여러분은 입력으로 주어진 괄호 문자열이 VPS 인지 아닌지를 판단해서 그 결과를 YES 와 NO 로 나타내어야 한다.</p>
<h3 id="입력"><strong>입력</strong></h3>
<p>입력 데이터는 표준 입력을 사용한다. 입력은 T개의 테스트 데이터로 주어진다. 입력의 첫 번째 줄에는 입력 데이터의 수를 나타내는 정수 T가 주어진다. 각 테스트 데이터의 첫째 줄에는 괄호 문자열이 한 줄에 주어진다. 하나의 괄호 문자열의 길이는 2 이상 50 이하이다.</p>
<h3 id="출력"><strong>출력</strong></h3>
<p>출력은 표준 출력을 사용한다. 만일 입력 괄호 문자열이 올바른 괄호 문자열(VPS)이면 “YES”, 아니면 “NO”를 한 줄에 하나씩 차례대로 출력해야 한다.</p>
<hr>
<h2 id="풀이"><strong>풀이</strong></h2>
<h3 id="코드"><strong>코드</strong></h3>
<pre><code class="language-rust">// 9012번, 괄호

use std::io::{self, BufReader, BufRead, BufWriter, Write};

fn main() {
    let mut reader = BufReader::new(io::stdin().lock());
    let mut writer = BufWriter::new(io::stdout().lock());
    let mut t = String::new();
    reader.read_line(&amp;mut t).unwrap();
    let t: usize = t.trim().parse().unwrap();
    let mut input = String::new();
    for _ in 0..t {
        let mut count = 0;
        reader.read_line(&amp;mut input).unwrap();
        for c in input.chars() {
            match c {
                &#39;(&#39; =&gt; count += 1,
                &#39;)&#39; =&gt; count -= 1,
                _ =&gt; (),
            }
            if count &lt; 0 { break; }
        }
        if count != 0 { writeln!(writer, &quot;NO&quot;).unwrap(); }
        else { writeln!(writer, &quot;YES&quot;).unwrap(); }
        input.clear();
    }
}</code></pre>
<h3 id="해설"><strong>해설</strong></h3>
<p>다음엔 스택으로 풀어보도록 하자.</p>
<hr>
<h2 id="추가-학습"><strong>추가 학습</strong></h2>
<ul>
<li>특이사항 없음</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Rust로 백준 하루 하나] 16-2. 제로]]></title>
            <link>https://velog.io/@sann_n/Rust%EB%A1%9C-%EB%B0%B1%EC%A4%80-%ED%95%98%EB%A3%A8-%ED%95%98%EB%82%98-16-2.-%EC%A0%9C%EB%A1%9C</link>
            <guid>https://velog.io/@sann_n/Rust%EB%A1%9C-%EB%B0%B1%EC%A4%80-%ED%95%98%EB%A3%A8-%ED%95%98%EB%82%98-16-2.-%EC%A0%9C%EB%A1%9C</guid>
            <pubDate>Sun, 13 Oct 2024 02:42:25 GMT</pubDate>
            <description><![CDATA[<h2 id="문제-10773번"><strong>문제 (10773번)</strong></h2>
<p>나코더 기장 재민이는 동아리 회식을 준비하기 위해서 장부를 관리하는 중이다.</p>
<p>재현이는 재민이를 도와서 돈을 관리하는 중인데, 애석하게도 항상 정신없는 재현이는 돈을 실수로 잘못 부르는 사고를 치기 일쑤였다.</p>
<p>재현이는 잘못된 수를 부를 때마다 0을 외쳐서, 가장 최근에 재민이가 쓴 수를 지우게 시킨다.</p>
<p>재민이는 이렇게 모든 수를 받아 적은 후 그 수의 합을 알고 싶어 한다. 재민이를 도와주자!</p>
<h3 id="입력"><strong>입력</strong></h3>
<p>첫 번째 줄에 정수 K가 주어진다. (1 ≤ K ≤ 100,000)</p>
<p>이후 K개의 줄에 정수가 1개씩 주어진다. 정수는 0에서 1,000,000 사이의 값을 가지며, 정수가 &quot;0&quot; 일 경우에는 가장 최근에 쓴 수를 지우고, 아닐 경우 해당 수를 쓴다.</p>
<p>정수가 &quot;0&quot;일 경우에 지울 수 있는 수가 있음을 보장할 수 있다.</p>
<h3 id="출력"><strong>출력</strong></h3>
<p>재민이가 최종적으로 적어 낸 수의 합을 출력한다. 최종적으로 적어낸 수의 합은 231-1보다 작거나 같은 정수이다.</p>
<hr>
<h2 id="풀이"><strong>풀이</strong></h2>
<h3 id="코드"><strong>코드</strong></h3>
<pre><code class="language-rust">use std::io::{self, BufReader, BufRead, BufWriter, Write};

fn main() {
    let mut reader = BufReader::new(io::stdin().lock());
    let mut writer = BufWriter::new(io::stdout().lock());

    let mut k = String::new();
    reader.read_line(&amp;mut k).unwrap();
    let k: usize = k.trim().parse().unwrap();

    let mut stack: Vec&lt;u32&gt; = Vec::new();
    let mut input = String::new();
    for _ in 0..k {
        reader.read_line(&amp;mut input).unwrap();
        let n: u32 = input.trim().parse().unwrap();
        if n == 0 {
            stack.pop();
        } else {
            stack.push(n);
        }
        input.clear();
    }
    let output: u32 = stack.iter().sum();
    writeln!(writer, &quot;{}&quot;, output).unwrap();
}</code></pre>
<h3 id="해설"><strong>해설</strong></h3>
<p>특이사항 없음</p>
<hr>
<h2 id="추가-학습"><strong>추가 학습</strong></h2>
<ul>
<li>특이사항 없음</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Rust로 백준 하루 하나] 16-1. 스택 2]]></title>
            <link>https://velog.io/@sann_n/Rust%EB%A1%9C-%EB%B0%B1%EC%A4%80-%ED%95%98%EB%A3%A8-%ED%95%98%EB%82%98-16-1.-%EC%8A%A4%ED%83%9D-2</link>
            <guid>https://velog.io/@sann_n/Rust%EB%A1%9C-%EB%B0%B1%EC%A4%80-%ED%95%98%EB%A3%A8-%ED%95%98%EB%82%98-16-1.-%EC%8A%A4%ED%83%9D-2</guid>
            <pubDate>Sun, 13 Oct 2024 02:40:30 GMT</pubDate>
            <description><![CDATA[<h2 id="문제-28278번"><strong>문제 (28278번)</strong></h2>
<p>정수를 저장하는 스택을 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램을 작성하시오.</p>
<p>명령은 총 다섯 가지이다.</p>
<ol>
<li><code>1 X</code>: 정수 X를 스택에 넣는다. (1 ≤ X ≤ 100,000)</li>
<li><code>2</code>: 스택에 정수가 있다면 맨 위의 정수를 빼고 출력한다. 없다면 <code>-1</code>을 대신 출력한다.</li>
<li><code>3</code>: 스택에 들어있는 정수의 개수를 출력한다.</li>
<li><code>4</code>: 스택이 비어있으면 <code>1</code>, 아니면 <code>0</code>을 출력한다.</li>
<li><code>5</code>: 스택에 정수가 있다면 맨 위의 정수를 출력한다. 없다면 <code>-1</code>을 대신 출력한다.</li>
</ol>
<h3 id="입력"><strong>입력</strong></h3>
<p>첫째 줄에 명령의 수 N이 주어진다. (1 ≤ N ≤ 1,000,000)</p>
<p>둘째 줄부터 N개 줄에 명령이 하나씩 주어진다.</p>
<p>출력을 요구하는 명령은 하나 이상 주어진다.</p>
<h3 id="출력"><strong>출력</strong></h3>
<p>출력을 요구하는 명령이 주어질 때마다 명령의 결과를 한 줄에 하나씩 출력한다.</p>
<hr>
<h2 id="풀이"><strong>풀이</strong></h2>
<h3 id="코드"><strong>코드</strong></h3>
<pre><code class="language-rust">use std::io::{self, BufReader, BufRead, BufWriter, Write};

fn main() {
    let mut reader = BufReader::new(io::stdin().lock());
    let mut writer = BufWriter::new(io::stdout().lock());

    let mut n = String::new();
    reader.read_line(&amp;mut n).unwrap();
    let n: usize = n.trim().parse().unwrap();

    let mut stack: Vec&lt;i32&gt; = Vec::new();
    let mut input = String::new();
    for _ in 0..n {
        reader.read_line(&amp;mut input).unwrap();
        let mut input_iter = input
            .trim()
            .split_whitespace()
            .map(|i| i.parse::&lt;i32&gt;().unwrap());
        let inst = input_iter.next().unwrap();

        match inst {
            1 =&gt; {
                let x: i32 = input_iter.next().unwrap();
                stack.push(x);
            },
            2 =&gt; {
                if stack.len() == 0 {
                    writeln!(writer, &quot;-1&quot;).unwrap();
                } else {
                    let output = stack.pop().unwrap();
                    writeln!(writer, &quot;{output}&quot;).unwrap();
                }
            },
            3 =&gt; {
                writeln!(writer, &quot;{}&quot;, stack.len()).unwrap();
            },
            4 =&gt; {
                if stack.len() == 0 { writeln!(writer, &quot;1&quot;).unwrap(); }
                else { writeln!(writer, &quot;0&quot;).unwrap(); }
            },
            5 =&gt; {
                if stack.len() == 0 {
                    writeln!(writer, &quot;-1&quot;).unwrap();
                } else {
                    writeln!(writer, &quot;{}&quot;, stack[stack.len()-1]).unwrap();
                }
            },
            _ =&gt; (),
        }
        input.clear();
    }
}

</code></pre>
<h3 id="해설"><strong>해설</strong></h3>
<p><code>match</code> 구문에서 다음과 같이 러스트에게 명시적으로 앞의 갈래에 매칭되지 않은 어떠한 값도 사용하지 않을 것이며, 어떠한 코드도 실행하지 않기를 원한다고 알려줄 수 있습니다.</p>
<pre><code class="language-rust">_ =&gt; ()</code></pre>
<hr>
<h2 id="추가-학습"><strong>추가 학습</strong></h2>
<ul>
<li>특이사항 없음</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Rust로 백준 하루 하나] 15-9. 창문 닫기]]></title>
            <link>https://velog.io/@sann_n/Rust%EB%A1%9C-%EB%B0%B1%EC%A4%80-%ED%95%98%EB%A3%A8-%ED%95%98%EB%82%98-15-9.-%EC%B0%BD%EB%AC%B8-%EB%8B%AB%EA%B8%B0</link>
            <guid>https://velog.io/@sann_n/Rust%EB%A1%9C-%EB%B0%B1%EC%A4%80-%ED%95%98%EB%A3%A8-%ED%95%98%EB%82%98-15-9.-%EC%B0%BD%EB%AC%B8-%EB%8B%AB%EA%B8%B0</guid>
            <pubDate>Fri, 11 Oct 2024 05:20:40 GMT</pubDate>
            <description><![CDATA[<h2 id="문제-13909번"><strong>문제 (13909번)</strong></h2>
<p>서강대학교 컴퓨터공학과 실습실 R912호에는 현재 N개의 창문이 있고 또 N명의 사람이 있다. 1번째 사람은 1의 배수 번째 창문을 열려 있으면 닫고 닫혀 있으면 연다.  2번째 사람은 2의 배수 번째 창문을 열려 있으면 닫고 닫혀 있으면 연다. 이러한 행동을 N번째 사람까지 진행한 후 열려 있는 창문의 개수를 구하라. 단, 처음에 모든 창문은 닫혀 있다.</p>
<p>예를 들어 현재 3개의 창문이 있고 3명의 사람이 있을 때,</p>
<ol>
<li>1번째 사람은 1의 배수인 1,2,3번 창문을 연다. (1, 1, 1)</li>
<li>2번째 사람은 2의 배수인 2번 창문을 닫는다. (1, 0, 1)</li>
<li>3번째 사람은 3의 배수인 3번 창문을 닫는다. (1, 0, 0)</li>
</ol>
<p>결과적으로 마지막에 열려 있는 창문의 개수는 1개 이다.</p>
<h3 id="입력"><strong>입력</strong></h3>
<p>첫 번째 줄에는 창문의 개수와 사람의 수 N(<strong>1 ≤ N ≤ 2,100,000,000</strong>)이 주어진다.</p>
<h3 id="출력"><strong>출력</strong></h3>
<p>마지막에 열려 있는 창문의 개수를 출력한다.</p>
<hr>
<h2 id="풀이"><strong>풀이</strong></h2>
<h3 id="코드"><strong>코드</strong></h3>
<pre><code class="language-rust">use std::io::{self, BufReader, BufRead, BufWriter, Write};

fn main() {
    let mut reader = BufReader::new(io::stdin().lock());
    let mut writer = BufWriter::new(io::stdout().lock());

    let mut n = String::new();
    reader.read_line(&amp;mut n).unwrap();
    let n: usize = n.trim().parse().unwrap();

    let count = (1..).take_while(|&amp;x| x * x &lt;= n).count();

    writeln!(writer, &quot;{}&quot;, count).unwrap();
}</code></pre>
<h3 id="해설"><strong>해설</strong></h3>
<p>처음엔 범위도 정해져있고 이전과 같이 에라토스테네스의 체로 풀면 되겠다하고 다음과 같이 풀었는데 메모리 초과 문제가 발생했다. 하지만 이 문제는 입력값 n이 21억까지 클 수 있기 때문에 다른 방법으로 풀어야한다. </p>
<p>이 문제는 사실 모든 창문에 대해 반복적으로 상태를 업데이트할 필요가 없습니다. 특정 창문이 마지막에 열려 있을 조건은 그 창문이 열리고 닫히는 횟수에 의해 결정됩니다. 구체적으로, 창문이 열리고 닫히는 횟수는 해당 창문의 번호의 약수 개수에 따라 결정됩니다. 이 때, 약수의 개수가 홀수인 경우 창문은 열려 있고, 짝수인 경우 창문은 닫혀 있습니다. 약수의 개수가 홀수일 때는 해당 번호가 완전 제곱수일 때에만 발생합니다.</p>
<pre><code class="language-rust">use std::io::{self, BufReader, BufRead, BufWriter, Write};

fn main() {
    let mut reader = BufReader::new(io::stdin().lock());
    let mut writer = BufWriter::new(io::stdout().lock());

    let mut n = String::new();
    reader.read_line(&amp;mut n).unwrap();
    let n: usize = n.trim().parse().unwrap();

    let mut windows = vec![false; n+1];
    for i in 1..=n {
        for j in (i..=n).step_by(i) {
            if windows[j] == true {
                windows[j] = false;
            } else {
                windows[j] = true;
            }
        }
    }

    let output = windows.iter().filter(|&amp;&amp;v| v == true).count();
    writeln!(writer, &quot;{}&quot;, output).unwrap();
}</code></pre>
<p>그래서 이렇게 푸니까 이번엔 시간초과... </p>
<pre><code class="language-rust">use std::io::{self, BufReader, BufRead, BufWriter, Write};

fn main() {
    let mut reader = BufReader::new(io::stdin().lock());
    let mut writer = BufWriter::new(io::stdout().lock());

    let mut n = String::new();
    reader.read_line(&amp;mut n).unwrap();
    let n: usize = n.trim().parse().unwrap();

    let mut count = 0;
    for i in 1..=n {
        if square_number(i) { count += 1; }
    }

    writeln!(writer, &quot;{}&quot;, count).unwrap();
}

fn square_number(n: usize) -&gt; bool {
    let m = (n as f64).sqrt() as usize;
    if m * m == n { true }
    else { false }
}
</code></pre>
<hr>
<h2 id="추가-학습"><strong>추가 학습</strong></h2>
<pre><code class="language-rust">fn take_while&lt;P&gt;(self, predicate: P) -&gt; TakeWhile&lt;Self, P&gt;
where Self: Sized,
      P: FnMut(&amp;Self::Item) -&gt; bool,</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Rust로 백준 하루 하나] 15-8. 골드바흐 파티션]]></title>
            <link>https://velog.io/@sann_n/Rust%EB%A1%9C-%EB%B0%B1%EC%A4%80-%ED%95%98%EB%A3%A8-%ED%95%98%EB%82%98-15-8.-%EA%B3%A8%EB%93%9C%EB%B0%94%ED%9D%90-%ED%8C%8C%ED%8B%B0%EC%85%98</link>
            <guid>https://velog.io/@sann_n/Rust%EB%A1%9C-%EB%B0%B1%EC%A4%80-%ED%95%98%EB%A3%A8-%ED%95%98%EB%82%98-15-8.-%EA%B3%A8%EB%93%9C%EB%B0%94%ED%9D%90-%ED%8C%8C%ED%8B%B0%EC%85%98</guid>
            <pubDate>Fri, 11 Oct 2024 05:19:14 GMT</pubDate>
            <description><![CDATA[<h2 id="문제-17103번"><strong>문제 (17103번)</strong></h2>
<ul>
<li>골드바흐의 추측: 2보다 큰 짝수는 두 소수의 합으로 나타낼 수 있다.</li>
</ul>
<p>짝수 N을 두 소수의 합으로 나타내는 표현을 골드바흐 파티션이라고 한다. 짝수 N이 주어졌을 때, 골드바흐 파티션의 개수를 구해보자. 두 소수의 순서만 다른 것은 같은 파티션이다.</p>
<h3 id="입력"><strong>입력</strong></h3>
<p>첫째 줄에 테스트 케이스의 개수 T (1 ≤ T ≤ 100)가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, 정수 N은 짝수이고, 2 &lt; N ≤ 1,000,000을 만족한다.</p>
<h3 id="출력"><strong>출력</strong></h3>
<p>각각의 테스트 케이스마다 골드바흐 파티션의 수를 출력한다.</p>
<hr>
<h2 id="풀이"><strong>풀이</strong></h2>
<h3 id="코드"><strong>코드</strong></h3>
<pre><code class="language-rust">use std::io::{self, BufReader, BufRead, BufWriter, Write};
use std::f64;

fn main() {
    let mut reader = BufReader::new(io::stdin().lock());
    let mut writer = BufWriter::new(io::stdout().lock());

    let mut t = String::new();
    reader.read_line(&amp;mut t).unwrap();
    let t: usize = t.trim().parse().unwrap();

    // 에라토스테네스의 체로 미리 소수 구하기
    let max_n = 1_000_000;
    let is_prime = eratos(max_n);

    let mut input = String::new();
    for _ in 0..t {
        reader.read_line(&amp;mut input).unwrap();
        let n: usize = input.trim().parse().unwrap();
        let mut count = 0;

        // 모든 가능한 소수쌍 찾기
        for i in 2..=n / 2 {
            if is_prime[i] &amp;&amp; is_prime[n - i] {
                count += 1;
            }
        }

        writeln!(writer, &quot;{}&quot;, count).unwrap();
        input.clear();
    }
}

// 에라토스테네스의 체를 사용해 소수 구하기
fn eratos(n: usize) -&gt; Vec&lt;bool&gt; {
    let mut is_prime = vec![true; n + 1];
    is_prime[0] = false;
    is_prime[1] = false;

    for i in 2..=(n as f64).sqrt() as usize {
        if is_prime[i] {
            for j in (i * i..=n).step_by(i) {
                is_prime[j] = false;
            }
        }
    }

    is_prime
}
</code></pre>
<h3 id="해설"><strong>해설</strong></h3>
<p>특이사항 없음</p>
<hr>
<h2 id="추가-학습"><strong>추가 학습</strong></h2>
<ul>
<li>특이사항 없음</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Rust로 백준 하루 하나] 15-7. 베르트랑 공준]]></title>
            <link>https://velog.io/@sann_n/Rust%EB%A1%9C-%EB%B0%B1%EC%A4%80-%ED%95%98%EB%A3%A8-%ED%95%98%EB%82%98-15-7.-%EB%B2%A0%EB%A5%B4%ED%8A%B8%EB%9E%91-%EA%B3%B5%EC%A4%80</link>
            <guid>https://velog.io/@sann_n/Rust%EB%A1%9C-%EB%B0%B1%EC%A4%80-%ED%95%98%EB%A3%A8-%ED%95%98%EB%82%98-15-7.-%EB%B2%A0%EB%A5%B4%ED%8A%B8%EB%9E%91-%EA%B3%B5%EC%A4%80</guid>
            <pubDate>Fri, 11 Oct 2024 05:17:52 GMT</pubDate>
            <description><![CDATA[<h2 id="문제-4948번"><strong>문제 (4948번)</strong></h2>
<p>베르트랑 공준은 임의의 자연수 n에 대하여, n보다 크고, 2n보다 작거나 같은 소수는 적어도 하나 존재한다는 내용을 담고 있다.</p>
<p>이 명제는 조제프 베르트랑이 1845년에 추측했고, 파프누티 체비쇼프가 1850년에 증명했다.</p>
<p>예를 들어, 10보다 크고, 20보다 작거나 같은 소수는 4개가 있다. (11, 13, 17, 19) 또, 14보다 크고, 28보다 작거나 같은 소수는 3개가 있다. (17,19, 23)</p>
<p>자연수 n이 주어졌을 때, n보다 크고, 2n보다 작거나 같은 소수의 개수를 구하는 프로그램을 작성하시오.</p>
<h3 id="입력"><strong>입력</strong></h3>
<p>입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 케이스는 n을 포함하는 한 줄로 이루어져 있다.</p>
<p>입력의 마지막에는 0이 주어진다.</p>
<h3 id="출력"><strong>출력</strong></h3>
<p>각 테스트 케이스에 대해서, n보다 크고, 2n보다 작거나 같은 소수의 개수를 출력한다.</p>
<hr>
<h2 id="풀이"><strong>풀이</strong></h2>
<h3 id="코드"><strong>코드</strong></h3>
<pre><code class="language-rust">use std::io::{self, BufReader, BufRead, BufWriter, Write};
use std::f64;

fn main() {
    let mut reader = BufReader::new(io::stdin().lock());
    let mut writer = BufWriter::new(io::stdout().lock());

    let mut input = String::new();
    loop {
        reader.read_line(&amp;mut input).unwrap();
        let n: u32 = input.trim().parse().unwrap();
        if n == 0 { break; }

        let mut count = 0;
        for i in n+1..=2*n {
            if is_prime(i) { count += 1; }
        }

        writeln!(writer, &quot;{}&quot;, count).unwrap();
        input.clear();
    }
}

fn is_prime(i: u32) -&gt; bool {
    if i &lt; 2 { return false; }
    for div in 2..=(i as f64).sqrt() as u32 {
        if i % div == 0 { return false; }
    }
    true
}</code></pre>
<h3 id="해설"><strong>해설</strong></h3>
<p>이 문제도 범위가 정해져 있으므로 다음에 에라토스테네스의 체를 사용하여 다시 풀어보자</p>
<hr>
<h2 id="추가-학습"><strong>추가 학습</strong></h2>
<ul>
<li>특이사항 없음</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Rust로 백준 하루 하나] 15-6. 소수 구하기]]></title>
            <link>https://velog.io/@sann_n/Rust%EB%A1%9C-%EB%B0%B1%EC%A4%80-%ED%95%98%EB%A3%A8-%ED%95%98%EB%82%98-15-6.-%EC%86%8C%EC%88%98-%EA%B5%AC%ED%95%98%EA%B8%B0-q3b4cdsn</link>
            <guid>https://velog.io/@sann_n/Rust%EB%A1%9C-%EB%B0%B1%EC%A4%80-%ED%95%98%EB%A3%A8-%ED%95%98%EB%82%98-15-6.-%EC%86%8C%EC%88%98-%EA%B5%AC%ED%95%98%EA%B8%B0-q3b4cdsn</guid>
            <pubDate>Thu, 10 Oct 2024 03:27:29 GMT</pubDate>
            <description><![CDATA[<h2 id="문제-1929번"><strong>문제 (1929번)</strong></h2>
<p>M이상 N이하의 소수를 모두 출력하는 프로그램을 작성하시오.</p>
<h3 id="입력"><strong>입력</strong></h3>
<p>첫째 줄에 자연수 M과 N이 빈 칸을 사이에 두고 주어진다. (1 ≤ M ≤ N ≤ 1,000,000) M이상 N이하의 소수가 하나 이상 있는 입력만 주어진다.</p>
<h3 id="출력"><strong>출력</strong></h3>
<p>한 줄에 하나씩, 증가하는 순서대로 소수를 출력한다.</p>
<hr>
<h2 id="풀이"><strong>풀이</strong></h2>
<h3 id="코드"><strong>코드</strong></h3>
<pre><code class="language-rust">use std::io::{self, BufReader, BufRead, BufWriter, Write};
use std::f64;

fn main() {
    let mut reader = BufReader::new(io::stdin().lock());
    let mut writer = BufWriter::new(io::stdout().lock());

    let mut input = String::new();
    reader.read_line(&amp;mut input).unwrap();
    let mut input_iter = input
        .trim()
        .split_whitespace()
        .map(|i| i.parse::&lt;u32&gt;().unwrap());
    let m = input_iter.next().unwrap();
    let n = input_iter.next().unwrap();

    for i in m..=n {
        if is_prime(i) {
            writeln!(writer, &quot;{}&quot;, i).unwrap();
        }
    }
}

fn is_prime(n: u32) -&gt; bool {
    if n &lt; 2 {
        false
    } else {
        for x in 2..=((n as f64).sqrt() as u32) {
            if n % x == 0 { return false; }
        }
        true
    }
}

</code></pre>
<h3 id="해설"><strong>해설</strong></h3>
<p>에라토스테네스의 체를 사용하여 풀어보려고 하였으나 시간이 너무 오래 걸려 제곱근까지 직접 나누는 방식으로 풀었습니다. 에라토스 테네스의 체로 푸는 방법은 추가 학습에서 다루겠습니다.</p>
<hr>
<h2 id="추가-학습"><strong>추가 학습</strong></h2>
<p>다음과 같이 에라토스테네스의 체를 구현할 수 있습니다.</p>
<pre><code class="language-rust">let mut is_prime = vec![true; n + 1];
is_prime[0] = false;
is_prime[1] = false;

// 에라토스테네스의 체 구현
for i in 2..=((n as f64).sqrt() as usize) {
  if is_prime[i] {
    for j in (i * i..=n).step_by(i) {
      is_prime[j] = false;
    }
  }
}</code></pre>
<p>참고로, <code>step_by</code> 메서드는 step 만큼 건너뛰는 함수입니다.</p>
<pre><code class="language-rust">fn step_by(self, step: usize) -&gt; StepBy&lt;Self&gt;
where Self: Sized,</code></pre>
<p><a href="https://doc.rust-lang.org/beta/std/iter/trait.Iterator.html#method.step_by">https://doc.rust-lang.org/beta/std/iter/trait.Iterator.html#method.step_by</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Rust로 백준 하루 하나] 15-5. 다음 소수]]></title>
            <link>https://velog.io/@sann_n/Rust%EB%A1%9C-%EB%B0%B1%EC%A4%80-%ED%95%98%EB%A3%A8-%ED%95%98%EB%82%98-15-5.-%EB%8B%A4%EC%9D%8C-%EC%86%8C%EC%88%98</link>
            <guid>https://velog.io/@sann_n/Rust%EB%A1%9C-%EB%B0%B1%EC%A4%80-%ED%95%98%EB%A3%A8-%ED%95%98%EB%82%98-15-5.-%EB%8B%A4%EC%9D%8C-%EC%86%8C%EC%88%98</guid>
            <pubDate>Thu, 10 Oct 2024 03:25:48 GMT</pubDate>
            <description><![CDATA[<h2 id="문제-4134번"><strong>문제 (4134번)</strong></h2>
<p>정수 n($0 ≤ n ≤ 4*10^9$)가 주어졌을 때, n보다 크거나 같은 소수 중 가장 작은 소수 찾는 프로그램을 작성하시오.</p>
<h3 id="입력"><strong>입력</strong></h3>
<p>첫째 줄에 테스트 케이스의 개수가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, 정수 n이 주어진다.</p>
<h3 id="출력"><strong>출력</strong></h3>
<p>각각의 테스트 케이스에 대해서 n보다 크거나 같은 소수 중 가장 작은 소수를 한 줄에 하나씩 출력한다.</p>
<hr>
<h2 id="풀이"><strong>풀이</strong></h2>
<h3 id="코드"><strong>코드</strong></h3>
<pre><code class="language-rust">use std::io::{self, BufReader, BufRead, BufWriter, Write};
use std::f64;
use std::time::Instant;

fn main() {
    let start_time = Instant::now();

    let mut reader = BufReader::new(io::stdin().lock());
    let mut writer = BufWriter::new(io::stdout().lock());

    let mut num = String::new();
    reader.read_line(&amp;mut num).unwrap();
    let num: usize = num.trim().parse().unwrap();

    let mut input = String::new();
    for _ in 0..num {
        reader.read_line(&amp;mut input).unwrap();
        let n: u32 = input.trim().parse().unwrap();

        // n보다 크거나 같은 소수 중 가장 작은 소수
        let mut output = n;
        &#39;a: loop {
            let limit = (output as f64).sqrt() as u32;
            if output &lt; 2 {
                output = 2;
            }
            for i in 2..=limit {
                if output % i == 0 {
                    output += 1;
                    continue &#39;a;
                }
            }
            break;
        }

        writeln!(writer, &quot;{}&quot;, output).unwrap();
        input.clear();
    }

    let end_time = Instant::now();
    let elapsed_time = end_time.duration_since(start_time);
    println!(&quot;{:?}&quot;, elapsed_time);
}
</code></pre>
<h3 id="해설"><strong>해설</strong></h3>
<pre><code class="language-rust">use std::io::{self, BufReader, BufRead, BufWriter, Write};

fn main() {
    let mut reader = BufReader::new(io::stdin().lock());
    let mut writer = BufWriter::new(io::stdout().lock());

    let mut num = String::new();
    reader.read_line(&amp;mut num).unwrap();
    let num: usize = num.trim().parse().unwrap();

    let mut input = String::new();
    for _ in 0..num {
        reader.read_line(&amp;mut input).unwrap();
        let n: u32 = input.trim().parse().unwrap();

        // n보다 크거나 같은 소수 중 가장 작은 소수
        let mut output = n;
        &#39;a: loop {
            for i in 2..=output/2 {
                if output % i == 0 { break; }
                else if i == output/2 { 
                    break &#39;a;
                }
            }
            output += 1;
        }

        writeln!(writer, &quot;{}&quot;, output).unwrap();
        input.clear();
    }
}</code></pre>
<p>처음엔 이렇게 <code>나누기 2</code>가 되는 수까지 반복을 했으나 시간초과가 나왔습니다. 지난번에 이렇게 풀어서 그대로 했던 건데 사실 <code>제곱근</code>까지만 반복하면 됩니다.</p>
<p>제곱근까지 반복하는 방식으로 해결할 수 있었지만 시간을 재보았을 때 3,4초 정도 나왔는데 문제의 시간제한 1초를 어떻게 통과했는지는 잘 모르겠습니다. 아시는 분은 댓글로 알려주시면 감사하겠습니다.</p>
<blockquote>
<p>[!NOTE]
Rust에서 <code>as u32</code>를 사용하여 소수점을 포함한 <code>f64</code> 값을 <code>u32</code>로 변환할 때, 소수점 이하 부분은 단순히 버려집니다 (즉, 내림 처리).</p>
</blockquote>
<hr>
<h2 id="추가-학습"><strong>추가 학습</strong></h2>
<ul>
<li><a href="https://ko.wikipedia.org/wiki/%EC%86%8C%EC%88%98%ED%8C%90%EB%B3%84%EB%B2%95">다양한 소수판별법 알고리즘</a></li>
<li>그 외 <a href="https://ko.wikipedia.org/wiki/%EC%97%90%EB%9D%BC%ED%86%A0%EC%8A%A4%ED%85%8C%EB%84%A4%EC%8A%A4%EC%9D%98_%EC%B2%B4">에라토스테네스의 체</a></li>
<li></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Rust로 백준 하루 하나] 15-4. 가로수]]></title>
            <link>https://velog.io/@sann_n/Rust%EB%A1%9C-%EB%B0%B1%EC%A4%80-%ED%95%98%EB%A3%A8-%ED%95%98%EB%82%98-15-4.-%EA%B0%80%EB%A1%9C%EC%88%98</link>
            <guid>https://velog.io/@sann_n/Rust%EB%A1%9C-%EB%B0%B1%EC%A4%80-%ED%95%98%EB%A3%A8-%ED%95%98%EB%82%98-15-4.-%EA%B0%80%EB%A1%9C%EC%88%98</guid>
            <pubDate>Thu, 10 Oct 2024 03:24:14 GMT</pubDate>
            <description><![CDATA[<h2 id="문제-2485번"><strong>문제 (2485번)</strong></h2>
<p>직선으로 되어있는 도로의 한 편에 가로수가 임의의 간격으로 심어져있다. KOI 시에서는 가로수들이 모두 같은 간격이 되도록 가로수를 추가로 심는 사업을 추진하고 있다. KOI 시에서는 예산문제로 가능한 한 가장 적은 수의 나무를 심고 싶다.</p>
<p>편의상 가로수의 위치는 기준점으로 부터 떨어져 있는 거리로 표현되며, 가로수의 위치는 모두 양의 정수이다.</p>
<p>예를 들어, 가로수가 (1, 3, 7, 13)의 위치에 있다면 (5, 9, 11)의 위치에 가로수를 더 심으면 모든 가로수들의 간격이 같게 된다. 또한, 가로수가 (2, 6, 12, 18)에 있다면 (4, 8, 10, 14, 16)에 가로수를 더 심어야 한다.</p>
<p>심어져 있는 가로수의 위치가 주어질 때, 모든 가로수가 같은 간격이 되도록 새로 심어야 하는 가로수의 최소수를 구하는 프로그램을 작성하라. 단, 추가되는 나무는 기존의 나무들 사이에만 심을 수 있다.</p>
<h3 id="입력"><strong>입력</strong></h3>
<p>첫째 줄에는 이미 심어져 있는 가로수의 수를 나타내는 하나의 정수 N이 주어진다(3 ≤ N ≤ 100,000). 둘째 줄부터 N개의 줄에는 각 줄마다 심어져 있는 가로수의 위치가 양의 정수로 주어지며, 가로수의 위치를 나타내는 정수는 1,000,000,000 이하이다. 가로수의 위치를 나타내는 정수는 모두 다르고, N개의 가로수는 기준점으로부터 떨어진 거리가 가까운 순서대로 주어진다.</p>
<h3 id="출력"><strong>출력</strong></h3>
<p>모든 가로수가 같은 간격이 되도록 새로 심어야 하는 가로수의 최소수를 첫 번째 줄에 출력한다.</p>
<hr>
<h2 id="풀이"><strong>풀이</strong></h2>
<h3 id="코드"><strong>코드</strong></h3>
<pre><code class="language-rust">use std::io::{self, BufReader, BufRead, BufWriter, Write};

fn main() {
    let mut reader = BufReader::new(io::stdin().lock());
    let mut writer = BufWriter::new(io::stdout().lock());

    let mut n = String::new();
    reader.read_line(&amp;mut n).unwrap();
    let n: usize = n.trim().parse().unwrap();

    let mut input = String::new();
    for _ in 0..n {
        reader.read_line(&amp;mut input).unwrap();
    }
    let input: Vec&lt;i32&gt; = input
        .trim()
        .split_whitespace()
        .map(|i| i.parse().unwrap())
        .collect();

    // 가로수 간격 구하기
    let mut intervals: Vec&lt;i32&gt; = Vec::new();
    for i in 1..input.len() {
        intervals.push(input[i] - input[i-1]);
    }

    // 간격의 최대공약수 구하기
    let mut final_gcd: i32 = gcd(intervals[0], intervals[1]);
    for i in 2..intervals.len() {
        final_gcd = gcd(final_gcd, intervals[i]);
    }

    // 새로 심어야하는 개수 세기
    let output = (input[n-1] - input[0]) / final_gcd - (n as i32) + 1;
    writeln!(writer, &quot;{}&quot;, output).unwrap();
}

fn gcd(mut a: i32, mut b: i32) -&gt; i32 {
    while b != 0 {
        let r: i32 = a % b;
        a = b;
        b = r;
    }
    a
}</code></pre>
<h3 id="해설"><strong>해설</strong></h3>
<p>특이사항 없음</p>
<hr>
<h2 id="추가-학습"><strong>추가 학습</strong></h2>
<ul>
<li>특이사항 없음</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Rust로 백준 하루 하나] 15-3. 분수 합]]></title>
            <link>https://velog.io/@sann_n/Rust%EB%A1%9C-%EB%B0%B1%EC%A4%80-%ED%95%98%EB%A3%A8-%ED%95%98%EB%82%98-15-3.-%EB%B6%84%EC%88%98-%ED%95%A9</link>
            <guid>https://velog.io/@sann_n/Rust%EB%A1%9C-%EB%B0%B1%EC%A4%80-%ED%95%98%EB%A3%A8-%ED%95%98%EB%82%98-15-3.-%EB%B6%84%EC%88%98-%ED%95%A9</guid>
            <pubDate>Tue, 08 Oct 2024 02:38:38 GMT</pubDate>
            <description><![CDATA[<h2 id="문제-1735번"><strong>문제 (1735번)</strong></h2>
<p>분수 A/B는 분자가 A, 분모가 B인 분수를 의미한다. A와 B는 모두 자연수라고 하자.</p>
<p>두 분수의 합 또한 분수로 표현할 수 있다. 두 분수가 주어졌을 때, 그 합을 기약분수의 형태로 구하는 프로그램을 작성하시오. 기약분수란 더 이상 약분되지 않는 분수를 의미한다.</p>
<h3 id="입력"><strong>입력</strong></h3>
<p>첫째 줄과 둘째 줄에, 각 분수의 분자와 분모를 뜻하는 두 개의 자연수가 순서대로 주어진다. 입력되는 네 자연수는 모두 30,000 이하이다.</p>
<h3 id="출력"><strong>출력</strong></h3>
<p>첫째 줄에 구하고자 하는 기약분수의 분자와 분모를 뜻하는 두 개의 자연수를 빈 칸을 사이에 두고 순서대로 출력한다.</p>
<hr>
<h2 id="풀이"><strong>풀이</strong></h2>
<h3 id="코드"><strong>코드</strong></h3>
<pre><code class="language-rust">use std::io::{self, BufReader, BufRead, BufWriter, Write};

fn main() {
    let mut reader = BufReader::new(io::stdin().lock());
    let mut writer = BufWriter::new(io::stdout().lock());

    let mut input = String::new();
    for _ in 0..2 {
        reader.read_line(&amp;mut input).unwrap();
    }
    let mut input_iter = input
        .trim()
        .split_whitespace()
        .map(|i| i.parse::&lt;i32&gt;().unwrap());
    let a_child = input_iter.next().unwrap();
    let a_parent = input_iter.next().unwrap();
    let b_child = input_iter.next().unwrap();
    let b_parent = input_iter.next().unwrap();

    // 분모의 최소공배수로 분수 더하기
    let parent = lcm(a_parent, b_parent);
    let child = a_child * (parent/a_parent) + b_child * (parent/b_parent);

    // 기약분수로 만들기
    let output_parent = parent / gcd(parent, child);
    let output_child = child / gcd(parent, child);

    writeln!(writer, &quot;{} {}&quot;, output_child, output_parent).unwrap();
}

fn lcm(a: i32, b: i32) -&gt; i32 {
    (a * b) / gcd(a, b)
}

fn gcd(mut a: i32, mut b: i32) -&gt; i32 {
    let mut r: i32;
    while b != 0 {
        r = a % b;
        a = b;
        b = r;
    }
    a
}</code></pre>
<h3 id="해설"><strong>해설</strong></h3>
<p>특이사항 없음</p>
<hr>
<h2 id="추가-학습"><strong>추가 학습</strong></h2>
<ul>
<li>특이사항 없음</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Rust로 백준 하루 하나] 15-2. 최소공배수]]></title>
            <link>https://velog.io/@sann_n/Rust%EB%A1%9C-%EB%B0%B1%EC%A4%80-%ED%95%98%EB%A3%A8-%ED%95%98%EB%82%98-15-2.-%EC%B5%9C%EC%86%8C%EA%B3%B5%EB%B0%B0%EC%88%98</link>
            <guid>https://velog.io/@sann_n/Rust%EB%A1%9C-%EB%B0%B1%EC%A4%80-%ED%95%98%EB%A3%A8-%ED%95%98%EB%82%98-15-2.-%EC%B5%9C%EC%86%8C%EA%B3%B5%EB%B0%B0%EC%88%98</guid>
            <pubDate>Tue, 08 Oct 2024 02:37:17 GMT</pubDate>
            <description><![CDATA[<h2 id="문제-13241번"><strong>문제 (13241번)</strong></h2>
<p>정수 B에 0보다 큰 정수인 N을 곱해 정수 A를 만들 수 있다면, A는 B의 배수이다.</p>
<p>예:</p>
<ul>
<li>10은 5의 배수이다 (5*2 = 10)</li>
<li>10은 10의 배수이다(10*1 = 10)</li>
<li>6은 1의 배수이다(1*6 = 6)</li>
<li>20은 1, 2, 4,5,10,20의 배수이다.</li>
</ul>
<p>다른 예:</p>
<ul>
<li>2와 5의 최소공배수는 10이고, 그 이유는 2와 5보다 작은 공배수가 없기 때문이다.</li>
<li>10과 20의 최소공배수는 20이다.</li>
<li>5와 3의 최소공배수는 15이다.</li>
</ul>
<p>당신은 두 수에 대하여 최소공배수를 구하는 프로그램을 작성 하는 것이 목표이다.</p>
<h3 id="입력"><strong>입력</strong></h3>
<p>한 줄에 두 정수 A와 B가 공백으로 분리되어 주어진다.</p>
<p>50%의 입력 중 A와 B는 1000(103)보다 작다. 다른 50%의 입력은 1000보다 크고 100000000(108)보다 작다.</p>
<p>추가: 큰 수 입력에 대하여 변수를 64비트 정수로 선언하시오. C/C++에서는 long long int를 사용하고, Java에서는 long을 사용하시오.</p>
<h3 id="출력"><strong>출력</strong></h3>
<p>A와 B의 최소공배수를 한 줄에 출력한다.</p>
<hr>
<h2 id="풀이"><strong>풀이</strong></h2>
<h3 id="코드"><strong>코드</strong></h3>
<pre><code class="language-rust">use std::io::{self, BufReader, BufRead, BufWriter, Write};

fn main() {
    let mut reader = BufReader::new(io::stdin().lock());
    let mut writer = BufWriter::new(io::stdout().lock());
    let mut input = String::new();
    reader.read_line(&amp;mut input).unwrap();
    let mut input_iter = input
        .trim()
        .split_whitespace()
        .map(|i| i.parse::&lt;u64&gt;().unwrap());
    let a = input_iter.next().unwrap();
    let b = input_iter.next().unwrap();
    let result = lcm(a, b);
    writeln!(writer, &quot;{}&quot;, result).unwrap();
}

fn lcm(a: u64, b: u64) -&gt; u64 {
    (a * b) / gcd(a, b)
}

fn gcd(mut a: u64, mut b: u64) -&gt; u64 {
    let mut r: u64;
    while b != 0 {
        r = a % b;
        a = b;
        b = r;
    }
    a
}</code></pre>
<h3 id="해설"><strong>해설</strong></h3>
<p>특이사항 없음</p>
<hr>
<h2 id="추가-학습"><strong>추가 학습</strong></h2>
<ul>
<li>특이사항 없음</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Rust로 백준 하루 하나] 15-1. 최소공배수]]></title>
            <link>https://velog.io/@sann_n/Rust%EB%A1%9C-%EB%B0%B1%EC%A4%80-%ED%95%98%EB%A3%A8-%ED%95%98%EB%82%98-15-1.-%EC%B5%9C%EC%86%8C%EA%B3%B5%EB%B0%B0%EC%88%98</link>
            <guid>https://velog.io/@sann_n/Rust%EB%A1%9C-%EB%B0%B1%EC%A4%80-%ED%95%98%EB%A3%A8-%ED%95%98%EB%82%98-15-1.-%EC%B5%9C%EC%86%8C%EA%B3%B5%EB%B0%B0%EC%88%98</guid>
            <pubDate>Tue, 08 Oct 2024 01:09:58 GMT</pubDate>
            <description><![CDATA[<h2 id="문제-1934번"><strong>문제 (1934번)</strong></h2>
<p>두 자연수 A와 B에 대해서, A의 배수이면서 B의 배수인 자연수를 A와 B의 공배수라고 한다. 이런 공배수 중에서 가장 작은 수를 최소공배수라고 한다. 예를 들어, 6과 15의 공배수는 30, 60, 90등이 있으며, 최소 공배수는 30이다.</p>
<p>두 자연수 A와 B가 주어졌을 때, A와 B의 최소공배수를 구하는 프로그램을 작성하시오.</p>
<h3 id="입력"><strong>입력</strong></h3>
<p>첫째 줄에 테스트 케이스의 개수 T(1 ≤ T ≤ 1,000)가 주어진다. 둘째 줄부터 T개의 줄에 걸쳐서 A와 B가 주어진다. (1 ≤ A, B ≤ 45,000)</p>
<h3 id="출력"><strong>출력</strong></h3>
<p>첫째 줄부터 T개의 줄에 A와 B의 최소공배수를 입력받은 순서대로 한 줄에 하나씩 출력한다.</p>
<hr>
<h2 id="풀이"><strong>풀이</strong></h2>
<h3 id="코드"><strong>코드</strong></h3>
<pre><code class="language-rust">use std::io::{self, BufReader, BufRead, BufWriter, Write};

fn main() {
    let mut reader = BufReader::new(io::stdin().lock());
    let mut writer = BufWriter::new(io::stdout().lock());

    let mut t = String::new();
    reader.read_line(&amp;mut t).unwrap();
    let t: usize = t.trim().parse().unwrap();

    for _ in 0..t {
        let mut input = String::new();
        reader.read_line(&amp;mut input).unwrap();
        let mut input_iter = input
            .trim()
            .split_whitespace()
            .map(|i| i.parse::&lt;u32&gt;().unwrap());
        let a = input_iter.next().unwrap();
        let b = input_iter.next().unwrap();

        let result = lcm(a, b);
        writeln!(writer, &quot;{}&quot;, result).unwrap();
    }
}

fn lcm(a: u32, b: u32) -&gt; u32 {
    (a * b) / gcd(a, b)
}

fn gcd(mut a: u32, mut b: u32) -&gt; u32 {
    let mut r: u32;
    while b != 0 {
        r = a % b;
        a = b;
        b = r;
    }
    a
}</code></pre>
<h3 id="해설"><strong>해설</strong></h3>
<p>최대공약수, 최소공배수 구하는 방법 맨날 까먹는데 잘 기억해두자</p>
<hr>
<h2 id="추가-학습"><strong>추가 학습</strong></h2>
<ul>
<li>특이사항 없음</li>
</ul>
]]></description>
        </item>
    </channel>
</rss>