Category: Programming

0

프로그래머스 - 신고 결과 받기 Python

문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/92334 프로그래머스 - 신고 결과 받기 Cpp 프로그래머스 - 신고 결과 받기 Python def solution(id_list, report, k): answer = [0] * len(id_list) dict = {id: set() for id in id_list} for line in set(report): args = line.split(' ') dict[args[1]].add(args[0]) print(dict) for key, value in dict.items(): if len(value) >= k: for i in value: answer[id_list.index(i)] += 1 return answer

0

프로그래머스 - 문자열 압축 Python

https://programmers.co.kr/learn/courses/30/lessons/60057 프로그래머스 - 문자열 압축 Cpp 프로그래머스 - 문자열 압축 Python 문제 풀이간단한 구현 문제다. 주어진 문자열을 substr 해서 문자열 비교를 통해 같은 문자열의 개수를 찾아내 압축된 문자열 형태로 만들어준 다음 압축된 문자열의 길이를 반환해주면 되는 문제다. 문제 전체 소스def solution(s): answer = '' if len(s) == 1: return len(s) for i in range(1, len(s)//2 + 1): sentence = '' count = 0 word = s[:i] for j in range(0, len(s), i): if s[j:j+i] == word: count += 1 else: if count > 1: sentence += (str(count) + word) else: sentence += (word) word = s[j:j+i] count = 1 if count > 1: sentence += (str(count) + word) else: sentence += (word) if len(answer) == 0: answer = sentence elif len(answer) > len(sentence): answer = sentence print(answer) return len(answer)

0

프로그래머스 - 문자열 압축 Cpp

https://programmers.co.kr/learn/courses/30/lessons/60057 프로그래머스 - 문자열 압축 Cpp 프로그래머스 - 문자열 압축 Python 문제 풀이간단한 구현 문제다. 주어진 문자열을 substr 해서 문자열 비교를 통해 같은 문자열의 개수를 찾아내 압축된 문자열 형태로 만들어준 다음 압축된 문자열의 길이를 반환해주면 되는 문제다. 문자열 압축하기주어진 문자열을 스캔하면서 고려해야 하는 조건이 첫번째는 substr 하려는 범위가 주어진 문자열의 범위를 넘어서면 안된다는 것이다. 두번째는 substr 범위가 주어진 문자열의 범위를 넘어선 경우 압축된 문자열에 그대로 추가해줘야 한다는 것이다. int divideString(int length, string s) { string zipString = ""; int i = 0; // 문자열을 스캔하면서 substr 범위가 주어진 문자열을 넘는지 확인한다. for (i = 0; i < s.length() && i + length < s.length(); i = i + length) { int count = 0; bool isErase = false; string substr = s.substr(i, length); string cmpstr = s.substr(i, length); while (substr == cmpstr && s.length() > i) { count++; i += length; isErase = true; substr = s.substr(i, length); } if (isErase == true) { i -= length; } if (count == 1) { zipString += cmpstr; } else { zipString += to_string(count); zipString += cmpstr; } } // 남겨진 문자열을 압축된 문자열에 그대로 추가한다. for (int idx = i; idx < s.length(); idx++) { zipString += s[i]; } return zipString.length();} 문제 전체 소스#include <bits/stdc++.h>using namespace std;int divideString(int length, string s) { string zipString = ""; int count = 0; int i = 0; for (i = 0; i < s.length() && i + length < s.length(); i = i + length) { bool isErase = false; string substr = s.substr(i, length); string cmpstr = s.substr(i, length); while (substr == cmpstr && s.length() > i) { count++; i += length; isErase = true; substr = s.substr(i, length); } if (isErase == true) { i -= length; } if (count == 1) { zipString += cmpstr; } else { zipString += to_string(count); zipString += cmpstr; } count = 0; cmpstr = ""; } for (int idx = i; idx < s.length(); idx++) { zipString += s[i]; } return zipString.length();}int solution(string s) { int answer = 0; int minValue = s.length(); for (int i = 1; i <= s.length() / 2; i++) { int zipLength = divideString(i, s); minValue = min(zipLength, minValue); } answer = minValue; return answer;}

0

백준 13460 - 구슬 탈출 2

