Category: Develop

0

프로그래머스 - 로또의 최고 순위와 최저 순위 Java

문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/77484 프로그래머스 - 로또의 최고 순위와 최저 순위 Cpp 프로그래머스 - 로또의 최고 순위와 최저 순위 Java 프로그래머스 - 로또의 최고 순위와 최저 순위 Python class Solution { private int findScore(int value) { if (value == 6) { return 1; } else if (value == 5) { return 2; } else if (value == 4) { return 3; } else if (value == 3) { return 4; } else if (value == 2) { return 5; } else { return 6; } } private int[] cmpStrings(int[] lottos, int[] win_nums) { int[] result = new int[2]; int length = lottos.length; int zeroCnt = 0; int sameCnt = 0; for (int i = 0; i < length; i++) { if (lottos[i] == 0) { zeroCnt++; continue; } for (int j = 0; j < length; j++) { if (lottos[i] == win_nums[j]) { sameCnt++; } } } result[0] = findScore(sameCnt + zeroCnt); result[1] = findScore(sameCnt); return result; } public int[] solution(int[] lottos, int[] win_nums) { int[] answer = new int[2]; answer = cmpStrings(lottos, win_nums); return answer; }}

0

프로그래머스 - 로또의 최고 순위와 최저 순위 Cpp

문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/77484 프로그래머스 - 로또의 최고 순위와 최저 순위 Cpp 프로그래머스 - 로또의 최고 순위와 최저 순위 Java 프로그래머스 - 로또의 최고 순위와 최저 순위 Python #include <bits/stdc++.h>using namespace std;int findScore(int value) { if (value == 6) { return 1; } else if (value == 5) { return 2; } else if (value == 4) { return 3; } else if (value == 3) { return 4; } else if (value == 2) { return 5; } else { return 6; }}vector<int> cmpString(vector<int>& lottos, vector<int>& win_nums) { vector<int> result; int zeroCnt = 0; int sameCnt = 0; for (int i = 0; i < 6; i++) { if (lottos[i] == 0) { zeroCnt++; continue; } for (int j = 0; j < 6; j++) { if (lottos[i] == win_nums[j]) { sameCnt++; } } } result.push_back(findScore(sameCnt + zeroCnt)); result.push_back(findScore(sameCnt)); return result;}vector<int> solution(vector<int> lottos, vector<int> win_nums) { vector<int> answer; answer = cmpString(lottos, win_nums); return answer;}

0

프로그래머스 - 키패드누르기 Cpp

문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/77484 프로그래머스 - 키패드누르기 Cpp 프로그래머스 - 키패드누르기 Python #include <iostream>#include <map>#include <queue>#include <string>#include <vector>using namespace std;bool isLeft(int number) { if (number == 1 || number == 4 || number == 7) { return true; } return false;}bool isRight(int number) { if (number == 3 || number == 6 || number == 9) { return true; } return false;}bool isMiddle(int number) { if (number == 2 || number == 5 || number == 8 || number == 0) { return true; } return false;}string solution(vector<int> numbers, string hand) { string answer = ""; map<int, pair<int, int>> keypad; keypad[1] = {0, 0}, keypad[2] = {0, 1}, keypad[3] = {0, 2}; keypad[4] = {1, 0}, keypad[5] = {1, 1}, keypad[6] = {1, 2}; keypad[7] = {2, 0}, keypad[8] = {2, 1}, keypad[9] = {2, 2}; keypad[0] = {3, 1}; pair<int, int> left_point = {3, 0}; pair<int, int> right_point = {3, 2}; cout << keypad[2].first << " " << keypad[2].second << endl; for (int number : numbers) { if (isLeft(number)) { left_point = keypad[number]; answer.append("L"); } if (isRight(number)) { right_point = keypad[number]; answer.append("R"); } if (isMiddle(number)) { pair<int, int> key_point = keypad[number]; int left_dist = abs(key_point.first - left_point.first) + abs(key_point.second - left_point.second); int right_dist = abs(key_point.first - right_point.first) + abs(key_point.second - right_point.second); if (left_dist == right_dist) { if (hand == "right") { right_point = keypad[number]; answer.append("R"); } else { left_point = keypad[number]; answer.append("L"); } } else if (left_dist < right_dist) { left_point = keypad[number]; answer.append("L"); } else { right_point = keypad[number]; answer.append("R"); } } } return answer;}

