본문 바로가기

Algorithm

(45)
[Algorithm] 알고리즘 공부법 알고리즘을 잘 푸는 편은 아니지만, 나름의 공부법을 공유해보려고 합니다. 이 글은 코테를 통과하기 위한 입문 방법을 작성한 글입니다. ICPC 같은 대회가 목적이라면 다른 글을 읽으시는 것이 낫습니다. 시작하기 전에IDE를 선택합니다. 보통 IDE는 VSCode를 쓰면 무난하게 좋습니다. 사용법은 구글에 검색하시면 나옵니다. 코테를 공부할 언어를 선택합니다. 언어는 일반적으로 Java, python3, C/C++을 사용합니다.무조건 본인 직무에 맞는 언어로 코테를 응시할 수 있어야 합니다. 만약 Spring 백엔드 직무에 지원했으면 사용 언어를 Java로 제한할 수도 있습니다. 언어 제한이 없다면 python3를 쓰는 것이 무조건 이득입니다. 난이도도 쉽고 코딩 속도도 매우 빠릅니다.대회에 나가는게 아..
[Algorithm] 단계별로 풀어보기 레퍼런스 1-11 - 언어에 대한 이해만 있으면 해결 가능합니다.12 - 브루트포스13 - 정렬 알고리즘을 공부하는 것보다 언어에 내장된 정렬 기능을 사용합니다.14 - 맵,셋15 - 최대공약수(유클리드 호제법)- 소수(에라토스테네스의 체)16 - 스택,큐,덱17- 재귀(추가 예정)
[위클리 백준] 2024 5회 (2) - 18311 https://www.acmicpc.net/problem/18311 구현 문제 문제 설명 각 트랙의 길이를 배열에 저장하고, 배열을 순회하며 직접 달리는 것처럼 구현하면 됩니다. 또한 다시 돌아오는 것까지 생각해야 하므로 배열을 거꾸로 순회하는 과정도 추가해야 합니다. 현재 남은거리 K가 현재 트랙의 길이보다 짧으면 현재 트랙을 달리다가 멈추게 될 것이므로 현재 트랙 번호를 출력하고, 그렇지 않다면 남은 거리 K에서 트랙의 길이만큼 빼주면 됩니다. 주의할 점은 K의 범위가 나와 있지 않다는 점인데, 각 코스의 길이가 50,000이고 코스가 100,000개, 코스를 왕복해야 하므로 K의 범위는 [1, 10,000,000,000]입니다. 64비트 정수형으로 선언해야 합니다. 소스 코드 / Rust use s..
[위클리 백준] 2024 5회 (1) - 2476 https://www.acmicpc.net/problem/2476 문제 설명 분기문을 사용해서 문제에서 나온대로 작성하면 되는 문제입니다. 소스 코드 / Rust use std::io; fn get_max(a : i32, b : i32) -> i32 { if a > b { return a; } return b; } fn solve(input_string : &str) -> i32 { let toks = input_string.split_whitespace(); let mut vc : Vec = Vec::new(); for m in toks { vc.push(m.parse().unwrap()); } vc.sort(); if vc[0] == vc[1] && vc[1] == vc[2] { return 1000..
[BOJ 10993] 별 찍기 - 18 (OCaml) 구현 문제 근데 이제 Ocaml을 곁들인 https://www.acmicpc.net/problem/10993 문제 풀이 패턴이 일반적이지 않으므로 재귀를 떠올릴 수 있어야 합니다. 또한 별을 찍을 때는 무조건 2차원 배열에 특정한 패턴으로 찍는다는 생각으로 푸셔야 합니다. 우선 2차원 배열의 크기부터 계산해 보겠습니다. n h w 1 1 1 2 3 5 3 7 13 4 15 29 전체 크기를 측정하면 위와 같습니다. 규칙을 찾아 일반항을 도출하면 $h = 2^n -1, w = 2h - 1$입니다. 위는 n = 4인 경우입니다. 이제부터 빨간 부분은 밑변, 파란 부분은 첨점으로 표현하겠습니다. 또한 재귀를 사용하며, 다음 단계로 넘어갈수록(재귀가 깊어질수록) n이 작아지는 재귀로 문제를 풀이하겠습니다. w ..
[위클리 백준] 2024 4회 (2) - 2869 https://www.acmicpc.net/problem/2869 문제 설명 하루에 A만큼 올라가고 B만큼 내려가므로 하루에 (A-B)만큼 이동합니다. 그러나 항상 그렇지는 않고 마지막 날에는 -B만큼 갈 필요가 없습니다. 그러므로 이 문제는 $A+t(A-B) \geq V$가 되는 첫 시점 t를 구하는 문제입니다. 식을 이항하면 $t(A-B) \geq V-A$가 되고, 그런 t를 찾으려면 $V-A \over A-B$를 올림하면 됩니다. 마지막 날 A만큼 이동했다고 가정했으므로 t에 1을 더해주면 정답이 됩니다. 소스 코드 / Rust use std::io; fn main() { let mut input_string = String::new(); io::stdin().read_line(&mut input_..
[위클리 백준] 2024 4회 (1) - 23037 https://www.acmicpc.net/problem/23037 문제 설명 각 자릿수를 5번 곱한 후에 전부 더해주면 됩니다. 5자리 정수를 string으로 읽어서 각 자리를 int로 바꾸는 방법이 있고, int로 읽어서 10으로 나눈 나머지를 사용하는 방법이 있습니다. 저는 string에 익숙해지고자 전자를 택했습니다. 소스 코드 / Rust use std::io; fn pow_5(m : i32) -> i32 { return m*m*m*m*m; } fn main() { let mut input_string = String::new(); io::stdin().read_line(&mut input_string).unwrap(); input_string = String::from(input_string...
[위클리 백준] 2024 3회 - 9086 https://www.acmicpc.net/problem/9086 문제 설명 문자열의 0번째 char와 마지막 char을 출력하면 됩니다. 언어에 따라 접근 방식이 다른데, Java와 Rust 등에서는 char로 변환 후에 접근하면 되고 Python3와 C++ 등에서는 index로 접근 가능합니다. 소스 코드 / Rust use std::io; fn main() { let mut input_string = String::new(); io::stdin().read_line(&mut input_string).unwrap(); let mut n : i32 = input_string.trim().parse().unwrap(); while n > 0 { n -= 1; input_string.clear(); io:..