Rust 공식 문서를 참고한 글입니다. 1. 구조체구조체는 튜플과 유사하게 여러 자료형을 하나의 자료형으로 한 곳에 묶어서 만드는 자료형이다. 튜플과 다른 점은 순서에 의존하지 않고 접근할 수 있다는 장점이 있다. 구조체 정의구조체를 정의할 때는 struct라는 키워드를 사용한다. 구조체 내부의 자료들은 Field라고 표현하며 이름:자료형으로 표현된다.struct User { active: bool, username: String, email: String, sign_in_count: u64,} 인스턴스 생성이렇게 정의한 구조체를 사용하려면, 구조체 인스턴스를 생성해야 한다. 구조체 안에 key:value 쌍을 만들면 된다. 각 필드의 이름을 통해서 구분이 되기 때문에 정의한 순서..
분류 전체보기
1. 문제https://www.acmicpc.net/problem/5427 2. 문제 풀이이 문제는 불이 매초마다 번질 때, 상근이가 몇 초만에 건물을 탈출 할 수 있는지 출력해야 한다. 불은 벽으로 번질 수 없으며 상근이는 벽을 통과하지 못한다. 상근이는 불이 옮겨진 칸이나 이제 불이 옮겨질 칸으로 이동할 수도 없다. 불이 상근이의 위치에 옮겨짐과 동시에 상근이가 다른 칸으로 이동할 수는 있다. 불도 매초마다 이동하고 상근이도 매초마다 이동할 수 있기 때문에 각각 BFS를 구현해야 한다. 그래서 상근이의 위치인 '@'이 입력으로 들어오는 경우와 불의 위치인 '*'이 입력으로 들어오는 경우, 각각의 큐에 push 한다. 불이 먼저 이동한 후에, 상근이가 이동해야 한다.불이 확산되는 BFS에서는 현재 fi..
1. 문제https://www.acmicpc.net/problem/1697 2. 문제 풀이수빈이와 동생의 위치를 입력받아서 동생의 위치까지 가는데 걸리는 시간을 출력하는 문제다.수빈이의 위치가 X라고 할 때, 1초만에걸어가면 X-1 혹은 X+1 만큼 갈 수 있다.순간이동하면 X * 2 만큼 갈 수 있다. 이때 1초에 이동할 수 있는 모든 경우의 수를 q에 넣고 하나씩 탐색하며 visited된 상태인지만 확인해주면 된다.#include #include using namespace std;queue > q;int visited[100001] = {0,};int main() { int n, k; cin >> n >> k; q.push(pair (n, 0)); visited[n] = 1;..
1. 문제https://www.acmicpc.net/problem/2573 2. 문제 풀이문제의 핵심은 다음과 같다.빙산과 바다 데이터를 2차원 배열로 입력받는다.바다에 많이 접한 빙산일 수록 높이가 더 빨리 줄어든다.1년마다 빙산의 높이가 줄어든다.덩어리가 2개 이상으로 분리되는 최초의 시간을 출력한다. 처음에는 BFS를 1번 돌면서 0에 맞닿아 있는 수만큼 값을 빼주었더니, 0이 되어버린 경우까지 포함되어서 BFS를 두 번 도는 방법을 택했다. 할 일은 다음과 같이 2가지로 나눌 수 있다.컴포넌트 개수 세기주변의 바다(0) 개수만큼 높이 낮추기컴포넌트를 세는 BFS, 주변의 바다 개수만큼 빼주는 BFS를 구현해보자. 먼저 컴포넌트를 세는 건 일반 BFS처럼 방문처리하고 q에서 하나씩 읽어오면 된다...
1. 문제https://www.acmicpc.net/problem/7569 2. 문제 접근문제를 요약하면 다음과 같다. 위, 아래, 오른쪽, 왼쪽, 앞, 뒤 총 6방향을 탐색해야 한다.익은 토마토는 익지 않은 토마토에 영향을 준다.한 상자에 들어있는 토마토가 모두 익는데까지 걸리는 기간을 출력한다.만약 배열에 저장될 때부터 모든 토마토가 익은 상태면 0, 모든 토마토가 익지 않은 상태면 -1을 출력한다. 이를 기반으로 문제를 풀어보자. 입력될 때부터 익은 토마토라면 q에 위치를 저장한다. 그리고 익은 토마토 위치에서부터 bfs 탐색을 시작하고, 만약 익지 않은 토마토가 인접해있다면 1로 바꾸어주고 tmp에 push 한다. 이때 tmp는 입력된 이후, 다른 토마토에 의해 익은 토마토가 된 것의 위치를..
Rust 공식 문서를 참고한 글입니다. Slice 자료형슬라이스 자료형이란 배열이나 문자열과 같은 컬렉션을 일부 참조할 수 있게 하고, 소유권을 갖지 않아도 복사 없이 빠르게 접근할 수 있도록 하는 것이다. 첫번째 단어의 마지막 글자 인덱스를 반환하는 프로그램 예제를 살펴보자. 반복문을 통해 문자열을 탐색하며 띄어쓰기를 만나면 인덱스를 반환하는 방식이다. fn first_word(s: &String) -> usize { let bytes = s.as_bytes(); for (i, &item) in bytes.iter().enumerate() { if item == b' ' { return i; } } s.len()}문자열의 마지막 인..
Rust 공식 문서를 참고한 글입니다. 변수를 바인딩해 복사가 아닌 이동을 하는 경우에는 소유권이 이전되어 접근할 수 없다. 함수에서 반환된 이후에도 그 값을 사용하고 싶다면, 반환값으로 전달해서 소유권을 다시 이전하는 방법도 있다. Rust는 참조(Reference)를 통해 소유권을 가져가는 것이 아니라, 대여할 수 있도록 한다. 1. 참조 Reference참조란 포인터와 유사하게 해당 주소에 저장되어 있는 데이터에 접근해 읽어올 수 있다. 이때, 소유권은 넘어가지 않는다. 따라서 함수를 호출한 이후에도 해당 변수를 계속해서 사용할 수 있다. 참조할 때는 매개변수 자료형 앞에 & 를 붙여서 소유권을 가진 변수가 그 범위를 벗어나도 drop 함수를 호출하지 않는다. 예제를 살펴보자.fn main() { ..
Rust 공식 문서를 참고한 글입니다. Ownership소유권(ownership)은 Rust에서 메모리를 관리하는 방식을 규정하는 일련의 규칙이다. 모든 프로그램은 실행 중 컴퓨터 메모리를 관리해야 하는데, 몇몇 언어는 실행 중에 사용되지 않는 메모리를 찾는 방식을 사용하기도 하고, 프로그래머가 명시적으로 메모리를 할당하고 해제하는 경우도 있다. Rust는 이와 달리, Owner System을 통해 관리되고 컴파일러가 소유권 규칙을 감시하기 때문에, 규칙을 하나라도 어긋나면 컴파일되지 않는다. 소유권 규칙 Ownership ruleRust의 모든 값은 owner이 존재한다.한 순간에 한 owner만 존재할 수 있다. owner이 해당 범위를 벗어나면, 그 값은 제거된다. 변수 범위 Variable Sc..
Recoil 공식 문서를 참고한 글입니다. 1. Recoil 기본 개념recoil이란 React를 위한 상태 관리 툴이다. recoil을 사용하려면, atoms에서 selectors를 거쳐 React 컴포넌트로 내려가는 data-flow graph를 만들 수 있다. Atomsatom은 상태 단위로, atom 값을 읽는 컴포넌트들은 암묵적으로 atom을 구독하기 때문에 atom에 어떤 변화가 생기면 자동적으로 재렌더링이 된다. 디버깅이나 지속성 등을 위해 고유한 key가 필요하고, React 컴포넌트 상태처럼 기본 값도 가진다.const fontSizeState = atom({ key: 'fontSizeState', default: 14,}); atom을 읽고 쓸 때는 useRecoilState라는 ..
Rust 공식 문서를 참고한 글입니다. 프로그램 흐름을 제어하는 방법은 특정 조건이 참일 때만 코드를 수행하거나 특정 조건을 만족하는 동안에만 코드를 수행하도록 하는 것이다. 이를 구현하는 방법이 if 와 loops를 사용하는 것이다. 1. if 표현식if 표현식은 조건에 따라서 코드를 분기할 수 있게 한다. fn main() { let number = 3; if number if 후에 조건을 붙여 조건문을 시작하고, number 이 5보다 작은지 확인한다. 조건을 만족하지 않으면 else 구문으로 처리된다. 이때 if 표현식을 arms라고 표현하는데, match 표현식과 유사하기 때문이다. 만약에, number fn main() { let number = 3; if numb..