일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 자바
- 애자일기법
- 개발자
- Spring
- mongoDB
- 개발
- 데이터베이스
- cleancode
- database
- 클린코드
- Baekjoon
- API
- spring boot
- 프레임워크
- ES
- 코딩
- 애자일프로그래밍
- 그리디알고리즘
- 엘라스틱서치
- Java
- Elasticsearch
- 백준
- JPA
- 코딩테스트
- framework
- 그리디
- 읽기쉬운코드
- 알고리즘
- 코드
- 스프링
- Today
- Total
목록분류 전체보기 (182)
튼튼발자 개발 성장기🏋️

[왜 Clean Code?] 로직을 기가 막히게 짜고, 문제해결 능력이 뛰어난다고 한들 해당 코드가 쉽게 읽히지 않는다면 그것은 좋은 코드일까? 약 9년 동안 코딩을 하면서 단 한 번도 "읽기 쉬운 코드"에 대해 생각해본 적이 없다. 대학생 때 까지만 해도 나는 다음 리스트를 만족하는 코드가 좋은 코드라고 생각했다. 예외 처리가 잘 된 코드 메모리를 절약한 코드 각 언어 특성을 잘 이용한 코드 운좋게 취업에 성공하고 "학생"이 아닌 "개발자"로서 꽃이 필 무렵 주석과 변수 혹은 Object 명, 함수명 등과 같은 네이밍 이야기를 할 수 있는 기회를 얻었다. 나의 팀장님께서는 이렇게 말씀 하셨다. "가장 좋은 코드는 주석이 없고 변수 명만 봐도 뭐하는 녀석인지 알 수 있는 코드야." 위 조건을 만족하면서 ..

문제 기출 : [https://www.acmicpc.net/problem/1080] 풀이 방법 [그리디 알고리즘] 접근 나는 본 문제 풀이에 실패했다. 만약 성공적인 풀이를 원한다면 (Alt + ←) 꾹 눌러도 좋다. 주어진 A행렬과 B행렬의 핼과 열의 수가 적어도 3이상이어야 하기 때문에 3미만이면 -1 출력 후 종료. 주어진 A행렬과 B행렬을 비교한다. 만약 값이 서로 다르면 1, 같으면 0으로 세팅한 C행렬을 만들었다. 만약 C행렬의 모든 값이 0이면 A와 B가 동일하므로 0 출력 후 종료. C의 행렬을 모두 0으로 만들어 주기 위한 연산의 수를 구하는 것이 우리의 목표다. 그러기 위해 3by3 행렬로 잘라서 행렬연산을 해보자. 뒤집으면 count를 세어준다. 만약 한 번밖에 연산을 하지 못하는데(..

문제 기출 : [https://www.acmicpc.net/problem/10610] 풀이 방법 [그리디 알고리즘] 접근 30의 배수들의 특징을 알면 쉽게 접근 가능하다. '0'이 하나라도 있고 각 자리수의 합이 3의 배수이면 (3x10=30 이니까) 30의 배수라고 할 수 있다. 당연하게도 0으로 끝나야 하기 때문에 주어진 N에 '0'이 없으면 불가능하므로 바로 -1을 출력하고 종료하자. 주어진 N을 각각 자리수 별로 나누어 모두 더한 후 이 값이 3으로 나누어 떨어지지 않으면 바로 -1을 출력하고 종료하자. 문제에서 최대값을 원하고 있다. 그렇다면 sort하고 고대로 출력하면 끝. 문제 풀이 public class Main { public static void main(String[] args) { ..

문제 기출 : [https://www.acmicpc.net/problem/1049] 풀이 방법 [그리디 알고리즘]으로 접근 낱개의 가격과 6개세트의 가격을 별도로 array에 담는다. 그리고 각각의 가격에서 최소 값이면서 끊어진 라인의 수보다 크거나 같으면 된다. 최소값을 먼저 만족시키기위해 오름차순으로 sort 진행해서 가장 작은 0번째 값으로 먼저 체크하면 최대한 빠르게 찾을 수 있다. 문제 풀이 public class Main { public static void main(String[] args) { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int answer = 0; try { StringTokenizer..
앞 소개 게시글 에서 언급했 듯이, Packages와 Crates는 라이브러리와 실행 파일을 만들어주는 녀석들이다. crate는 바이너리 혹은 라이브러리이다. crate root는 crate를 빌드할 때 사용되는 소스 파일이다. package는 Crates를 빌드하는 방법을 설명하는 Cargo.toml를 가지고 있다. package의 crate는 하나의 라이브러리가 될 수 있다. (아직 감이 잘 오지 않는다...) 우리가 처음 Cargo를 사용했을 때를 기억해보자... [cargo new] command를 사용했었다. 그렇게 프로젝트를 생성을 했었다. 여기서 생각해야할 것은 생성된 프로젝트에 package가 생겼다는 것. 왜? Cargo가 Cargo.toml파일을 만들었기 때문. 이상하게도 Cargo.t..
러스트는 특수하게(?)도 "모듈 시스템"이라는 것을 제공하는데 scope와 관련된 많은 기능들을 말한다. 추가로 다음과 같은 모듈을 포함한다. Packages는 빌드, 테스트, 공유할수 있도록 해주는 Cargo 기능이다. Crates는 라이브러리나 실행파일을 생성하는 모듈 트리다. Modules는 scope와 privacy 정보(구조체, 함수, 모듈 등의 네이밍을 이야기하는 것 같다.)를 제어할 수 있다. 이번 장이 끝나면 scope를 정의하고, 사용하며, export를 할 수 있다. (기대 중..ㅎㅎㅎㅎ)

panic! 매크로가 복구 불가능한 에러를 처리하기 위함이라면, 복구 가능한 에러 처리를 위한 녀석은 Result가 있다. enum Result { Ok(T), Err(E), } Result의 핵심!!! T와 E는 제네릭 타입 파라미터다. T는 성공한 후에 Ok variant 내에 반환될 값의 타입 E는 실패한 후에 Err variant 내에 반환될 에러 타입 파일을 가지고 오는 코드를 보자. use std::fs::File; fn main() { let file = File::open("hello.txt"); if file.is_ok() { println!("SUCCESS!!! : {:?} ", file.ok()); } else { println!("FAILE!!! : {:?}", file.err())..

러스트의 에러는 크게 두 가지로 나눈다. Recoverable Errors : 복구 가능한 에러 Unrecoverable Errors : 복구 불가능한 에러 복구 가능한 에러의 경우에는 사용자에게 문제를 이야기하고 해당 요청을 재시도 할 수 있도록 한다. 복구 불가능한 에러는 버그의 종류(?)로써, Index를 벗어난다거나, 0으로 나누려고 하는 경우 등과 같이 뻑(?)나는 경우를 이야기 한다. 1. panic! panic! 매크로가 실행되면, 프로그램은 실패 메시지를 출력하고, 스택 해제와 더불어, 정리하고 종료시킨다. panic! 응답으로 인한 중단 혹은 스택 해제 panic! 매크로가 실행되면, 프로그래램은 unwinding(해제)을 시작한다. 이것은 러스트가 panic!을 마주친 함수들로부터 스택..