0

Java - Collection Framework

Java - Collection FrameworkStack 먼저 들어간 데이터가 가장 마지막에 나오는 구조 (First In First Out) 메서드 설명 void push(E e) stack 최상단에 데이터를 추가한다. Element pop() stack 최상단 데이터를 반환한 후 스택 최상단 데이터를 삭제한다. Element peek() stack 최상단 데이터를 반환한다. boolean isEmpty() stack 이 비어있는지 확인한다. int size() stack 의 크기를 반환한다. Queue 메서드 설명 boolean add(E e) Queue 맨 뒤에 데이터를 추가한 후 정상적으로 수행했으면 True, 데이터 삽입에 실패하면 False 를 반환한다. Queue 에 여유 공간이 없어 실패한 경우 IllegalStateException 예외를 발생 시킨다. boolean offer(E e) Queue 맨 뒤에 데이터를 추가한 후 정상적으로 수행했으면 True, 데이터 삽입에 실패하면 False 를 반환한다. E element() Queue 맨 앞의 원소를 반환한다. E peek( ) Queue 맨 앞의 원소를 반환한다. Queue 가 비어있을 경우 null 을 반환한다. E poll( ) Queue 맨 앞의 원소를 반환한 후 삭제한다. Queue 가 비어있을 경우 null 을 반환한다. E remove() Queue 맨 앞의 원소를 삭제한다.

0

Java - Collection Framework

Java - Collection FrameworkList 컬랙션 List 컬랙션은 객체를 일렬로 늘여 놓은 구조 를 가지고 있다. 객체를 인덱스로 관리하기 때문에 객체를 저장하면 인덱스가 부여되고 해당 인덱스를 이용해 검색, 삭제를 할 수 있다. List 컬랙션에서는 객체 자체를 저장하는 게 아니라 객체의 번지를 참조한다. 동일한 객체를 중복 저장할 수 있다. 대표적인 구현체로는 ArrayList, Vector, LinkedList 등이 있다. 메서드 설명 boolean add(E e) List 맨 끝에 데이터를 추가한 후 정상적으로 저장되면 true 실패하면 false 를 반환한다. void add(int index, E element) 주어진 인덱스 위치에 데이터를 추가한다. set(int index, E element) 주어진 인덱스 위치에 저장된 데이터를 변경한다. boolean contains(Object o) 주어진 데이터가 List에 있는지 확인한다. E get(int index) 주어진 인덱스에 저장된 데이터를 반환한다. isEmpty() List 에 데이터가 있는지 확인한다. int size() List 에저장 돼 있는 데이터의 전체 크기를 반환한다. E remove(int index) 주어진 인덱스에 위치한 데이터를 삭제한다. void clear() List 에 저장돼 있는 모든 원소들을 삭제한다. boolean remove(Object o) List 에서 전달받은 데이터에 해당 하는 모든 원소를 삭제한다. Set 컬랙션 저장 순서가 유지되지 않기 때문에 Index 가 존재하지 않는다. 대신, Iterator 를 이용해 Set 에 저장된 데이터를 가져올 수 있다. 객체를 중복해서 저장할 수 없고, 하나의 null 만 저장할 수 있다. 대표적인 구현체로는 HashSet, TreeSet 이 있다. 메서드 설명 boolean add(E e) 데이터를 Set 에 저장한 후 정상적으로 저장되면 true를 중복 객체면 false 를 반환합니다. boolean contains(Object o) 객체가 저장돼 있는지 여부를 리턴합니다. Iterator iterator() 저장된 객체를 한번씩 가져오는 반복자를 반환한다. isEmpty() Set 이 비어있는지 조사합니다. int Size() Set 에 저장돼 있는 전체 객체수를 리턴합니다. void clear() Set 에 저장된 모든 객체를 삭제 boolean remove(Object o) Set 에 저장된 주어진 객체를 삭제합니다. Map 컬랙션 Key, Value 형식 으로 데이터를 관리하는 자료구조 키는 중복 저장될 수 없지만 값은 중복 저장될 수 있다. 기존에 저장된 키와 동일한 키로 값을 저장하면 새로운 값으로 대체된다. 대표적인 구현체로는 HashMap, HashTable, LinkedHashMap, TreeMap 등이 있다. 메서드 설명 V put(K Key, V value) Map 에 주어진 키와 값을 추가해 저장되면 해당 값을 리턴합니다. boolean containsKey(Object Key) Map 에 주어진 키 가 있는지 확인합니다. boolean containsValue(Object value) Map 에 주어진 값 이 있는지 확인합니다. Set<Map.Entry<K,V>> entrySet() 모든 Map.Entry 객체를 Set에 담아 리턴합니다. Set keySet() 모든 키를 Set 객체에 담아서 리턴합니다. V get(Object key) 주어진 키에 해당하는 값을 리턴합니다. boolean isEmpty() Map 이 비어있는지 조사합니다. int Size() Map 에 저장돼 있는 전체 객체의 수를 리턴합니다. Collection values() Map 에 저장된 모든 값을 Collection 객체에 담아서 리턴합니다. void clear() 저장된 모든 Map.Entry를 삭제합니다. V remove(Object Key) 주어진 키와 일치하는 Map.Entry를 삭제하고 값을 리턴합니다.

