일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- dijkstra
- 1261
- 짝지어제거하기
- Java
- NLP
- 알고리즘
- 자바
- 백준 1339
- 머신러닝
- 알렉스넷
- 백준 1916 자바
- 논문리뷰
- cs231n
- 백준 1339 자바
- 3745
- MachineLearning
- 다익스트라
- 논문
- 논문구현
- 관심사분리
- 백준9095
- 디미터법칙
- deeplearning
- 1916
- 딥러닝
- 1107번
- 백준
- GPT
- Alexnet
- 클린코드
- Today
- Total
목록전체 글 (38)
산 넘어 산 개발일지
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/pLbPx/btq1WKIJWMn/wZZ0KrPKD9c5gDsyJZAcFk/img.png)
풀이 키워드 그리디 알고리즘 단어의 합의 최댓값을 구하기 위해서는 (1. 가장 많이 나오고) (2. 가장 높은 자리에 위치) 한 순서대로 가장 높은 숫자를 부여하면 된다. 그때 그때 가장 최선의 경우를 구해야 하므로 그리디 알고리즘임을 쉽게 알 수 있다. 따라서 우리는 가장 많이 나오고 가장 높은 자리에 위치한다는 것을 어떻게 정할지만 정하면 된다. 문자를 수로 치환하여 가장 큰 값을 찾아야 하므로, 각 문자마다 위치한 수의 자리에 따라 가중치를 정해서 더해주면 된다. 예를 들어, AAA, ACDEB 가 있다고 해보자. AAA A는 100의 자리, 10의 자리, 1의 자리에 해당하는 가중치를 가진다. 따라서 A += 100 + 10 + 1 ACDEB ACDEB = 10000 + 1000 + 100 + 1..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bb43PW/btq1U84as7f/BFMRRUFrNiTQ0htFDe68Uk/img.png)
풀이 키워드 브루트포스 DFS N과 M의 크기가 크지 않고, 이것 저것 다양하게 시도해보아야 해서 브루트포스로 풀어야 한다는 것을 알 수 있다. 문제에 나온 그대로 푼다면 DFS 함수를 정의하여 각 위치를 입력받은 뒤, 도형 모양대로 값을 계산해보면 된다. 그러나 이렇게 할 경우, 중복되는 경우의 수가 많이 생기고, 코드가 너무 길어질 것 같았다. 그래서 DFS로 한점 한점 탐색하며 탐색한 크기가 4가 되는 경우 현재까지의 값을 max와 비교하여 최대의 크기를 찾는 방법을 사용했다. 다만, 이 경우에도 중복이 생길 수 있으므로 DFS함수 안에서 다음 위치로 뻗어 나갈 때, 위로는 뻗어나가지 않도록 설정했다. 즉 빨간색 점에서 위로는 못 가고, 초록색 부분으로만 뻗어나갈 수 있는 것이다. 이렇게 해도 여전..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/slywP/btq1zsO6htw/k0CU7T51rxGM1572eqUIv0/img.png)
풀이 키워드 DP 숫자들을 사용해 나가는 DP 문제는 대부분 이전 숫자들을 이용하는 것이 많다. 즉 dp[i]를 구하기 위해서는 dp[i-1] 이나 dp[i-2] 등을 이용하는 것이다. 이번 문제도 크게 다르지 않았다. 먼저, 이번 문제의 특별한 숫자들로는 1, 2, 3이 있다. 이 숫자들을 사용해 앞으로의 숫자들에 대한 덧셈 식을 구현하는 것이다. 따라서, 먼저 이 숫자들이 몇 개의 덧셈식을 가지고 있는지를 계산해놓자. dp[1] = 1 (1) dp[2] = 2 (1+1, 2) dp[3] = 4 (1+1+1, 1+2, 2+1, 3) 이제 4를 보자. 4는 문제에 나와있듯이 7개의 덧셈식이 존재한다. 1+1+1+1 1+1+2 1+2+1 2+1+1 2+2 1+3 3+1 이를 맨 뒤 숫자만 제외하고, 될 수..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/dgJYHD/btq1nJdGGhD/GtCpK9QMhgCaqVjnpulSS1/img.png)
Kaggle Competition 주소 : www.kaggle.com/c/santander-customer-transaction-prediction/overview Santander Customer Transaction Prediction Can you identify who will make a transaction? www.kaggle.com Clone할 Kaggle code 출처 : www.kaggle.com/gpreda/santander-eda-and-prediction/notebook Santander EDA and Prediction Explore and run machine learning code with Kaggle Notebooks | Using data from Santander Cu..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/x6KuT/btqZ9BAyzyl/sM2gjg5dgZk3hqDxXDrwnk/img.png)
창발성 : 창발또는 떠오름 현상은 하위 계층에는 없는 특성이나 행동이 상위 계층에서 자발적으로 돌연히 출현하는 현상이다. 왜 이번 챕터의 제목이 창발성인지는 잘 모르겠다. 전체적으로 내용은 코드를 단순하게 하기 위한 내용을 요약한 것이었다. 주로 지금까지 한 내용을 다시 간결하게 되짚어 보는 단계인 것 같다. 굳이 창발성과 관련이 있는 것이라면 TEMPLATE METHOD 정도가 아닌가 싶다. 단순한 코드 법칙 모든 테스트를 실행한다. "테스트가 가능한 시스템" 테스트가 가능한 시스템을 만드는 과정 속에서 자연스럽게 소프트웨어의 품질도 높아진다. 테스트가 가능해야 검증이 가능하다. 낮은 결합도 + 높은 응집도 결합도는 낮춤으로써 테스트와 유지보수에 용이하도록 설계하고, 응집도는 높인다. SRP 지키기, ..
시스템에서 가장 중요한 것은 유지보수이다. 유지보수에 가장 중요한 것은 영역(도메인)간의 분리이다. 따라서 우리는 코딩을 할 때 각 모듈들이 서로에게 끼치는 영향을 최소화 할 수 있도록 코드를 짜야 하고, 이를 위해서 등장한 여러 기법들을 알 필요가 있다. 주요 내용 관심사 분리 애플리케이션이나 클래스와 같은 모듈이 하나의 관심사만 가지도록 분리하는 것(SRP와 비슷) 이 관심사의 영역을 뚜렷하게 나누면 서로의 영역에 영향을 주지 않으므로 내가 원하는 부분만 수정할 수 있어서 Main 분리 객체나 모듈의 생성과 관련된 코드는 모두 main 혹은 main에서 호출하는 모듈이 담당한다. 즉 시스템의 다른 모듈에서는 모든 객체가 이미 생성되었고 의존성이 연결되어 있다고 가정하는 것이다. 추상 팩터리 패턴 나머..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/ef4lJh/btqZefY0dov/oRzKBzuBKIzNKoskXs8mS0/img.jpg)
객체지향 프로그래밍의 중심은 당연히 클래스이다. 클래스를 얼마나 체계적으로, 그리고 깔끔하게 설계하느냐에 따라서 코드의 품질을 따질 수 있다고 생각한다. 객체지향에서, 특히 자바에서 클래스 설계 방식은 굉장히 다양하다. 그 중 이번 챕터에서 나온 것들만 지키려고 노력해도 충분히 깔끔한 코드가 나올 것 같다. 클래스 구성 구성 순서 static -> non-static public -> private 캡슐화 변수와 유틸리티 함수는 최대한 공개하지 않는 것이 좋다. 이 캡슐화를 깨는 것은 어디까지나 도저히 방법이 없을 때 최후의 수단으로 사용해야 한다. 다만 테스트 코드를 위해서는 protected 로 공개해줄 수도 있다. 책임 단일책임원칙 (SRP, Single Responsibility Principle..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/Fqiyg/btqY2sxL7Jq/RqDT3W8CDZeEzfpeyIGnIk/img.jpg)
TDD는 이미 자주 사용하는 개발 방식이라고 한다. 그만큼 그 가치를 사람들에게 인정 받았고, 개발자라면 항상 TDD로 개발하지는 않더라도 한 번쯤은 사용해봐야 한다고 생각한다. 그러나 Clean Code책에서 다룬 TDD 내용은 극소수에 불과했다. TDD를 따로 사용한 적이 없어 코드 리뷰는 생략했다. 올해 여름에 TDD책을 읽고 따로 정리를 할 예정이다. 포인트 TDD 법칙 실패하는 테스트를 작성할 때까지 실제 코드를 작성하지 않는다. 컴파일은 통과하면서 실행은 실패하는 정도로만 작성한다. 실제 코드는 현재 테스트를 통과할 정도로만 작성한다. 장점 실제 코드를 변경할 때 버그에 대한 두려움을 없애주므로 더 자유롭고 유연한 재사용성을 보장한다. 방식 given-when-then 형식 given : 테스..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bCCaRW/btqYLzjy88w/l8MFm0PqsiUbKzKSwxd3T1/img.jpg)
외부 API는 내가 필요한 기능을 쉽고 빠르게 만들 수 있도록 도와주기 때문에 안쓰이는 곳을 찾아보기 힘들다. 그러나 무분별한 사용은 내 프로그램을 외부 API에 지나치게 의존하도록 만들 여지가 있다. 그렇다고 아예 사용을 안할 순 없으니 정말 필요한 부분만 사용하되, 사용하는 부분도 내 프로그램과 호환이 잘 되도록 사용할 필요가 있다. 경계(혹은 경계 인터페이스)란 구현된 클래스 중 외부 API나 다른 클래스에서 사용하면서 그 내부 구조가 바뀌어 시스템 전체에 영향을 미칠 수 있는 부분을 말한다. 내 코드 돌아보기 학습 테스트의 부재 외부 API를 가져오면서 단순히 메서드에 대해서만 조사를 하고 그대로 사용했다. 외부 API에 대한 어떠한 학습 테스트도 거치지 않았으므로 이에 대한 높은 이해를 바탕으로..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/tmzca/btqXY0WXx2s/OFon8XBTG6XeFQsqldAX0K/img.jpg)
프로그래밍 초기 시절에는 간단한 연산을 위해 프로그램을 사용했으므로 절자 지향 프로그래밍이 대세였다. 그러나 점차 기업이나 정부와 같이 규모가 큰 영역에서도 프로그래밍이 사용되기 시작하자 절차 지향 프로그래밍만으로는 유지보수가 어려웠다. 이를 용이하게 하고자 객체별로 체계화한 것이 객체지향 프로그래밍이다. 그러나 단순히 객체만 사용한다고 해서 객체 지향 프로그래밍이라고 하기에는 무리가 있다. 객체간의 역할을 분명히 하고, 이후 유지보수가 쉽도록 코드를 짜는 것이 중요하다. 내 코드 돌아보기 1. get/set 함수 자료구조이므로 get/set함수 없이 그저 변수만 공개했다. 코틀린의 좋은 점인 것 같다. data class를 따로 제공함으로써 철저한 자료구조 클래스로만 사용하는 것을 강제한다. 2. 디미..