https://www.acmicpc.net/problem/13460 백준 13460 - 구슬 탈출 2 백준 13460 - 구슬 탈출 2문제스타트링크에서 판매하는 어린이용 장난감 중에서 가장 인기가 많은 제품은 구슬 탈출이다. 구슬 탈출은 직사각형 보드에 빨간 구슬과 파란 구슬을 하나씩 넣은 다음, 빨간 구슬을 구멍을 통해 빼내는 게임이다. 보드의 세로 크기는 N, 가로 크기는 M이고, 편의상 1×1크기의 칸으로 나누어져 있다. 가장 바깥 행과 열은 모두 막혀져 있고, 보드에는 구멍이 하나 있다. 빨간 구슬과 파란 구슬의 크기는 보드에서 1×1크기의 칸을 가득 채우는 사이즈이고, 각각 하나씩 들어가 있다. 게임의 목표는 빨간 구슬을 구멍을 통해서 빼내는 것이다. 이때, 파란 구슬이 구멍에 들어가면 안 된다. 이때, 구슬을 손으로 건드릴 수는 없고, 중력을 이용해서 이리 저리 굴려야 한다. 왼쪽으로 기울이기, 오른쪽으로 기울이기, 위쪽으로 기울이기, 아래쪽으로 기울이기와 같은 네 가지 동작이 가능하다. 각각의 동작에서 공은 동시에 움직인다. 빨간 구슬이 구멍에 빠지면 성공이지만, 파란 구슬이 구멍에 빠지면 실패이다. 빨간 구슬과 파란 구슬이 동시에 구멍에 빠져도 실패이다. 빨간 구슬과 파란 구슬은 동시에 같은 칸에 있을 수 없다. 또, 빨간 구슬과 파란 구슬의 크기는 한 칸을 모두 차지한다. 기울이는 동작을 그만하는 것은 더 이상 구슬이 움직이지 않을 때 까지이다. 보드의 상태가 주어졌을 때, 최소 몇 번 만에 빨간 구슬을 구멍을 통해 빼낼 수 있는지 구하는 프로그램을 작성하시오.

0

프로그래머스 - 신규 아이디 추천 (Java)

문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/72410 프로그래머스 - 신규 아이디 추천 (Java) 프로그래머스 - 신규 아이디 추천 (Python) 문제 풀이주어진 조건에 맞춰 하나하나씩 구현하면 되는 문제다. 문자열 관련 정규 표현식을 이용하면 더욱 깔끔하게 문제를 해결 할 수 있다. 전체 소스class Solution { public String solution(String new_id) { String id = new_id.toLowerCase(); id = id.replaceAll("[^-_.a-z0-9]", ""); id = id.replaceAll("[.]{2,}", "."); id = id.replaceAll("^[.]|[.]$", ""); if (id.equals("")) { id += "a"; } if (id.length() >= 16) { id = id.substring(0, 15); id = id.replaceAll("[.]$", ""); } while (id.length() <= 2) { id += id.charAt(id.length() - 1); } return id; }}

0

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

문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/77484 프로그래머스 - 키패드누르기 Cpp 프로그래머스 - 키패드누르기 Python def solution(numbers, hand): answer = '' left_hands = [1, 4, 7] right_hands = [3, 6, 9] middle = [2, 5, 8, 0] key_pad = { 1: [0, 0], 2: [0, 1], 3: [0, 2], 4: [1, 0], 5: [1, 1], 6: [1, 2], 7: [2, 0], 8: [2, 1], 9: [2, 2], 0: [3, 1], } left_position = [3, 0] right_position = [3, 2] for key in numbers: if key in left_hands: left_position = key_pad[key] answer += 'L' elif key in right_hands: right_position = key_pad[key] answer += 'R' else: # print(key_pad[key][0]) left_dist = abs( left_position[0] - key_pad[key][0]) + abs(left_position[1] - key_pad[key][1]) right_dist = abs( right_position[0] - key_pad[key][0]) + abs(right_position[1] - key_pad[key][1]) if left_dist == right_dist: if hand == 'right': right_position = key_pad[key] answer += "R" else: left_position = key_pad[key] answer += "L" elif left_dist < right_dist: left_position = key_pad[key] answer += 'L' else: right_position = key_pad[key] answer += 'R' return answer

0

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

문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/77484 프로그래머스 - 로또의 최고 순위와 최저 순위 Cpp 프로그래머스 - 로또의 최고 순위와 최저 순위 Java 프로그래머스 - 로또의 최고 순위와 최저 순위 Python def ranking(cnt): if cnt == 6: return 1 elif cnt == 5: return 2 elif cnt == 4: return 3 elif cnt == 3: return 4 elif cnt == 2: return 5 else: return 6def cmp(lottos, win_nums): answer = [] cnt = 0 zeros = 0 for i in lottos: if i == 0: zeros += 1 elif i in win_nums: cnt += 1 answer.append(ranking(cnt+zeros)) answer.append(ranking(cnt)) return answerdef solution(lottos, win_nums): answer = cmp(lottos, win_nums) return answer

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 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

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

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 을 지정한다.