0

JPA Entity - 기본키 매핑

목차 JPA Entity - 테이블 매핑 JPA Entity - Column 매핑 JPA Entity - 기본키 매핑 기본키 매핑 방법 직접 매핑 : @Id 자동 생성 : @GeneratedValue strategy (전략) IDENTITY : 데이터 베이스에 위임 SEQUENCE : 데이터 베이스 스퀀스 오브젝트 사용 TABLE : 키 생성용 테이블 사용, 모든 DB 에서 사용 AUTO : 방언에 따라 자동 지정 IDENTITY 전략 기본키 생성을 데이터 베이스에 위임하는 전략 MySQL, PostgreSQL, SQL Server, DB2 에서 사용한다. IDENTITY 전략 - 문제점 DataBase 에 값이 들어가야 Id 값을 알 수 있다. 영속성 Context 에서 Entity 가 관리 되기 위해서는 PK 값이 반드시 있어야 한다. JPA 는 트랜잭션 COMMIT 시점에 INSERT SQL 실행하지만 IDENTITY 전략은 persist 시점에 실행 후 DB 에서 Id 조회

0

JPA Entity - Column 매핑

목차 JPA Entity - 테이블 매핑 JPA Entity - Column 매핑 JPA Entity - 기본키 매핑 @Column| 이름 | 기능 | 기본 값 ||: ——————————— | :————————————————————————————————————————————————— |: ——- || name | 필드와 매핑할 테이블 컬럼 이름 | 객체의 필드 이름| insertable | 등록 가능 여부 (true : 등록 가능, false : 등록 불가) | True|updatable | 변경 가능 여부 (true : 변경 가능, false : 변경 불가)| nullable (DDL) | null 값 허용 여부를 설정한다. false 일 경우 not null 제약 조건 이 생성된다. || unique (DDL) | 한 컬럼에 대한 Unique 제약 조건 을 설정한다. || columnDefinition (DDL) | 데이터 베이스 컬럼 정보를 직접 줄 수 있다. | 필드의 자바 타입| length (DDL) | 문자열 길이 제약 조건을 생성한다. (String 에서만 사용 가능) | 255| precision (DDL) scale (DDL) | BigDecimal 타입에서 사용한다. precision 은 소수점을 포함한 자릿수를 scale 은 소수의 자릿수다. double 과 float 타입에는 적용되지 않는다. | @Enumerated 자바 Enum Type 을 매핑할 때 사용 value EnumType.ORIGINAL : enum 순서를 데이터 베이스에 저장 (Integer) EnumType.STRING : enum 이름을 데이터 베이스에 저장 (String) EnumType.STRING : enum 이름을 데이터 베이스에 저장 (String) | EnumType.ORIGINAL | --> @Temporal value TemporalType.DATE : 날짜 정보, 데이터 베이스 date 타입과 Mapping TemporalType.TIME : 시간 정보, 데이터 베이스 time 타입과 Mapping TemporalType.TIMESTAMP : 날짜와 시간, 데이터 베이스 timestamp 와 Mapping

