목록전체 글 (124)
지나공 : 지식을 나누는 공간
그리디 알고리즘이란? 현재 시점에서의 최적의 선택을 하는 알고리즘입니다. 전체 시점에서는 그게 가장 좋은 답이 아닐 수 있습니다. 매 시점마다 당장 그 시점에서의 최선의 답을 찾는 방식이기 때문입니다. 아래 그림에서 거치는 노드의 숫자 합이 가장 큰 선택을 해야 한다고 합시다. 우리 입장에선 전체 노드가 보이기 때문에 당연히 왼쪽처럼 선택을 해야 숫자 합이 0+3+100 = 103이 되므로 최적의 선택이 된다는 걸 압니다. 하지만 그리디한 선택은 당시에 위치하는 노드에서 바라볼 때 가장 큰 숫자로 가는 것이므로 오른쪽 그림처럼 선택하게 됩니다. 그리디한 선택을 한 결과(0+10+8 = 18)는 실제 최적의 답(103)보다 좋지 않은 답일 수 있습니다. 즉, 그리디 알고리즘에서 모든 선택이 최적의 선택과 ..
김영한 님의 자바 ORM 표준 JPA 프로그래밍 강의를 듣고 정리했습니다. JPA에서 가장 중요한 것이 '객체와 관계형 데이터베이스 매핑하는 것', 그리고 영속성 컨텍스트입니다. 영속성 컨텍스트를 알아기 전에 먼저 짚어야 할 개념들이 있습니다. EntityManagerFactory, EntityManager ? 데이터 요청이 들어올 때마다 EntityManagerFactory는 EntityManager를 생성하고, 이 EntityManager는 데이터베이스커넥션을 활용해서 DB에 접근하여 요청사항을 처리합니다. EntityManager 사용 EntityManager를 사용해 봅시다. resources 폴더 안에 있는 persistence.xml 파일에서 persistence-unit name은 JPA를 ..
JPA란? - Java Persistence API, 자바 진영의 ORM 기술 표준 - 인터페이스의 모음으로 Hibernate, EclipseLink, DataNucleus의 구현체 ORM이란? Object-relational mapping, 객체 관계 매핑으로, 객체는 객체대로 설계하고 관계형데이터베이스는 관계형데이터베이스로 설계하면 orm 프레임워크가 중간에서 매핑하는 방식임. JPA와 CRUD - 마치 java 컬렉션에 넣은 채 쓰는 듯한 편리함! - 저장 : jpa.persist(member) //영구저장한다는 의미 - 조회 : Member member = jpa.find(memberId) - 수정 : member.setName("변경할 이름") - 삭제 : jpa.remove(member) 패러..
Learn Git Branch의 내용을 참고하였습니다. HEAD HEAD는 현재 체크아웃된 커밋을 의미합니다. 즉, 현재 작업 중인 커밋으로 HEAD는 항상 작업트리의 가장 최근 커밋을 가리킵니다. 따라서, 작업트리에 변화를 주는 git 명령어들은 대부분 HEAD를 변경하는 것으로 시작합니다. 왼쪽 사진은 master 뒤에 HEAD가 있는 상태이고, 여기서 git checkout C1을 하면 오른쪽처럼 C1에 HEAD가 있게 됩니다. Relative Ref - 상대참조 상대참조를 통해 브랜치에서 출발하여 다른 지점에 도달하고 거기서 작업을 할 수 있습니다. ^연산자 ^는 한 번에 한 커밋 위로 움직이는 연산자(HEAD가 한 커밋 위로 이동)이고, ~은 한 번에 여러 커밋 위로 올라가는 연산자입니다. 예를..
김영한 님의 자바 orm 표준 jpa 프로그래밍 기본편 강의를 통해 공부한 내용입니다. ORM이란, Object(객체)와 Relation(관계)를 Mapping(연결)한다는 개념으로, ORM을 이용한 개발은 객체와 데이터베이스 변형에 유연하게 대처할 수 있도록 한다. 객체 지향 프로그래밍 입장에서 관계형 데이터베이스의 제약을 받지 않으면서 관계형 데이터베이스 자체를 객체처럼 쉽게 표현하고 사용하기 위한 개념이다. SQL 중심적인 개발의 문제점 : CRUD 의 무한한 반복으로 지루한 코드 생성 객체와 관계형 데이터베이스의 차이 : 상속, 연관관계, 데이터타입, 데이터 식별 방법 -> 객체는 FK로 참조가 불가능하지만 테이블은 연관관계를 통해 참조가 가능하다. [jpa없이 java에서 sql을 직접 다루면 ..
윈도우 기준입니다. [Gradle] Ctrl + Space : compile 메소드에 라이브러리 이름 일부에를 적고 해당 라이브러리 목록 확인할 때 사용 [인텔리제이 기능] Ctrl + Shift + A : Action 검색창 ( share on github 등을 검색할 수 있음) [깃허브] Ctrl + K : commit 창 열기 [실행] Debug -> shift + F9 Run -> shift + F10 [검색] Ctrl + F : 현 파일 내에서 검색 Ctrl + shift + F : 전체 파일 내에서 검색 Ctrl + Alt + V : builder로 객체 생성 시 객체 선언 없이 builder로 쭉 쓴 후에 단축키 클릭하면 자동으로 객체생성문 완성 Ctrl + E : 최근 열었던 파일 Ctrl..
본 포스팅은은 Learn Git Branching의 내용을 참고했습니다. git의 구조 밑줄 친 문장은 실제 명령어입니다. commit commit은 변경이나 추가를 할 때마다 변경사항을 저장소에 기록하는 스냅샷입니다. 처음에 c1이 있는데 이에 대해 변경을 하고 git commit을 하면 c1을 부모로 하는 새 커밋 c2가 생깁니다. branch 브랜치는 특정 커밋에 대한 참조인데, 많이 만들어도 메모리나 디스크 공간에 부담이 안 됩니다. git branch newImage라는 명령을 통해 진행중이던 내용에 대해 branch를 만들 수 있습니다. 만들기만 하고 branch 위치에서 commit을 안하면 같은 commit에 대한 branch만 존재하는, 아래와 같은 모습이 됩니다. 브랜치와 마스터 둘 다..
c언어에서는 보통 strcmp를 이용해서 문자열 두 개를 비교하지만, c++에서는 어떤 string내에서 원하는 string이 존재하는 지, 그 위치를 반환하는 함수를 사용할 수 있다. find() 함수이다.
https://programmers.co.kr/learn/courses/30/lessons/42578 코딩테스트 연습 - 위장 programmers.co.kr 1. 실패한 첫 번째 풀이 next_permutation을 통해 직접 조합을 만들어서 answer에 개수를 더했지만 조합을 만드는 과정에서 시간 초과가 났다. #include using namespace std; int mix_kind(vectorkinds, int i); int solution(vector clothes) { int answer = 0; vectorkinds; kinds.push_back(make_pair(clothes[0][1], 1)); for (int i = 1; i < clothes.size(); i++) { bool is..
BFS로 풀었고, 난이도는 그렇게 어렵지 않지만 문제 풀이 절차를 잘 파악해야 하는 문제라고 생각합니다. 문제출처 https://www.acmicpc.net/problem/14502 14502번: 연구소 인체에 치명적인 바이러스를 연구하던 연구소에서 바이러스가 유출되었다. 다행히 바이러스는 아직 퍼지지 않았고, 바이러스의 확산을 막기 위해서 연구소에 벽을 세우려고 한다. 연구소는 크� www.acmicpc.net 저는 함수를 사용해서 복잡한 풀이 절차를 나눴습니다. 전체적인 풀이 방식 처음 입력 받은 배열(origin)을 다른 배열(map)에 복사하고, map에서 매번 다른 위치에 3개의 벽을 설치한 뒤 바이러스를 퍼뜨려 보면서 안전지대 크기를 비교합니다. 1. 맨 처음 배열을 origin에 저장하고 0..