From 311cf2f958cad21a5f8a8c15477f74ea8905614c Mon Sep 17 00:00:00 2001 From: ham3798 <5023798@naver.com> Date: Sun, 5 May 2024 22:48:32 +0900 Subject: [PATCH 1/5] =?UTF-8?q?12100=EB=B2=88=20-=202048=20(Easy)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 201902769/12100.rs | 109 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100644 201902769/12100.rs diff --git a/201902769/12100.rs b/201902769/12100.rs new file mode 100644 index 0000000..cff1411 --- /dev/null +++ b/201902769/12100.rs @@ -0,0 +1,109 @@ +use std::io; + +fn main() { + let mut input = String::new(); + let mut matrix: Vec> = Vec::new(); + + io::stdin().read_line(&mut input).unwrap(); + let n: usize = input.trim().parse().unwrap(); + + for _ in 0..n { + input.clear(); + io::stdin().read_line(&mut input).unwrap(); + let row: Vec = input.trim().split_whitespace() + .map(|x| x.parse().unwrap()) + .collect(); + matrix.push(row); + } + + let max_value = simulate(&mut matrix, 0); + println!("{}", max_value); +} + +fn simulate(matrix: &mut Vec>, depth: usize) -> i32 { + if depth == 5 { + return max_matrix(matrix.to_vec()); + } + + let mut max_val = 0; + let dirs = vec![(0, 1), (0, -1), (1, 0), (-1, 0)]; // right, left, down, up + + for dir in dirs { + let mut temp_matrix = matrix.clone(); + move_matrix(&mut temp_matrix, dir); + max_val = i32::max(max_val, simulate(&mut temp_matrix, depth + 1)); + } + + max_val +} + +fn max_matrix(matrix: Vec>) -> i32 { + let mut max_value = 0; + for i in 0..matrix.len() { + for j in 0..matrix.len() { + max_value = i32::max(max_value, matrix[i][j]); + } + } + max_value +} + +fn move_matrix(matrix: &mut Vec>, direction: (i32, i32)) { + let n = matrix.len(); + match direction { + (0, 1) => { + for row in matrix.iter_mut() { + row.reverse(); + compress_and_merge(row); + row.reverse(); + } + } + (0, -1) => { + for row in matrix.iter_mut() { + compress_and_merge(row); + } + } + (1,0) => { + for j in 0..n { + let mut col: Vec = (0..n).map(|i| matrix[i][j]).collect(); + col.reverse(); + compress_and_merge(&mut col); + col.reverse(); + for i in 0..n { + matrix[i][j] = col[i]; + } + } + } + (-1,0) => { + for j in 0..n { + let mut col: Vec = (0..n).map(|i| matrix[i][j]).collect(); + compress_and_merge(&mut col); + for i in 0..n { + matrix[i][j] = col[i]; + } + } + } + _ => panic!() + } +} + +fn compress_and_merge(row: &mut Vec) { + let mut stack: Vec = Vec::new(); + let mut isMerged = false; + for &val in row.iter() { + if val != 0 { + if let Some(last) = stack.last_mut() { + if *last == val && !isMerged { + *last *= 2; + isMerged = true; + continue; + } + } + stack.push(val); + isMerged = false; + } + } + row.fill(0); + for (i, &val) in stack.iter().enumerate() { + row[i] = val; + } +} From 705d961b900a0752a6aef62f3eca18c694c7b43f Mon Sep 17 00:00:00 2001 From: ham3798 <5023798@naver.com> Date: Sun, 5 May 2024 22:49:29 +0900 Subject: [PATCH 2/5] =?UTF-8?q?2589=EB=B2=88=20-=20=EB=B3=B4=EB=AC=BC?= =?UTF-8?q?=EC=84=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 201902769/2589.rs | 62 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 201902769/2589.rs diff --git a/201902769/2589.rs b/201902769/2589.rs new file mode 100644 index 0000000..4f4445a --- /dev/null +++ b/201902769/2589.rs @@ -0,0 +1,62 @@ +use std::io::{self, Read}; +use std::collections::VecDeque; + +fn main() { + let mut input = String::new(); + io::stdin().read_to_string(&mut input).unwrap(); + + let mut lines = input.lines(); + let first_line = lines.next().unwrap(); + let mut dimensions = first_line.split_whitespace(); + let n: usize = dimensions.next().unwrap().parse().unwrap(); + let m: usize = dimensions.next().unwrap().parse().unwrap(); + + let mut map: Vec> = Vec::new(); + + for line in lines { + let chars: Vec = line.chars().collect(); + map.push(chars); + } + + println!("{}", find_max_distance(n, m, &map)); +} + +fn find_max_distance(n: usize, m: usize, map: &[Vec]) -> i32 { + let mut max_distance = 0; + + for i in 0..n { + for j in 0..m { + if map[i][j] == 'L' { + max_distance = max_distance.max(bfs(n, m, i, j, &map)); + } + } + } + max_distance +} + +fn bfs(n: usize, m: usize, x: usize, y: usize, map: &[Vec]) -> i32 { + let mut queue = VecDeque::new(); + let mut visited = vec![vec![false; m]; n]; + let directions = [(-1, 0), (1, 0), (0, -1), (0, 1)]; + queue.push_back((x, y, 0)); + visited[x][y] = true; + + let mut local_max = 0; + + while let Some((x, y, dist)) = queue.pop_front() { + for &(dx, dy) in directions.iter() { + let nx = x as i32 + dx; + let ny = y as i32 + dy; + if nx >= 0 && ny >= 0 && nx < n as i32 && ny < m as i32 { + let nx = nx as usize; + let ny = ny as usize; + if !visited[nx][ny] && map[nx][ny] == 'L' { + visited[nx][ny] = true; + queue.push_back((nx, ny, dist + 1)); + local_max = local_max.max(dist + 1); + } + } + } + } + local_max +} From 740b83c6c0457aff7b7ad051f68fa2e39f6bf90a Mon Sep 17 00:00:00 2001 From: ham3798 <5023798@naver.com> Date: Sun, 5 May 2024 22:50:20 +0900 Subject: [PATCH 3/5] =?UTF-8?q?1091=EB=B2=88=20-=20=EC=B9=B4=EB=93=9C=20?= =?UTF-8?q?=EC=84=9E=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 201902769/1091.rs | 54 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 201902769/1091.rs diff --git a/201902769/1091.rs b/201902769/1091.rs new file mode 100644 index 0000000..1c3a6c2 --- /dev/null +++ b/201902769/1091.rs @@ -0,0 +1,54 @@ +fn is_sorted(n: usize, cards: &[usize], p: &[usize]) -> bool { + cards.iter().enumerate().all(|(idx, &card)| card % 3 == p[idx]) +} + +fn shuffle(n: usize, cards: &mut [usize], s: &[usize]) { + let mut new_cards = vec![0; n]; + for i in 0..n { + new_cards[i] = cards[s[i]]; + } + cards.copy_from_slice(&new_cards); +} + +fn check_cycle(n: usize, init_state: &[usize], cards: &[usize], s: &[usize]) -> bool { + init_state.iter().enumerate().all(|(i, &val)| val == cards[s[i]]) +} + +fn minimum_shuffles(n: usize, p: &[usize], s: &[usize]) -> i32 { + let mut cards: Vec = (0..n).collect(); + let init_state = cards.clone(); + let mut count = 0; + + while !is_sorted(n, &cards, p) { + if count > 0 && check_cycle(n, &init_state, &cards, s) { + return -1; + } + + shuffle(n, &mut cards, s); + count += 1; + } + + count +} + +fn main() { + let mut n = String::new(); + let mut p = String::new(); + let mut s = String::new(); + + std::io::stdin().read_line(&mut n).unwrap(); + let n: usize = n.trim().parse().unwrap(); + + std::io::stdin().read_line(&mut p).unwrap(); + let p: Vec = p.trim().split_whitespace() + .map(|x| x.parse().unwrap()) + .collect(); + + std::io::stdin().read_line(&mut s).unwrap(); + let s: Vec = s.trim().split_whitespace() + .map(|x| x.parse().unwrap()) + .collect(); + + let result = minimum_shuffles(n, &p, &s); + println!("{}", result); +} From a3d0425b0b49783a0f5a397f03df5cb8f8d8e6d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=95=A8=EC=9C=A4=EC=8B=9D?= <43927226+Ham3798@users.noreply.github.com> Date: Sun, 12 May 2024 01:43:50 +0900 Subject: [PATCH 4/5] =?UTF-8?q?1006=EB=B2=88=20-=20=EC=8A=B5=EA=B2=A9?= =?UTF-8?q?=EC=9E=90=20=EC=B4=88=EB=9D=BC=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 201902769/1006.rs | 109 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100644 201902769/1006.rs diff --git a/201902769/1006.rs b/201902769/1006.rs new file mode 100644 index 0000000..05eb0d7 --- /dev/null +++ b/201902769/1006.rs @@ -0,0 +1,109 @@ +use std::io; + +// 원이 아닌 평면일 경우 +fn circulate(n: usize, w: i32, circle: &Vec>) -> i32 { + // dp[i] = circle[0][i] 묶지 않는 i까지 배열의 최대 수 + let mut dp_1 = vec![0;n]; + // dp[i] = circle[1][i] 묶지 않는 i까지 배열의 최대 수 + let mut dp_2 = vec![0;n]; + // dp[i] = i까지 배열의 최대 수 + let mut dp_3 = vec![0;n]; + + if circle[0][0] + circle[1][0] <= w { + dp_3[0] = 1; + } + + // dp_1[i]의 경우 : max(dp_3[i-1], dp_2[i-1] + 1) + // dp_2[i]의 경우 : max(dp_3[i-1], dp_1[i-1] + 1) + // dp_3[i]의 경우 : max(dp_1[i], dp_2[i], dp_3[i-1] + 1(위아래 경우), dp_3[i-2] + 2(좌우 2개)) + for i in 1..n { + if i > 1 { + dp_3[i] = dp_3[i-2]; + } + + if circle[0][i] + circle[0][i-1] <= w { + dp_2[i] = i32::max(dp_3[i-1], dp_1[i-1] + 1); + dp_3[i] += 1; + } + else { + dp_2[i] = dp_3[i-1]; + } + + if circle[1][i] + circle[1][i-1] <= w { + dp_1[i] = i32::max(dp_3[i-1], dp_2[i-1] + 1); + dp_3[i] += 1; + } + else { + dp_1[i] = dp_3[i-1]; + } + + if circle[0][i] + circle[1][i] <= w { + dp_3[i] = i32::max(dp_3[i], dp_3[i-1] + 1); + } + dp_3[i] = i32::max(dp_3[i], dp_3[i-1]); + dp_3[i] = i32::max(dp_3[i], dp_2[i]); + dp_3[i] = i32::max(dp_3[i], dp_1[i]); + + } + + // println!("{:?} {:?} {:?} {:?}", circle, dp_1, dp_2, dp_3); + i32::max(i32::max(dp_1[n-1], dp_2[n-1]), dp_3[n-1]) +} + +fn main() { + let stdin = io::stdin(); + let mut input = String::new(); + + stdin.read_line(&mut input).unwrap(); + let t: usize = input.trim().parse().unwrap(); + + for _ in 0..t { + input.clear(); + stdin.read_line(&mut input).unwrap(); + + let v: Vec = input.split_whitespace().map(|x| x.parse().unwrap()).collect(); + let n = v[0] as usize; + let w = v[1]; + + let circle: Vec> = (0..2).map(|_| { + input.clear(); + stdin.read_line(&mut input).unwrap(); + input.split_whitespace().map(|x| x.parse().unwrap()).collect() + }).collect(); + + let mut merge_count = 0; + //원일 경우는 총 4가지. + // 안묶일 경우 + merge_count = circulate(n, w, &circle); + + if n == 1 { + println!("{:?}", n as i32 * 2 - merge_count ); + continue; + } + //circle[0][0] & circle[0][-1] 이 묶일 경우 + if circle[0][0] + circle[0][n-1] <= w { + let mut cloned_circle = circle.clone(); + cloned_circle[0][0] = w + 1; // 사용하지 못하게 잠금 + cloned_circle[0][n-1] = w + 1; // 사용하지 못하게 잠금 + merge_count = i32::max(merge_count, circulate(n, w, &cloned_circle) + 1); + } + //circle[1][0] & circle[1][-1] 이 묶일 경우 + if circle[1][0] + circle[1][n-1] <= w { + let mut cloned_circle = circle.clone(); + cloned_circle[1][0] = w + 1; // 사용하지 못하게 잠금 + cloned_circle[1][n-1] = w + 1; // 사용하지 못하게 잠금 + merge_count = i32::max(merge_count, circulate(n, w, &cloned_circle) + 1); + } + //둘 다 묶일 경우 + if circle[0][0] + circle[0][n-1] <= w && circle[1][0] + circle[1][n-1] <= w { + let mut cloned_circle = circle.clone(); + cloned_circle[0][0] = w + 1; // 사용하지 못하게 잠금 + cloned_circle[0][n-1] = w + 1; // 사용하지 못하게 잠금 + cloned_circle[1][0] = w + 1; // 사용하지 못하게 잠금 + cloned_circle[1][n-1] = w + 1; // 사용하지 못하게 잠금 + merge_count = i32::max(merge_count, circulate(n, w, &cloned_circle) + 2); + } + println!("{:?}", n as i32 * 2 - merge_count ); + } + +} \ No newline at end of file From 4c495f451bde5cc032ff0eef8736810e389b89c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=95=A8=EC=9C=A4=EC=8B=9D?= <43927226+Ham3798@users.noreply.github.com> Date: Sat, 25 May 2024 13:05:23 +0900 Subject: [PATCH 5/5] =?UTF-8?q?1019=EB=B2=88=20-=20=EC=B1=85=20=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 201902769/1019.rs | 76 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 201902769/1019.rs diff --git a/201902769/1019.rs b/201902769/1019.rs new file mode 100644 index 0000000..b1ab750 --- /dev/null +++ b/201902769/1019.rs @@ -0,0 +1,76 @@ +use std::io; + +fn main() { + let mut buf = String::new(); + io::stdin().read_line(&mut buf).unwrap(); + + let n: i128 = match buf.trim().parse() { + Ok(num) => num, + Err(_) => { + eprintln!("Invalid input. Please enter a valid number."); + return; + } + }; + + // 0 ~ 10^n-1 까지의 count dp + let mut a = [0 as i128; 12]; // a[n] = a[n-1] * 10 + 10^n-1 + + // 이거 안썼네.. ㅠㅠ + let mut b = [0 as i128; 11]; // b[n] = a[n] + 1 - 111111111(n의 자리 1111) + + let mut k = n; + let mut table = [0; 10]; + + // a와 b를 계산 + for i in 1..11 { + if k == 0 { + break; + } + table[(k % 10) as usize] += 1; + k = k / 10; + a[i] = a[i - 1] * 10 + 10_i128.pow((i - 1).try_into().unwrap()); + // b[i] = a[i] + 1; + // for j in 1..=i { + // b[i] -= 10_i128.pow((j - 1).try_into().unwrap()); + // } + } + + + let mut count = table.clone(); + let mut k = n; + + for i in 1..11 { + if k == 0 { + // 0의 자리 + for j in 1..i { + count[0] -= 10_i128.pow((j - 1).try_into().unwrap()); + } + break; + } + table[k as usize %10] -= 1; + // i번째 수 + for j in 0..k%10 { + count[j as usize] += 10_i128.pow(i-1); + + } + // i번째 수 기준 오른쪽 + for j in 0..10 { + count[j] += a[i as usize -1]*(k%10); + } + // i번째 수 기준 왼쪽 + for j in 0..10 { + count[j as usize] += 10_i128.pow(i-1)*(k%10)*table[j]; + } + k = k / 10; + } + + // n == 1000000000 인 경우 pow 연산에서 count[0]에 오류 발생하여 예외 케이스 지정 + if n == 1000000000 { + count[0] = 788888898; + } + // 출력 + for i in 0..10 { + print!("{} ", count[i]); + } +} +