0

JPA Entity - 테이블 매핑

목차 JPA Entity - 테이블 매핑 JPA Entity - Column 매핑 JPA Entity - 기본키 매핑 Entity 매핑에 사용하는 어노테이션 객체와 테이블 매핑 : @Entity , @Table 필드와 컬럼 매핑 : @Column 기본 키 매핑 : @Id 연관 관계 매핑 : @ManyToOne, @JoinColumn @Entity JPA 가 관리하는 클래스JPA 를 사용하기 위해서는 반드시 Entity 어노테이션을 붙여줘야 한다. 파라미터가 없는 기본 생성자를 반드시 생성해줘야 한다. final 클래스, enum, interface, inner 클래스 에는 사용이 불가능 하다. 저장할 field 에 final 키워드는 사용이 불가능하다. @Table Table 어노테이션은 Entity 와 매핑할 Database Table 을 지정한다.

0

Git - Git 초기화(Init)

hint: Using 'master' as the name for the initial branch. This default branch namehint: is subject to change. To configure the initial branch name to use in allhint: of your new repositories, which will suppress this warning, call:hint:hint: git config --global init.defaultBranch <name>hint:hint: Names commonly chosen instead of 'master' are 'main', 'trunk' andhint: 'development'. The just-created branch can be renamed via this command:hint:hint: git branch -m <name> hint: You have divergent branches and need to specify how to reconcile them.hint: You can do so by running one of the following commands sometime beforehint: your next pull:hint:hint: git config pull.rebase false # mergehint: git config pull.rebase true # rebasehint: git config pull.ff only # fast-forward onlyhint:hint: You can replace "git config" with "git config --global" to set a defaulthint: preference for all repositories. You can also pass --rebase, --no-rebase,hint: or --ff-only on the command line to override the configured default perhint: invocation.fatal: Need to specify how to reconcile divergent branches.

0

JAVA - JWT

JAVA - JWT Jwts.builder(JwtBuilder) 를 이용해 Token 을 생성하고 Jwts.parserBuilder(JwtParserBuilder) 를 이용해 전달 받은 Token 을 Parsing 한다. public class JwtMain { public static void main(String args[]) { String jwt = Jwts.builder() .setSubject("test") .compact(); Jwt<Header, Claims> headerClaimsJwt = Jwts.parserBuilder() .build() .parseClaimsJwt(jwt); // Token 정보를 가져온다. System.out.println("token : " + jwt); // JWT Header 정보를 가져온다. System.out.println("JWT Header : " + headerClaimsJwt.getHeader()); // JWT Body(Claims) 정보를 가져온다. System.out.println("JWT Claims : " + headerClaimsJwt.getBody()); }} Token 에 서명을 진행하지 않았기 때문에 Signature 부분이 빠져있는 것을 확인할 수 있다. token : eyJhbGciOiJub25lIn0.eyJzdWIiOiJ0ZXN0In0.JWT Header : {alg=none}JWT Claims : {sub=test} JWT 암호화 (JWS) JwtBuilder 객체는 signWith 메소드를 이용해 Key 값과 암호 알고리즘 을 인자값으로 넘겨줘 서명한다. 서명의 유효성은 JwtParserBuilder 객체가 setSigningKey 메소드를 이용해 전달받은 Token 이 유효한지 확인한다. public class JwsMain { public static String key = "amF2YS1hcHBsaWNhdGlvbi1zZWN1cmUtc3R1ZHktand0LXNlY3JldGtleS1pcy1zaG91bGQtYmUtYmlnZ2VyLXRoYW4tNTEyYml0cw=="; public static Long tokenValidityInMilliseconds = 100000L; public static void main(String args[]) { Key secretKey = Keys.hmacShaKeyFor(key.getBytes()); String jwt = Jwts.builder() .setSubject("test") .signWith(secretKey, SignatureAlgorithm.HS512) // JWT 를 암호화 하기 위한 secret 과 알고리즘을 넣어준다. .compact(); Jws<Claims> claimsJws = Jwts.parserBuilder() .setSigningKey(secretKey) .build() .parseClaimsJws(jwt); Header header = claimsJws.getHeader(); Claims body = claimsJws.getBody(); System.out.println("token : " + jwt); System.out.println("JWT Header : " + header); System.out.println("JWT Claims : " + body); }}

0

JPA 연관 관계 - 상속 관계 Mapping

목차 JPA 연관 관계 - 고아 객체 JPA 연관 관계 - 즉시로딩과 지연로딩 JPA 연관 관계 - 프록시 객체 JPA 연관 관계 - @MappedSuperclass JPA 연관 관계 - 상속 관계 Mapping JPA 연관 관계 - 영속성 전이 Cascade JPA 연관 관계 - 양방향 연관관계와 연관과계의 주인 JPA 연관 관계 - 양방향 연관관계 JPA 연관 관계 - 객체 지향 스럽게 모델링 하기 JPA 연관 관계 - 객체 관계 모델링하기 JPA 연관 관계 JPA 상속 관계 Mapping 관계형 데이터 베이스는 상속 관계가 없다. 슈펴타입 서브타입 관계라는 모델링 기법이 객체의 상속과 유사하다. 상속관계 Mapping : 객체의 상속 관계와 DB 의 슈퍼타입 서브타입 관계를 Mapping 슈퍼타입 서브타입 논리 모델을 객체의 상속관계를 물리 모델로 구현하는 방법 객체의 상속관계를 슈퍼타입 서브타입 모델로 구현하는 방법은 3가지 방법이 있다. 전략 설명 조인 전략 각각 테이블로 변환 (연관 관계로 관리) 단일 테이블 전략 통합 테이블로 변환 (하나의 테이블로 관리) 구현 클래스마다 테이블 전략 서브타입 테이블로 변환 사용하는 어노테이션 @Inheritance @DiscriminatorColumn(name=”DTYPE”) @DiscriminotorValue @Inheritance 전략

0

JPA 연관 관계 - 영속성 전이 Cascade

목차 JPA 연관 관계 - 고아 객체 JPA 연관 관계 - 즉시로딩과 지연로딩 JPA 연관 관계 - 프록시 객체 JPA 연관 관계 - @MappedSuperclass JPA 연관 관계 - 상속 관계 Mapping JPA 연관 관계 - 영속성 전이 Cascade JPA 연관 관계 - 양방향 연관관계와 연관과계의 주인 JPA 연관 관계 - 양방향 연관관계 JPA 연관 관계 - 객체 지향 스럽게 모델링 하기 JPA 연관 관계 - 객체 관계 모델링하기 JPA 연관 관계 JPA 영속성 전이 Cascade Cascading 이란, 특정 Entity 에 작업을 수행했을 때, 같은 작업이 연관된 Entity 에도 일어나는 것을 의미한다. 영속성 전이는 연관관계를 매핑하는 것과 아무 관련이 없다. 엔티티를 연속화 할때 연관된 엔티티도 함께 영속화 하는 편리함을 제공한다. 영속성 전이 옵션 CascadeType.ALL 상위 Entity 에서 발생한 모든 작업을 하위 Entity 로 모두 전파 CascadeType.PERSIST 상위 Entity 를 영속화 하는 작업이 일어 날때 하위 Entity 도 같이 영속화 한다. CascadeType.MERGE 상위 Entity 에서 발생한 Merge 작업을 하위 Entity 까지 Merge 작업을 전파한다. CascadeType.REMOVE 상위 Entity 를 삭제할 때 하위 Entity 까지 삭제한다. CascadeType.REFRESH DataBase 로부터 상위 Entity 를 다시 읽어올때 하위 Entity 까지 다시 읽어온다. CascadeType.DETACH 상위 Entity 를 영속성 컨텍스트에서 제거할 때 하위 Entity 까지 같이 제거한다. @Entity@NoArgsConstructor@AllArgsConstructor@Setter@Getterpublic class Person { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; @OneToMany(mappedBy = "person", cascade = CascadeType.ALL) private List<Phone> phones = new ArrayList<>(); public void addPhone(Phone phone){ phones.add(phone); phone.setPerson(this); }} @Entity@Builder@NoArgsConstructor@AllArgsConstructor@Getter@Setterpublic class Phone { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) public Long id; public String phoneNumber; @ManyToOne @JoinColumn(name = "PERSON_ID") public Person person;}

0

STL - map 컨테니어

map 연관 컨테이너 에서 원소로 Key와 Value의 쌍으로 저장되는 컨테이너[] 연산자를 이용해 value 에 접근 할 수 있다. (value = m[key] 형태로 사용) key 는 중복해서 저장될 수 없다. 노드 기반 컨테이너 균현 이진 트리로 구현돼 있다. Map Member 함수 함수 설명 반환 값 begin() 첫번째 원소를 가르키는 iterator 를 가져온다 iterator end() 마지막 원소를 가르키는 다음 iterator 를 가져온다 iterator clear() map 내 모든 원소를 삭제한다 empty() map 이 비었는지 확인한다 bool size() map 에 저장된 원소의 개수를 가져온다 int find(key) map 내 key 가 저장된 iterator 를 가져온다. 없으면 end iterator를 반환한다 iterator count(key) map 내 key 의 개수를 가져온다 int erase(key) map 내 key 원소를 삭제한후 다음 원소를 가르키는 itrator를 반환한다 iterator erase(iterator) iterator 가 가르키는 원소를 삭제한 후 다음 원소를 가르키는 iterator를 반환한다 iterator erase(begin, end) iterator begin에서 end까지 원소를 삭제한 후 다음 원소를 가르키는 iterator를 반환한다 iterator insert(key) map 에 key 를 삽입한 후 저장된 iterator와 성공 여부를 담는 Pair 객체를 반환한다 Pair<iterator, bool> insert(begin, end) iterator begin에서 end까지 원소를 map 에 삽입한다. lower_bound(key) key 값 보다 같거나 큰 값이 처음으로 나타나는 iterator 를 반환한다. (이상) iterator upper_bound(key) key 값 보다 큰 값이 처음으로 나타나는 iterator 를 반환한다. (초과) iterator

0

STL - set 컨테이너

set 연관 컨테이너 에서 key 라 불리는 원소의 집합으로 이뤄진 컨테이너 key 는 중복해서 저장될 수 없다. 노드 기반 컨테이너 균현 이진 트리로 구현돼 있다. 시퀸스 컨테이너로 배열과 비슷하지만 동적으로 데이터를 추가할 수 있고, 크기가 자동으로 늘어난다는 장점이 있다. Set Member 함수 함수 설명 반환 값 begin() 첫번째 원소를 가르키는 iterator 를 가져온다 iterator end() 마지막 원소를 가르키는 다음 iterator 를 가져온다 iterator clear() set 내 모든 원소를 삭제한다 empty() set 이 비었는지 확인한다 bool size() set 에 저장된 원소의 개수를 가져온다 int find(key) set 내 key 가 저장된 iterator 를 가져온다. 없으면 end iterator를 반환한다 iterator count(key) set 내 key 의 개수를 가져온다 int erase(key) set 내 key 원소를 삭제한후 다음 원소를 가르키는 itrator를 반환한다 iterator erase(iterator) iterator 가 가르키는 원소를 삭제한 후 다음 원소를 가르키는 iterator를 반환한다 iterator erase(begin, end) iterator begin에서 end까지 원소를 삭제한 후 다음 원소를 가르키는 iterator를 반환한다 iterator insert(key) set 에 key 를 삽입한 후 저장된 iterator와 성공 여부를 담는 Pair 객체를 반환한다 Pair<iterator, bool> insert(begin, end) iterator begin에서 end까지 원소를 set 에 삽입한다. lower_bound(key) key 값 보다 같거나 큰 값이 처음으로 나타나는 iterator 를 반환한다. (이상) iterator upper_bound(key) key 값 보다 큰 값이 처음으로 나타나는 iterator 를 반환한다. (초과) iterator insert(begin, end) 다른 컨테이너어 저장된 데이터를 set 에 데이터를 넣을때 사용하면 유용한 함수다.