hstory0208의 등록된 링크

키자드에 등록된 총 346개의 포스트를 확인하실 수 있습니다.

Tistory

[Java/자바] 프로그래머스 Lv2 - 타겟 넘버 (DFS 깊이 우선 탐색)

문제 설명 n개의 음이 아닌 정수들이 있습니다. 이 정수들을 순서를 바꾸지 않고 적절히 더하거나 빼서 타겟 넘버를 만들려고 합니다. 예를 들어 [1, 1, 1, 1, 1]로 숫자 3을 만들려면 다음 다섯 방법을 쓸 수 있습니다. -1+1+1+1+1 = 3 +1-1+1+1+1 = 3 +1+1-1+1+1 = 3 +1+1+1-1+1 = 3 +1+1+1+1-1 = 3 사용할 수 있는 숫자가 담긴 배열 numbers, 타겟 넘버 target이 매개변수로 주어질 때 숫자를 적절히 더하고 빼서 타겟 넘버를 만드는 방법의 수를 return 하도록 solution 함수를 작성해주세요. 제한사항 주어지는 숫자의 개수는 2개 이상 20개 이하입니다. 각 숫자는 1 이상 50 이하인 자연수입니다. 타겟 넘버는 1 이상 100..

Tistory

[Java/자바] 프로그래머스 Lv2 - k진수에서 소수 개수 구하기

문제 설명 양의 정수 n이 주어집니다. 이 숫자를 k진수로 바꿨을 때, 변환된 수 안에 아래 조건에 맞는 소수(Prime number)가 몇 개인지 알아보려 합니다. 0P0처럼 소수 양쪽에 0이 있는 경우 P0처럼 소수 오른쪽에만 0이 있고 왼쪽에는 아무것도 없는 경우 0P처럼 소수 왼쪽에만 0이 있고 오른쪽에는 아무것도 없는 경우 P처럼 소수 양쪽에 아무것도 없는 경우 단, P는 각 자릿수에 0을 포함하지 않는 소수입니다. 예를 들어, 101은 P가 될 수 없습니다. 예를 들어, 437674을 3진수로 바꾸면 211020101011입니다. 여기서 찾을 수 있는 조건에 맞는 소수는 왼쪽부터 순서대로 211, 2, 11이 있으며, 총 3개입니다. (211, 2, 11을 k진법으로 보았을 때가 아닌, 10진..

Tistory

[Java/자바] 프로그래머스 Lv2 - 전화번호 목록(해시)

문제 설명 전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다. 전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사입니다. 구조대 : 119 박준영 : 97 674 223 지영석 : 11 9552 4421 전화번호부에 적힌 전화번호를 담은 배열 phone_book 이 solution 함수의 매개변수로 주어질 때, 어떤 번호가 다른 번호의 접두어인 경우가 있으면 false를 그렇지 않으면 true를 return 하도록 solution 함수를 작성해주세요. 제한 사항 phone_book의 길이는 1 이상 1,000,000 이하입니다. 각 전화번호의 길이는 1 이상 20 이하입니다. 같은 전화번호가 중복해서 들어있지 않습니다. 입출력 예제 ph..

Tistory

힙(Heap) 자료구조

힙(Heap)이란 ? 완전 이진 트리의 일종으로, 데이터에서 최댓값과 최솟값을 빠르게 찾기 위해 만들어진 자료구조입니다. 힙을 사용하는 이유는 최댓값과 최솟값을 찾기 위해 배열을 사용하는 경우 O(n)의 시간복잡도가 걸리는 반면, 힙을 사용하면 O(logn)의 시간복잡도가 소요되므로 시간적으로 효율적이기 때문입니다. 완전 이진 트리 (Complete Binary Tree)란 ? 이진 트리에 노드를 삽입할 때 왼쪽부터 차례대로 삽입하는 트리로 아래 그림과 같습니다. 만약, 왼쪽이 비어 있고 오른쪽이 채워져있다면 완전 이진 트리라고 할 수 없습니다. 힙의 특징 힙은 최대 힙과 최소 힙으로 나눠집니다. 최대 힙(max heap) : 부모 노드의 값이 자식 노드이 값보다 크거나 같은 완전 이진 트리. ( 부모 ..

Tistory

[알고리즘] 힙 정렬(Heap Sort)이란?

먼저 힙 정렬에 대해 다루기 전에 "힙"에 대한 이해가 필요합니다. 힙에 대해 알고 싶다면 아래 링크를 참고하시면 도움됩니다. 힙(Heap) 자료구조 힙(Heap)이란 ? 완전 이진 트리의 일종으로, 데이터에서 최댓값과 최솟값을 빠르게 찾기 위해 만들어진 자료구조입니다. 힙을 사용하는 이유는 최댓값과 최솟값을 찾기 위해 배열을 사용하는 경 hstory0208.tistory.com 힙 정렬(Heap Sort) 힙 정렬 알고리즘은 삽입과정 없이 삭제과정만이 이뤄집니다. 최대힙(max heap)을 구현한뒤, 루트 노드를 삭제하여 마지막 노드가 루트 노드가 되어 최대힙의 규칙에 맞게 재구조화 되며 정렬합니다. 힙 정렬 알고리즘은 주로 다음과 같은 경우에 유용하게 사용됩니다. 최댓값과 최솟값을 구할 때 최대 k만..

Tistory

[알고리즘] 완전탐색(Exhaustive search)이란?

완전탐색 완전탐색이란 이름 그대로 모든 것을 탐색 즉, "모든 경우의 수를 다 만들어 보는 방법"입니다. 만약 휴대폰 비밀번호 4자리의 핀 번호를 까먹어서 0000 ~ 9999 까지 모든 수를 도전 해본다면, 최대 10000번의 도전이 있을 것입니다. 이 처럼 완전 탐색은 무식하게 모든 경우의 수를 전부 탐색하기 때문에 시간 복잡도가 매우 커서 입력값의 크기가 작을 때 사용하기 좋습니다. 완전탐색 알고리즘 1. Brute Force 단순한 반복문(for)과 조건문(if)으로 모든 경우의 수를 만들어 답을 구하는 방법입니다. 아주 기초적인 문제에 주로 나옵니다. 2. Bitmask (비트마스크) 2진수를 이용하는 컴퓨터의 연산을 이용하는 방식 나올 수 있는 모든 경우의 수가 "각각의 원소가 포함되거나, 포..

Tistory

[알고리즘] Binary Search(이진 탐색/이분 탐색)이란?

Binary Search(이진 탐색/이분 탐색) 이진 탐색 알고리즘은 정렬되어 있는 배열에서 찾고자 하는 특정한 값을 찾아내는 알고리즘입니다. 이진 탐색 알고리즘이 탐색하는 방식은 배열의 중간에 있는 값(mid)을 선택하여 찾고자하는 값(x)과 비교합니다. 찾고자하는 값(x)가 중간 값(mid)보다 작으면 중간 값을 기준으로 왼쪽으로 다시 탐색, 크다면 오른쪽으로 다시 탐색합니다. 다시 탐색을 시작할 때 찾고자하는 값(x)가 중간 값(mid)보다 작으면 해당 중간 값부터 우측 끝값을 제거하고 다시 중간 값을 선택하고 찾고자하는 값(x)을 찾습니다. 반대로 찾고자하는 값(x)가 중간 값(mid)보다 크면 해당 중간 값부터 좌측 끝값을 제거 하고 다시 중간 값을 선택하고 찾고자하는 값(x)를 찾습니다. 찾고..

Tistory

[알고리즘] 백트래킹(Back Tracking)이란?

백트래킹(Back Tracking) 백트래킹은 깊이 우선 탐색(DFS)를 진행하며 탐색 중인 경로에 답이 없다고 판단되면 해당 노드를 제거하고, 탐색을 시작했던 부모 노드에서 바른 방향으로 다시 탐색합니다. 여기서 더 이상 탐색할 필요가 없는 노드를 제외하는 것을 가지치기(Pruning)이라 하고 해당 경로에 답이 있다고 판단되는 경우에는 유망하다(Promising)이라고 합니다. 즉, 백트래킹은 DFS탐색을 진행하며 유망한 조건을 만족하는 방향으로만 탐색하는 알고리즘입니다. 백트래킹 탐색 과정 ACG라는 단어를 찾는다고 가정했을 시 다음과 같은 순서로 탐색을 진행합니다. DFS탐색을 진행하여 "A"노드에서 "B"노드를 방문합니다. A다음 찾는 단어는 C로 "B"노드가 아니기 때문에 가지치기를 하고 부모..

Tistory

[Java/자바] 프로그래머스 Lv2 - 프린터

문제 설명 일반적인 프린터는 인쇄 요청이 들어온 순서대로 인쇄합니다. 그렇기 때문에 중요한 문서가 나중에 인쇄될 수 있습니다. 이런 문제를 보완하기 위해 중요도가 높은 문서를 먼저 인쇄하는 프린터를 개발했습니다. 이 새롭게 개발한 프린터는 아래와 같은 방식으로 인쇄 작업을 수행합니다. 1. 인쇄 대기목록의 가장 앞에 있는 문서(J)를 대기목록에서 꺼냅니다. 2. 나머지 인쇄 대기목록에서 J보다 중요도가 높은 문서가 한 개라도 존재하면 J를 대기목록의 가장 마지막에 넣습니다. 3. 그렇지 않으면 J를 인쇄합니다. 예를 들어, 4개의 문서(A, B, C, D)가 순서대로 인쇄 대기목록에 있고 중요도가 2 1 3 2 라면 C D A B 순으로 인쇄하게 됩니다. 내가 인쇄를 요청한 문서가 몇 번째로 인쇄되는지 ..

Tistory

[알고리즘] 그리디 알고리즘(탐욕법)

Greedy(탐욕) 알고리즘이란 ? Greedy를 번역하면 "탐욕스러운"이라는 뜻을 가집니다. 그리디 알고리즘은 탐욕이란 뜻처럼 현재 상황에서 최적의 해만을 선택합니다. 그리디는 현재 상황의 최적의 해를 구하는다는 것에 중점을 두어야하는데, 그 이유는 다음 그림을 봅시다. 가장 큰수를 찾기 위해 앞으로 간다면 제일 큰 수가 있는 "1000"과 연결되어 있는 100 -> 1000 을 생각할 것입니다. 하지만 Greedy 알고리즘은 시작부터 두 수중 가장 큰 수인 "500"을 탐색하고 그 다음 큰 수인 "200"을 탐색합니다. 이 처럼 그리드는 최종결과에서의 최적의 해가 아닌 "현재상황에서 최적의 해"를 구합니다. 그리디 알고리즘 적용 조건 1. 탐욕스러운 선택 조건 앞의 선택이 이후의 선택에 영향을 주지 ..

Tistory

[Java/자바] java.time 패키지 (날짜와 시간 다루기)

이전에 Date 클래스와 Calendar 클래스를 이용하여 날짜와 시간 데이터를 다루는 방법을 포스팅했었습니다. 이번에 포스팅할 java.time 패키지는 위 두 클래스의 단점을 보완한 패키지로 JDK1.8부터 추가되었습니다. java.time 패키지 패키지 설명 java.time 날짜와 시간을 다루는데 필요한 핵심 클래스들을 제공 java.time.chrono 표준(ISO)이 아닌 달력 시스템을 위한 클래스들을 제공 java.time.format 날짜와 시간을 파싱하고 형식화하기 위한 클래스들을 제공 java.time.temporal 날짜와 시간의 필드(field)와 단위(unit)를 위한 클래스들을 제공 java.time.zone 시간대(time-zone)와 관련된 클래스들을 제공 java.time ..

Tistory

[Java/자바] 프로그래머스 Lv2 - n^2배열 자르기

문제 설명 정수 n, left, right가 주어집니다. 다음 과정을 거쳐서 1차원 배열을 만들고자 합니다. n행 n열 크기의 비어있는 2차원 배열을 만듭니다. i = 1, 2, 3, ..., n에 대해서, 다음 과정을 반복합니다. 1행 1열부터 i행 i열까지의 영역 내의 모든 빈 칸을 숫자 i로 채웁니다. 1행, 2행, ..., n행을 잘라내어 모두 이어붙인 새로운 1차원 배열을 만듭니다. 새로운 1차원 배열을 arr이라 할 때, arr[left], arr[left+1], ..., arr[right]만 남기고 나머지는 지웁니다. 정수 n, left, right가 매개변수로 주어집니다. 주어진 과정대로 만들어진 1차원 배열을 return 하도록 solution 함수를 완성해주세요. 제한사항 1 ≤ n ≤..

Tistory

[알고리즘] 깊이 우선 탐색(DFS), 너비 우선 탐색(BFS)

DFS (깊이 우선 탐색, Depth First Search) DFS는 그래프에서 깊은 부분을 우선적으로 탐색합니다. 한 정점에서 시작해 다음 경로로 넘어가기 전에 해당 경로를 완벽하게 탐색할 때 사용합니다. 특징 스택 자료 구조에 기초하며, 구현할 때 재귀 함수로 구현하는 것이 좀더 간편합니다. DFS를 구현할 때, 그래프 탐색의 경우 어떤 노드를 방문했었는지 여부를 검사하지 않을 시 무한 루프에 빠질 위험이 있으므로 반드시 검사해야합니다. ( visited[index] = true; ) 미로를 탐색할 때, 해당 분기에서 갈 수 있을 때까지 계속 가다가 더 이상 갈 수 없게 되면 다시 가장 가까운 갈림길로(새로운 분기)로 돌아와서 다른 방향으로 다시 탐색을 진행하는 방법과 유사합니다. 모든 경우를 하나..

Tistory

[Java/자바] 프로그래머스 Lv2 - 튜플

문제 설명 셀수있는 수량의 순서있는 열거 또는 어떤 순서를 따르는 요소들의 모음을 튜플(tuple)이라고 합니다. n개의 요소를 가진 튜플을 n-튜플(n-tuple)이라고 하며, 다음과 같이 표현할 수 있습니다. (a1, a2, a3, ..., an) 튜플은 다음과 같은 성질을 가지고 있습니다. 중복된 원소가 있을 수 있습니다. ex : (2, 3, 1, 2) 원소에 정해진 순서가 있으며, 원소의 순서가 다르면 서로 다른 튜플입니다. ex : (1, 2, 3) ≠ (1, 3, 2) 튜플의 원소 개수는 유한합니다. 원소의 개수가 n개이고, 중복되는 원소가 없는 튜플 (a1, a2, a3, ..., an)이 주어질 때(단, a1, a2, ..., an은 자연수), 이는 다음과 같이 집합 기호 '{', '}'..

Tistory

[Java/자바] 프로그래머스 Lv2 - 기능개발 (Queue)

문제 설명 프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다. 또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는 기능보다 먼저 개발될 수 있고, 이때 뒤에 있는 기능은 앞에 있는 기능이 배포될 때 함께 배포됩니다. 먼저 배포되어야 하는 순서대로 작업의 진도가 적힌 정수 배열 progresses와 각 작업의 개발 속도가 적힌 정수 배열 speeds가 주어질 때 각 배포마다 몇 개의 기능이 배포되는지를 return 하도록 solution 함수를 완성하세요. 제한 사항 작업의 개수(progresses, speeds배열의 길이)는 100개 이하입니다. 작업 진도는 100 미만의 자연수입니다. 작업 속도는 100 이하의 자..

Tistory

[Java/자바] 프로그래머스 Lv2 - 괄호 회전하기 (스택 Stack 활용)

문제 설명 다음 규칙을 지키는 문자열을 올바른 괄호 문자열이라고 정의합니다. (), [], {} 는 모두 올바른 괄호 문자열입니다. 만약 A가 올바른 괄호 문자열이라면, (A), [A], {A} 도 올바른 괄호 문자열입니다. 예를 들어, [] 가 올바른 괄호 문자열이므로, ([]) 도 올바른 괄호 문자열입니다. 만약 A, B가 올바른 괄호 문자열이라면, AB 도 올바른 괄호 문자열입니다. 예를 들어, {} 와 ([]) 가 올바른 괄호 문자열이므로, {}([]) 도 올바른 괄호 문자열입니다. 대괄호, 중괄호, 그리고 소괄호로 이루어진 문자열 s가 매개변수로 주어집니다. 이 s를 왼쪽으로 x (0 ≤ x < (s의 길이)) 칸만큼 회전시켰을 때 s가 올바른 괄호 문자열이 되게 하는 x의 개수를 return ..

Tistory

[알고리즘] 시간 복잡도(Time Complexity)란?

시간 복잡도 (Time Complexity) 코드 문제들을 풀거나 기능을 구현하면서 자신의 코드와 다른 사람들의 코드를 보면서 이런식으로 효율적으로 코드를 짤 수 있구나 ~ 하는 경험들이 한 번씩은 다 있었을 겁니다. 그렇게 남들이 효율적으로 잘 짠 코드를 보면 "어떻게 효율적으로 코드를 짤 수 있을까"라는 생각들을 할텐데요. 효율적인 코드를 짠 다는 것은 코드가 실행되는데 걸리는 시간에 대해 고민하는 것과 같습니다. * 코드가 실행되는데 걸리는 시간 : 입력값의 변화에 따라 연산을 실행할 때, 연산 횟수에 비해 시간이 얼마나 걸리는지? * 효율적인 코드 : 입력값이 커짐에 따라 증가하는 시간의 비율을 최소화한 알고리즘을 구성 즉, 효율적인 알고리즘을 구현한다는 것은 시간의 비율을 최소화한 알고리즘을 구..

Tistory

[Java/자바] 프로그래머스 Lv2 - 위장(HashMap)

문제 설명 스파이들은 매일 다른 옷을 조합하여 입어 자신을 위장합니다. 예를 들어 스파이가 가진 옷이 아래와 같고 오늘 스파이가 동그란 안경, 긴 코트, 파란색 티셔츠를 입었다면 다음날은 청바지를 추가로 입거나 동그란 안경 대신 검정 선글라스를 착용하거나 해야 합니다. 종류 이름 얼굴 동그란 안경, 검정 선글라스 상의 파란색 티셔츠 하의 청바지 겉옷 긴 코트 스파이가 가진 의상들이 담긴 2차원 배열 clothes가 주어질 때 서로 다른 옷의 조합의 수를 return 하도록 solution 함수를 작성해주세요. 제한사항 clothes의 각 행은 [의상의 이름, 의상의 종류]로 이루어져 있습니다. 스파이가 가진 의상의 수는 1개 이상 30개 이하입니다. 같은 이름을 가진 의상은 존재하지 않습니다. cloth..

Tistory

[알고리즘] 캐시 교체 알고리즘 - LRU, LFU

이 내용을 다루기 앞서 이전에 포스팅했던 캐시에 대해 읽어보시는 것을 추천드립니다. 쿠키, 캐시, 세션 이란 ? 각 개념들과 차이점에 대해 쉽게 알아보자. 쿠키, 캐시, 세션에 대해 설명하기 전에 먼저 HTTP의 특징에 대해 짚고 넘어가야합니다. HTTP에 대한 설명은 아래 포스팅 참고하시면 좋습니다. HTTP와 HTTPS의 개념 및 차이점에 대해 알아보자. HTTP ( hstory0208.tistory.com CS면접의 단골 질문인 쿠키, 캐시, 세션에 대해 각 특징과 차이점들에 대해 설명해놓았으므로 도움이 되실 겁니다. 캐시가 사용하는 리소스의 양은 무한대가 아니라 제한적이기 때문에, 캐시는 제한된 리소스 내에서 데이터를 빠르게 저장하고 접근할 수 있어야합니다. 그래서 "캐시 교체 알고리즘"으로 어떤..

Tistory

[Java/자바] 프로그래머스 Lv2 - [1차]캐시 (LRU 알고리즘)

문제 설명 지도개발팀에서 근무하는 제이지는 지도에서 도시 이름을 검색하면 해당 도시와 관련된 맛집 게시물들을 데이터베이스에서 읽어 보여주는 서비스를 개발하고 있다. 이 프로그램의 테스팅 업무를 담당하고 있는 어피치는 서비스를 오픈하기 전 각 로직에 대한 성능 측정을 수행하였는데, 제이지가 작성한 부분 중 데이터베이스에서 게시물을 가져오는 부분의 실행시간이 너무 오래 걸린다는 것을 알게 되었다. 어피치는 제이지에게 해당 로직을 개선하라고 닦달하기 시작하였고, 제이지는 DB 캐시를 적용하여 성능 개선을 시도하고 있지만 캐시 크기를 얼마로 해야 효율적인지 몰라 난감한 상황이다. 어피치에게 시달리는 제이지를 도와, DB 캐시를 적용할 때 캐시 크기에 따른 실행시간 측정 프로그램을 작성하시오. 입력 형식 캐시 크..

Tistory

[알고리즘] 누적합, 구간합 구하기

누적합(Prefix Sum)과 구간합 누적합 누적합이란 나열 된 수들의 누적된 합을 뜻합니다. 즉, 이 배열의 누적합을 구하면 1 + 3 + 4 + 2 + 5 = 15가 됩니다. 누적합의 배열의 크기가 원본 배열보다 1더 큰데 이는 밑에서 설명하겠습니다. 구간합 말 그대로 나열 된 수 중에서 합을 구하고 싶은 구간의 합입니다. 만약 1번째 인덱스부터 ~ 3번째 인덱스까지의 구간합을 구한다면, 3 + 4 + 2 = 11이 됩니다. 구간합을 빠르게 구할 수 있는 공식이 있는데, 이 공식이 만들어지는 과정을 봅시다. 누적합 배열 prefixSum의 크기가 arr보다 1 더 큰 이유는 0번 인덱스 부터 n번 인덱스의 구간합을 구할 수 있게 하기 위함입니다. 이제 1번째 인덱스부터 ~ 3번째 인덱스까지의 구간합을..

Tistory

[Java/자바] 프로그래머스 Lv2 - H-Index

문제 설명 H-Index는 과학자의 생산성과 영향력을 나타내는 지표입니다. 어느 과학자의 H-Index를 나타내는 값인 h를 구하려고 합니다. 위키백과1에 따르면, H-Index는 다음과 같이 구합니다. 어떤 과학자가 발표한 논문 n편 중, h번 이상 인용된 논문이 h편 이상이고 나머지 논문이 h번 이하 인용되었다면 h의 최댓값이 이 과학자의 H-Index입니다. 어떤 과학자가 발표한 논문의 인용 횟수를 담은 배열 citations가 매개변수로 주어질 때, 이 과학자의 H-Index를 return 하도록 solution 함수를 작성해주세요. 제한사항 과학자가 발표한 논문의 수는 1편 이상 1,000편 이하입니다. 논문별 인용 횟수는 0회 이상 10,000회 이하입니다. 입출력 예 citations ret..

Tistory

[Java/자바] 프로그래머스 Lv2 - 행렬의 곱셈

문제 풀이 2차원 행렬 arr1과 arr2를 입력받아, arr1에 arr2를 곱한 결과를 반환하는 함수, solution을 완성해주세요. 제한 조건 행렬 arr1, arr2의 행과 열의 길이는 2 이상 100 이하입니다. 행렬 arr1, arr2의 원소는 -10 이상 20 이하인 자연수입니다. 곱할 수 있는 배열만 주어집니다. 입출력 예 arr1 arr2 return [[1, 4], [3, 2], [4, 1]] [[3, 3], [3, 3]] [[15, 15], [15, 15], [15, 15]] [[2, 3, 2], [4, 2, 4], [3, 1, 4]] [[5, 4, 3], [2, 4, 1], [3, 1, 1]] [[22, 22, 11], [36, 28, 18], [29, 20, 14]] Solutio..

Tistory

[Java/자바] Scanner 클래스 (입력받기)

Scanner 클래스란? Scanner란 사용자로 부터 입력을 받을 수 있도록 도와주는 것으로, 간단한 예시를 보자면, 사용자가 게임에 로그인하기 위해, 아이디와 비밀번호를 입력하는 것과 같습니다. Scanner는 다음과 같은 특징을 가집니다. - 기본적인 데이터 타입을 모두 입력받을 수 있다. - 토큰을 기준으로 데이터를 입력받는다. (*토큰 : 공백 문자(Spacebar), 탭(Tab), 개행(Enter) 등으로 구분되는 요소*) - nextLine()은 띄어쓰기를 포함해 읽고, 나머지 메서드들은 띄어쓰기, 공백문자를 제외하고 읽는다. Scanner 클래스 사용 import java.util.Scanner; Scanner input = new Scanner(System.in); System.in 이란..

Tistory

[Java/자바] 프로그래머스 Lv2 - 점프와 순간이동

문제 설명 OO 연구소는 한 번에 K 칸을 앞으로 점프하거나, (현재까지 온 거리) x 2 에 해당하는 위치로 순간이동을 할 수 있는 특수한 기능을 가진 아이언 슈트를 개발하여 판매하고 있습니다. 이 아이언 슈트는 건전지로 작동되는데, 순간이동을 하면 건전지 사용량이 줄지 않지만, 앞으로 K 칸을 점프하면 K 만큼의 건전지 사용량이 듭니다. 그러므로 아이언 슈트를 착용하고 이동할 때는 순간 이동을 하는 것이 더 효율적입니다. 아이언 슈트 구매자는 아이언 슈트를 착용하고 거리가 N 만큼 떨어져 있는 장소로 가려고 합니다. 단, 건전지 사용량을 줄이기 위해 점프로 이동하는 것은 최소로 하려고 합니다. 아이언 슈트 구매자가 이동하려는 거리 N이 주어졌을 때, 사용해야 하는 건전지 사용량의 최솟값을 return..

Tistory

[Java/자바] 프로그래머스 Lv2 - 멀리 뛰기(DP알고리즘)

문제 설명 효진이는 멀리 뛰기를 연습하고 있습니다. 효진이는 한번에 1칸, 또는 2칸을 뛸 수 있습니다. 칸이 총 4개 있을 때, 효진이는 (1칸, 1칸, 1칸, 1칸) (1칸, 2칸, 1칸) (1칸, 1칸, 2칸) (2칸, 1칸, 1칸) (2칸, 2칸) 의 5가지 방법으로 맨 끝 칸에 도달할 수 있습니다. 멀리뛰기에 사용될 칸의 수 n이 주어질 때, 효진이가 끝에 도달하는 방법이 몇 가지인지 알아내, 여기에 1234567를 나눈 나머지를 리턴하는 함수, solution을 완성하세요. 예를 들어 4가 입력된다면, 5를 return하면 됩니다. 제한 사항 n은 1 이상, 2000 이하인 정수입니다. 입출력 예 n result 4 5 3 3 Solution.java 이 문제는 DP 알고리즘을 활용하여 풀 수..

Tistory

[Java/자바] 프로그래머스 Lv2 - N개의 최소공배수 (유클리드 호재법)

문제 설명 두 수의 최소공배수(Least Common Multiple)란 입력된 두 수의 배수 중 공통이 되는 가장 작은 숫자를 의미합니다. 예를 들어 2와 7의 최소공배수는 14가 됩니다. 정의를 확장해서, n개의 수의 최소공배수는 n 개의 수들의 배수 중 공통이 되는 가장 작은 숫자가 됩니다. n개의 숫자를 담은 배열 arr이 입력되었을 때 이 수들의 최소공배수를 반환하는 함수, solution을 완성해 주세요. 제한 사항 arr은 길이 1이상, 15이하인 배열입니다. arr의 원소는 100 이하인 자연수입니다. 입출력 예 arr result [2,6,8,14] 168 [1,2,3] 6 Solution.java 이 문제를 풀기위해선 유클리드 호재법을 사용합니다. 저번 Lv1 문제를 풀면서 유클리드 호..

Tistory

[Java/자바] 프로그래머스 Lv2 - 예상 대진표

문제 설명 게임대회가 개최되었습니다. 이 대회는 N명이 참가하고, 토너먼트 형식으로 진행됩니다. N명의 참가자는 각각 1부터 N번을 차례대로 배정받습니다. 그리고, 1번↔2번, 3번↔4번, ... , N-1번↔N번의 참가자끼리 게임을 진행합니다. 각 게임에서 이긴 사람은 다음 라운드에 진출할 수 있습니다. 이때, 다음 라운드에 진출할 참가자의 번호는 다시 1번부터 N/2번을 차례대로 배정받습니다. 만약 1번↔2번 끼리 겨루는 게임에서 2번이 승리했다면 다음 라운드에서 1번을 부여받고, 3번↔4번에서 겨루는 게임에서 3번이 승리했다면 다음 라운드에서 2번을 부여받게 됩니다. 게임은 최종 한 명이 남을 때까지 진행됩니다. 이때, 처음 라운드에서 A번을 가진 참가자는 경쟁자로 생각하는 B번 참가자와 몇 ..

Tistory

[Java/자바] SimpleDateFormat 클래스 (날짜 데이터 출력)

Date와 Calendar로 날짜를 계산할 수 있지만, 이 두 클래스만으로 날짜 데이터를 원하는 형태로 다양하게 출력하는 것은 불편합니다. 그래서 날짜 데이터를 원하는 형태로 출력하기 위해 SimpleDateFormat를 사용합니다. SimpleDateFormat 작성에 사용되는 기호 표 기호 의미 G BC (기원전) / AC (기원후) y 년도 M 월(1 ~ 12) w 년의 몇 번째 주(1 ~ 53) W 월의 몇 번째 주(1 ~ 5) D 년의 몇 번째 일(1 ~ 366) d 월의 몇 번째 일(1 ~ 31) F 월의 몇 번째 요일(1 ~ 5) E 요일 a 오전(AM) / 오후(PM) H 시간(0 ~ 23) k 시간(1 ~ 24) K 오전/오후 시간 (0 ~ 11) h 오전/오후 시간 (1 ~ 12) m ..

Tistory

[Java/자바] 프로그래머스 Lv2 - 영어 끝말잇기

문제 설명 1부터 n까지 번호가 붙어있는 n명의 사람이 영어 끝말잇기를 하고 있습니다. 영어 끝말잇기는 다음과 같은 규칙으로 진행됩니다. 1번부터 번호 순서대로 한 사람씩 차례대로 단어를 말합니다. 마지막 사람이 단어를 말한 다음에는 다시 1번부터 시작합니다. 앞사람이 말한 단어의 마지막 문자로 시작하는 단어를 말해야 합니다. 이전에 등장했던 단어는 사용할 수 없습니다. 한 글자인 단어는 인정되지 않습니다. 다음은 3명이 끝말잇기를 하는 상황을 나타냅니다. tank → kick → know → wheel → land → dream → mother → robot → tank 위 끝말잇기는 다음과 같이 진행됩니다. 1번 사람이 자신의 첫 번째 차례에 tank를 말합니다. 2번 사람이 자신의 첫 번째 차례에 ..

Tistory

[Java/자바] 프로그래머스 Lv2 - 구명보트 (greedy 탐욕법)

문제 설명 무인도에 갇힌 사람들을 구명보트를 이용하여 구출하려고 합니다. 구명보트는 작아서 한 번에 최대 2명씩 밖에 탈 수 없고, 무게 제한도 있습니다.s 예를 들어, 사람들의 몸무게가 [70kg, 50kg, 80kg, 50kg]이고 구명보트의 무게 제한이 100kg이라면 2번째 사람과 4번째 사람은 같이 탈 수 있지만 1번째 사람과 3번째 사람의 무게의 합은 150kg이므로 구명보트의 무게 제한을 초과하여 같이 탈 수 없습니다. 구명보트를 최대한 적게 사용하여 모든 사람을 구출하려고 합니다. 사람들의 몸무게를 담은 배열 people과 구명보트의 무게 제한 limit가 매개변수로 주어질 때, 모든 사람을 구출하기 위해 필요한 구명보트 개수의 최솟값을 return 하도록 solution 함수를 작성해주세..

Tistory

[Java/자바] 프로그래머스 Lv2 - 다음 큰 숫자

문제 설명 자연수 n이 주어졌을 때, n의 다음 큰 숫자는 다음과 같이 정의 합니다. 조건 1. n의 다음 큰 숫자는 n보다 큰 자연수 입니다. 조건 2. n의 다음 큰 숫자와 n은 2진수로 변환했을 때 1의 갯수가 같습니다. 조건 3. n의 다음 큰 숫자는 조건 1, 2를 만족하는 수 중 가장 작은 수 입니다. 예를 들어서 78(1001110)의 다음 큰 숫자는 83(1010011)입니다. 자연수 n이 매개변수로 주어질 때, n의 다음 큰 숫자를 return 하는 solution 함수를 완성해주세요. 제한 사항 n은 1,000,000 이하의 자연수 입니다. 입출력 예 n result 78 83 15 23 Solution.java class Solution { public int solution(int ..

Tistory

[Java/자바] 프로그래머스 Lv2 - 카펫

문제 설명 Leo는 카펫을 사러 갔다가 아래 그림과 같이 중앙에는 노란색으로 칠해져 있고 테두리 1줄은 갈색으로 칠해져 있는 격자 모양 카펫을 봤습니다. Leo는 집으로 돌아와서 아까 본 카펫의 노란색과 갈색으로 색칠된 격자의 개수는 기억했지만, 전체 카펫의 크기는 기억하지 못했습니다. Leo가 본 카펫에서 갈색 격자의 수 brown, 노란색 격자의 수 yellow가 매개변수로 주어질 때 카펫의 가로, 세로 크기를 순서대로 배열에 담아 return 하도록 solution 함수를 작성해주세요. 제한사항 갈색 격자의 수 brown은 8 이상 5,000 이하인 자연수입니다. 노란색 격자의 수 yellow는 1 이상 2,000,000 이하인 자연수입니다. 카펫의 가로 길이는 세로 길이와 같거나, 세로 길이보다 ..

Tistory

[Java/자바] 프로그래머스 Lv2 - 짝지어 제거하기

문제 설명 짝지어 제거하기는, 알파벳 소문자로 이루어진 문자열을 가지고 시작합니다. 먼저 문자열에서 같은 알파벳이 2개 붙어 있는 짝을 찾습니다. 그다음, 그 둘을 제거한 뒤, 앞뒤로 문자열을 이어 붙입니다. 이 과정을 반복해서 문자열을 모두 제거한다면 짝지어 제거하기가 종료됩니다. 문자열 S가 주어졌을 때, 짝지어 제거하기를 성공적으로 수행할 수 있는지 반환하는 함수를 완성해 주세요. 성공적으로 수행할 수 있으면 1을, 아닐 경우 0을 리턴해주면 됩니다. 예를 들어, 문자열 S = baabaa 라면 b aa baa → bb aa → aa → 의 순서로 문자열을 모두 제거할 수 있으므로 1을 반환합니다. 제한사항 문자열의 길이 : 1,000,000이하의 자연수 문자열은 모두 소문자로 이루어져 있습니다. ..

Tistory

[Java/자바] Join과 Split을 이용한 문자열 제어

Join ( 문자열을 만드는 메서드 ) join 메서드는 문자열 배열이나 List를 파리미터에 입력한 "합칠 문자"와 합쳐진 문자열을 반환합니다. join("합칠 문자", 대상) import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { String[] strArr = {"A", "B", "C", "D"}; List animals = new ArrayList(List.of("고양이", "치타", "코끼리", "호랑이")); System.out.println(String.join(" ", strArr)); System.out.println(String.join("..

Tistory

[Java/자바] 날짜와 시간 (Date, calendar)

Date와 Calendar Date 클래스는 날짜와 시간에 관한 정보를 표현하는 클래스로 JDK 1.0부터 제공되어온 클래스이며 Calendar 클래스는 Date 클래스의 부족한 기능이 추가되어 날짜 연산을 유용하게 할 수 있도록 JDK 1.1부터 제공하기 시작했습니다. Calendar이 Date보다는 훨씬 나았지만 점점 몇가지 단점들이 발견되었고, 후에 JDK 1.8부터 'java.time 패키지'로 기존의 단점들을 개선한 새로운 클래스들이 추가되었습니다. p.s : 두 클래스의 차이점을 알아보니 date와 calendar를 사용함으로써 문제점들이 발생해 많은 사람들이 "Joda-Time"이라는 오픈소스 라이브러리를 사용한다고 합니다. Calendar 객체 생성 Calendar는 추상클래스이기 때문에 ..

Tistory

[Java/자바] 프로그래머스 Lv2 - 피보나치 수

문제 설명 피보나치 수는 F(0) = 0, F(1) = 1일 때, 1 이상의 n에 대하여 F(n) = F(n-1) + F(n-2) 가 적용되는 수 입니다. 예를들어 F(2) = F(0) + F(1) = 0 + 1 = 1 F(3) = F(1) + F(2) = 1 + 1 = 2 F(4) = F(2) + F(3) = 1 + 2 = 3 F(5) = F(3) + F(4) = 2 + 3 = 5 와 같이 이어집니다. 2 이상의 n이 입력되었을 때, n번째 피보나치 수를 1234567으로 나눈 나머지를 리턴하는 함수, solution을 완성해 주세요. 제한 사항 n은 2 이상 100,000 이하인 자연수입니다. 입출력 예 n return 3 2 5 5 입출력 예 설명 피보나치수는 0번째부터 0, 1, 1, 2, 3, ..

Tistory

[Java/자바] map - getOrDefault의 활용

getOrDefault(Object key, V DefaultValue) 찾는 key가 존재한다면 찾는 key의 value값을 반환하고, 없다면 DefaultValue를 반환합니다. key map의 key 요소 DefaultValue 지정된 키로 매핑된 값이 없는 경우 반환할 기본 값 예시 코드 import java.util.HashMap; import java.util.Map; public class test { public static void main(String arg[]) { String [] abc = { "A", "B", "C" ,"A", "B"}; Map map = new HashMap(); for(String key : abc) { hm.put(key, hm.getOrDefault(key..

Tistory

[Java/자바] 숫자 천자리 구분, 소수점 표기 방법(DecimalFormat)

DecimalFormat 클래스 자바에서는 숫자의 Format을 변경할 수 있는 클래스를 제공하는데, NumberFormat을 상속받는 DecimalFormat클래스를 이용해 천자리마다 구분선을 넣는다던가, 소숫점 몇자리까지 포함할 것인지 정할 수 있습니다. 패턴 의미 0 10진수, 빈자리는 0으로 채운다. # 10진주, 빈자리는 채우지 않는다. . 소수점 표시 , 단위 구분 기호 표시 +, - 음수, 양수 표시 E 지수 문자 ; 양수와 음수 패턴을 모두 사용할 경우 패턴 구분자 % 100을 곱하고 %를 붙인다. \u00A4 통화 표시 \을 붙인다. 예시 코드 import java.text.DecimalFormat; import java.text.NumberFormat; import java.util.L..

Tistory

[Java/자바] Map에서 value값으로 key찾기

keySet()을 이용한 방법 keySet() 메서드는 HashMap의 모든 key들을 Set로 리턴합니다. 리턴한 Set의 key로 value를 가져와서, 찾고자하는 value값을 조건식으로 비교하여 해당 value의 key를 찾을 수 있습니다. import java.util.HashMap; import java.util.Map; public class Main { public static void main(String[] args) { Map grade = new HashMap(); grade.put("철수", 100); grade.put("짱구", 30); grade.put("훈이", 60); grade.put("맹구", 20); grade.put("유리", 90); for (String key :..

Tistory

[Java/자바] 프로그래머스 - 푸드 파이트 대회

문제 설명 수웅이는 매달 주어진 음식을 빨리 먹는 푸드 파이트 대회를 개최합니다. 이 대회에서 선수들은 1대 1로 대결하며, 매 대결마다 음식의 종류와 양이 바뀝니다. 대결은 준비된 음식들을 일렬로 배치한 뒤, 한 선수는 제일 왼쪽에 있는 음식부터 오른쪽으로, 다른 선수는 제일 오른쪽에 있는 음식부터 왼쪽으로 순서대로 먹는 방식으로 진행됩니다. 중앙에는 물을 배치하고, 물을 먼저 먹는 선수가 승리하게 됩니다. 이때, 대회의 공정성을 위해 두 선수가 먹는 음식의 종류와 양이 같아야 하며, 음식을 먹는 순서도 같아야 합니다. 또한, 이번 대회부터는 칼로리가 낮은 음식을 먼저 먹을 수 있게 배치하여 선수들이 음식을 더 잘 먹을 수 있게 하려고 합니다. 이번 대회를 위해 수웅이는 음식을 주문했는데, 대회의 조건..

Tistory

[Java/자바] List와 String(문자열, 배열)을 서로 변환하는 법

List ↔ String List를 String으로 간단히 변환 join() 메서드 활용 List list = new ArrayList(); String answer = String.join(",",list); String을 List로 변환 split() 메서드 활용 String s = "sample"; String[] strArr = s.split(""); // [s, a, m, p, l, e] ArrayList list = new ArrayList(Arrays.asList(strArr)); String s ="string of words"; String[] strArr = s.split(" "); // [string, of, words] ArrayList list = new ArrayList(Arra..

Tistory

[Java/자바] 정규식(Regular Expression) 사용법 총정리

정규식이란 텍스트 데이터 중에서 원하는 조건(Pattern)과 일치하는 문자열을 찾아 내기 위해 사용하는 것으로, 정규식을 이용하면 많은 양의 텍스트 파일 중에서 원하는 데이터를 손쉽게 뽑아낼 수도 있고, 입력된 데이터가 형식에 맞는지 체크할 수 도 있습니다. java.util.regex패키지 public static void main(String[] args) { String[] data = {"bat", "baby", "bonus", "cA", "ca", "co", "c.", "c0", "car", "combat", "count", "date", "disc"}; Pattern p = Pattern.compile("c[a-z]*"); // c로 시작하는 소문자영단어 for (int i = 0; i < ..

Tistory

[Java/자바] 프로그래머스 - 체육복/Greedy(탐욕법) 알고리즘

문제 설명 점심시간에 도둑이 들어, 일부 학생이 체육복을 도난당했습니다. 다행히 여벌 체육복이 있는 학생이 이들에게 체육복을 빌려주려 합니다. 학생들의 번호는 체격 순으로 매겨져 있어, 바로 앞번호의 학생이나 바로 뒷번호의 학생에게만 체육복을 빌려줄 수 있습니다. 예를 들어, 4번 학생은 3번 학생이나 5번 학생에게만 체육복을 빌려줄 수 있습니다. 체육복이 없으면 수업을 들을 수 없기 때문에 체육복을 적절히 빌려 최대한 많은 학생이 체육수업을 들어야 합니다. 전체 학생의 수 n, 체육복을 도난당한 학생들의 번호가 담긴 배열 lost, 여벌의 체육복을 가져온 학생들의 번호가 담긴 배열 reserve가 매개변수로 주어질 때, 체육수업을 들을 수 있는 학생의 최댓값을 return 하도록 solution 함수를..

Tistory

[Java/자바] 프로그래머스 - 소수 찾기 (에라토스테네스의 체)

문제 설명 1부터 입력받은 숫자 n 사이에 있는 소수의 개수를 반환하는 함수, solution을 만들어 보세요. 소수는 1과 자기 자신으로만 나누어지는 수를 의미합니다. (1은 소수가 아닙니다.) 제한 조건 n은 2이상 1000000이하의 자연수입니다. 입출력 예 n result 10 4 5 3 Solution.java public int solution(int n) { int answer = 0; // 0 ~ n 까지의 수를 가지는 배열 생성 int[] arr = new int[n + 1]; // 소수 중 제일 작은 수는 2이므로 2부터 시작한다. for (int i = 2; i

Tistory

[Java/자바] Enum(열거형)이란?

열거형은 서로 연관된 상수를 편리하게 선언하기 위한 것으로, 여러 상수를 정의할때 사용하기 좋습니다. 서로 연관된 상수라 함은 아래의 간단한 예시 코드처럼 DOOR와 WHEEL은 String 타입으로 서로 연관된 상수라 할 수 있습니다. enum Car { DOOR("4개의 문을 가진 차"), WHEEL("자동차의 바퀴"); } 열거형의 정의와 사용 아래 처럼 중괄호{}안에 상수의 이름을 나열하기만 하면 됩니다. enum 열거형이름 { 상수명1, 상수명2, .... } 이 열거형에 정의된 상수를 사용하는 방법은 "열거형이름.상수명"으로 클래스의 static 변수를 참조하는 것과 동일합니다. 또한 열거형 상수간의 비교에는 "eqauls()와 "=="를 사용할 수 있는데, ""와 같은 비교연산자는 사용할 수..

Tistory

자바 코딩 컨벤션(Java Code Conventions)

Code Conventions(코딩 규칙)을 왜 알아야 할 까 ? 개발하는 과정 속에서 구현하는 비용보다 유지보수의 비용이 더 크게 들어가는데 프로젝트나 소프트웨어 개발을 하면서 작성한 코드를 나만 보는 것이 아니라 참여한 모든 개발자들이 보게 됩니다. 하지만 나만의 방식으로 코드를 짰다면 다른 사람들이 봤을 때 이해하기가 힘들겠죠. 예를 들자면 나만의 독특한 글씨체로 글을 쓴 편지를 친구에게 보냈는데 그 친구가 그 편지를 읽는데에 해독이 필요한 것처럼요. 그래서 Code Conventions이 필요합니다. 정해진 Code Conventions에 맞춰 코드를 작성하게 된다면 나 외의 다른 사람들도 코드를 해석하는데 빠르게 이해할 수 있어 지게 되므로 가독성이 좋아지게 됩니다. 이 포스팅에서 설명할 컨벤션..

Tistory

[우아한테크코스 백엔드 5기] 프리코스 3주차 후기 (로또)

안녕하세요 ~ 2주차 후기 이후로 오랜만에 포스팅하네요 하하.. 이번 3주차 미션의 난이도도 어렵기도 했고 욕심을 가지고 하다보니 포스팅 할 시간이 부족하더라구요 아직 정리 할 내용들이 산더미 처럼 많은데 마지막 프리코스가 끝나고 폭풍 정리 시작해야겠습니다 c 제가 작성한 코드는 이곳을 클릭하여 보실 수 있습니다. 프리코스 3주차 - 로또 미션 이번 3주차 미션은 로또 미션이였는데요 2주차 미션의 요구사항에서 다음과 같이 요구사항이 추가되었습니다. 그리고 다음과 같이 미리 작성된 Lotto 클래스를 이용하여 로또 게임을 구현하는 제한사항이 주어졌습니다. 로또 게임을 완성한 후 실행 결과 예시입니다. 구입금액을 입력해 주세요. 8000 8개를 구매했습니다. [8, 21, 23, 41, 42, 43] [3..

Tistory

[우아한테크코스 백엔드 5기] 프리코스 4주차 후기 (다리 건너기)

4주간 진행되었던 프리코스 마지막을 장식할 미션은 바로 다리 건너기 게임입니다. 기능 요구 사항은 아래와 같으며 마지막 요구사항인 만큼 추가된 요구사항들이 정~~말 많았는데요 그 만큼 새로 느끼고 배우는 점들도 많았고 요구사항들에 맞춰 리팩토링 하는 재미가 쏠쏠했었습니다 ㅎㅎ 4주차 다리 건너기 미션 : https://github.com/SuhHyeonjun/java-bridge 직접 작성한 코드 : https://github.com/woowacourse-precourse/java-bridge/pull/131 이번 4주차의 목표는 요구사항도 많아 졌고, 이전 미션들에서 받았던 피드백들을 합쳐서 좀 많았습니다 확실히 이렇게 목표 체크리스트를 만들고 나니 과제를 완성한 후 목표를 하나씩 지켰는지 확인하는 과..

Tistory

[Java/자바] JUnit5 Assertions 예제 정리

이번 포스팅에선 JUnit5의 Assertions으로 테스트 코드 작성하는 법에 대해 알아보고자 합니다. JUnit5의 어노테이션과 메서드들은 아래 링크에 설명해놨으니 참고 하시면 됩니다. [Java/자바] JUnit5란? JUnit5 이란 ? Java 개발자가 가장 많이 사용하는 테스팅 프레임워크로, JAVA 8 버전부터 사용 가능하며 테스트 주도 개발(TDD, Test Driven Development)을 위해 사용됩니다. 요구사항을 검증하는 테스트 케 hstory0208.tistory.com JUnit 5 Assertions assertArrayEquals 예상 배열(expected)과 실제 배열(actual))이 동일한지 확인합니다. 두 배열이 일치 하지 않다면, 마지막 인자인 메세지가 출력됩니다..

Tistory

MVC 디자인 패턴이란?

MVC란 ? MVC 패턴의 등장 하나의 서블릿이나 JSP만으로 비즈니스 로직과 뷰 렌더링까지 모두 처리하게 되면, 너무 많은 역할을 하게됩니다. 그렇게 되면 비즈니스 로직을 호출하는 부분에 변경이 발생해도 해당 코드를 손대야 하고, UI를 변경할 일이 있어도 비즈니스 로직이 함께 있는 해당 파일을 수정해야 하기 때문에 유지보수가 어려워집니다. HTML 코드 하나 수정하거나 비즈니스 로직하나를 수정하는데, 수백 수천줄의 HTML코드나 자바 코드가 함께 있다면 정말 지옥일 겁니다 c 그래서 이러한 문제를 해결하고자 MVC 패턴이 등장하게 되었습니다. MVC 는 Model - View - Controller의 약자로, 하나의 애플리케이션, 프로젝트를 구성할 때 그 구성요소를 3가지로 구분한 패턴입니다. Mod..

Tistory

[Java/자바] 람다식(Lambda)이란? 그리고 사용법

람다식이란 ? 람다식이란 쉽게 말해 메서드를 "하나의 식"으로 표현한 것입니다. 하나의 식으로 표현하여 훨씬 간략하게 표현이 가능하게 되며, 메서드의 이름과 반환값이 없어지므로 "익명함수"라고도 합니다. int[] arr = new int[5] Arrays.setAll(arr, (i) -> (int) (Math.random() * 5) + 1); // (i) - (int) (Math.random() * 5) + 1 람다식을 메서드로 표현 int method() { return (int) (Math.random() * 5) + 1; } 위 코드에서는 int배열 arr에 setAll의 두 번째 인자로 채우는 코드를 가지고 있습니다. (i) -> (int) (Math.random() * 5) + 1 가 람다식..

Tistory

[Java/자바] JUnit5란?

JUnit5 이란 ? Java 개발자가 가장 많이 사용하는 테스팅 프레임워크로, JAVA 8 버전부터 사용 가능하며 테스트 주도 개발(TDD, Test Driven Development)을 위해 사용됩니다. 요구사항을 검증하는 테스트 케이스 작성 테스트 통과를 위한 코드 작성 이후 작성된 테스트 케이스 실행 테스트 케이스 오류가 나는 부분을 찾아 리팩토링하여 실제 개발 코드에 적용 JUnit 모듈 구성 JUnit 5는 크게 3개의 요소로 구성되어 있습니다. JUnit Platform 테스트를 발견하고 계획을 생성하고 결과를 보고하는 TestEngine 인터페이스를 정의합니다. 테스팅 프레임워크를 구동하기 위한 런처와 테스트 엔진을 위한 API를 제공 JUnit Jupiter Junit5 TestEngin..

Tistory

[Java/자바] 접근제어자(Access Modifier)란?

접근 제어자는 멤버 또는 클래스에 사용하여 해당하는 멤버 또는 클래스를 외부에서 접근하지 못하도록 제한하는 역할을 합니다. 만약 멤버 또는 클래스 앞에 접근 제어자가 지정되어 있지 않다면, 접근 제어자가 default임을 뜻합니다. 주의할 점으로 하나의 소스파일(*.java)에는 public 클래스가 단 하나만 존재할 수 있으며, 소스파일의 이름은 반드시 public 클래스의 이름과 같아야 합니다. 접근 제어자를 사용하는 이유는 다음과 같습니다. 외부로부터 데이터를 보호하기 위해 외부에는 불필요한, 내부적으로만 사용되는, 부분을 감추기 위해 접근 제어자가 사용될 수 있는 곳 클래스 멤버변수 메서드 생성자 접근 제한자의 사용 범위 public : 접근 제한이 전혀 없다. protected : 같은 패키지 ..

Tistory

[우아한테크코스 백엔드 5기] 프리코스 2주차 후기 (숫자 야구 게임)

드디어 본격적인 시작을 알리는 2주차가 시작되었습니다 ! 2주차는 1주차에서 배운 점들을 최대한 적용하여 과제를 진행하기 위해 다음과 같이 2주차 목표를 세웠습니다. 저는 제 나름대로 이 목표들을 다 달성해서 제출했다고 생각하지만 과연 이 목표대로 이번 과제를 잘 했는지 결과가 궁금하네요 cc 이번 2주차 숫자 야구 게임 역시 배우고 느낀 점들이 참 많았는데요. 그 내용들에 대해 하나씩 정리해보자 합니다. 새롭게 배운 것과 느낀 점들 인텔리제이 사용 1주차는 이때까지 자바의 정석을 독학하면서 이클립스를 사용해 익숙한 이클립스를 사용했었습니다. 그리고 이클립스와 인텔리제이의 차이점을 검색했을 때 이클립스는 무료인 반면 인텔리제이는 유료라는 말이 있었기 때문에 이클립스를 사용하고 있기도 했었습니다. 하지만 ..

Tistory

[Java/자바] Stream(스트림)이란? 사용법 총정리

자바에서는 많은 양의 데이터를 저장하기 위해서 배열이나 컬렉션을 이용합니다. 이렇게 저장된 데이터에 접근하기 위해서는 반복문이나 반복자(iterator)를 사용하여 매번 새로운 코드를 작성해왔습니다. 하지만 이러한 방식으로 작성된 코드는 너무 길고 가독성도 떨어지며 코드의 재사용도 떨어집니다. 또 다른 문제는 데이터 소스마다 다른 방식으로 다뤄야한다는 점입니다. Collection이나 Iterator와 같은 인터페이스의 각 컬렉션 클래스에는 같은 기능의 메서드들이 중복해서 정의되어 있습니다. 예를 들면, List를 정렬할 때는 Collections.sort()를 사용하고, 배열을 정렬할 때는 Arrays.sort()를 사용한다는 점입니다. 이러한 문제를 극복하기 위해 나온 것이 바로 Stream입니다. ..

Tistory

[우아한테크코스 백엔드 5기] 프리코스 1주차 회고 (온보딩)

경험이 많이 없는 저는 대체 뭘 공부해야 하고 어떻게 준비하고 어떤 경험들을 해야 좋은회사에 들어갈 수 있는지에 대해 전혀 몰랐습니다. 그래서 여러 검색들을 통해 많은 사람들이 추천하는 책을 사서 실습해보고 최대한 github을 많이 이용하면서 새롭게 배운 지식들을 정리하고, 복습하며 독학하고 있었습니다. 공부하면서 글로는 이해가 안되는 개념들은 주로 영상을 통해 이해하는 편인데요. 그중 유튜브 테코톡을 자주 애용했었기 때문에 우아한테크코스가 무엇인지는 알고 있었고, 우아한테크코스에 대해 알아보기도 하였었습니다. 그 당시 알아봤을 때는 비전공자는 지원할 수 없는 영역의 교육인지 알았었는데, 이번 우아한테크코스 5기 일정이 나오게 되면서 보니 비전공자도 지원이 가능했었습니다! 그래서 우아한테크코스5기 백엔..

Tistory

[Java/자바] Stream 변환 표

Stream 기본형 Stream From To 변환 메서드 Stream IntStream LongStream DoubleStream mapToInt(ToIntFunction mapper) MapToLong(ToLongFunction mapper) MapToDouble(ToDoubleFunction mapper) 기본형 Stream Stream From To 변환 메서드 IntStream LongStream DoubleStream Stream Stream Stream boxed() Stream mapToObj(DoubleFunction mapper) 기본형 Stream 기본형 Stream From To 변환 메서드 IntStream LongStream DoubleStream LongStream ..

Tistory

[Java/자바] HashSet과 HashMap의 차이점

HashSet과 HashMap의 차이점 HashSet과 HashMap을 공부하다보면 이런 의문이 들 것입니다. 비슷한거 같은데 대체 뭐가 다르지 ? 이번에 이 두 컬렉션 클래스들을 정리하면서 의문이 들었기에 이번 포스팅에서는 차이점을 비교해 보려 합니다. HashSet과 HashMap 비교 표 HashSet HashMap 구현 Set의 구현체 Map의 구현체 중복허용 여부 객체 자체를 데이터로 저장하기 때문에 중복 X key는 중복을 허용 X value는 중복을 허용한다. 데이터 저장 객체(Object)만 저장할 수 있다. 내부적으로 HashMap을 사용하기 때문에 삽입되는 객체(Key값)와 dummy 객체(Value 값), 삽입 연산 동안 총 두 개의 객체가 생성 데이터를 key-value 쌍 형식으로..

Tistory

[Java/자바] 제네릭스(Generics)란 ?

컬렉션 클래스들 타입 다음에 , , 등으로 붙여진 형식들을 많이 보셨을건데, 이게 바로 제네릭스입니다. 제네릭스란 클래스가 가질 타입을 미리 명시해줌으로써 제네릭스를 사용한 클래스의 객체가 형변환을 하지 않고 사용할 수 있도록 해줍니다. 하지만 만약 List list = new ArrayList(); 로 제네릭스를 명시했는데 이 list 객체에 Integer 타입을 넣게 된다면 컴파일 에러가 발생하므로 제네릭스를 정하면 그 제네릭스에 맞는 타입을 사용해야 합니다. 제네릭스의 장점 1. 타입의 안정성을 제공한다. 2. 타입체크와 형변환을 생략할 수 있으므로 코드가 간결해진다. 대표적인 제네릭스의 타입 타입 제네릭스는 Object로 모든 종류의 타입을 지정 가능 합니다. 타입 설명 Object Element..

Tistory

[Java/자바] TreeSet 사용법

TreeSet은 이진 검색 트리(binary search tree)라는 자료구조의 형태로 데이터를 저장하는 컬렉션 클래스입니다. 이진 검색 트리는 정렬, 검색, 범위검색(range search)에 높은 성능을 보이며 TreeSet은 이진 검색 트리의 성능을 향상시킨 "레드-블랙 트리(Red-Black tree)"로 구현되어 있습니다. 그리고 Set 인터페이스를 구현했으므로 중복된 데이터의 저장을 허용하지 않고, 저장순서를 유지하지 않습니다. 이진 트리는 LinkedList처럼 여러 개의 노드(node)가 서로 연결된 구조로, 각 노드에 최대 2개의 노드를 연결할 수 있으며, "루트(root)"라고 불리는 하나의 노드에서 시작해 계속 확장해 나갈 수 있습니다. 위 아래로 연결된 두 노드를 "부모 - 자식 ..

Tistory

[Java/자바] 배열(Array)을 리스트(List)로 변환

이번 포스팅에선 배열 [ ] 을 List로 변환하는 방법을 설명하고자 합니다. 이 내용을 이해하기 위해선 기본형과 참조형에 대한 이해가 필요합니다. 기본형과 참조형에 대해 알고 싶으시다면 아래 포스팅을 참고하시면 됩니다. Java - 변수의 타입 (기본형과 참조형) data의 type 우리가 주로 사용하는 값 ( data ) 의 종류 ( type )은 크게 "문자와 숫자"로 나눌 수 있으며, 숫자는 다시 "정수와 실수"로 나눌 수 있습니다. 이런 값( data )의 종류 ( type )에 따라 값이 저장 hstory0208.tistory.com String[ ] ↔ List로 변환 String[ ]배열을 List로 변환 import java.util.*; import java.util.Arrays; pu..

Tistory

[Java/자바] HashMap 클래스 사용법

HashMap은 Map 인터페이스를 구현하여 Map의 특징 키(key)와 값(value)를 묶어서 하나의 데이터(entry)로 저장한다는 특징을 가집니다. 그리고, 해싱(hashing)을 사용하기 때문에 많은 양의 데이터를 검색하는데 있어서 뛰어난 성능을 보여줍니다. HashMap은 키와 값을 각각 Object타입으로 저장합니다. 즉 (Object, Object)의 형태로 저장하기 때문에 어떤 객체도 저장할 수 있지만, 키는 주로 String을 대문자 또는 소문자로 통일해 사용합니다. 키(key) : 컬렉션 내의 키(key) 중에서 유일해야 한다. ( 중복을 허용하지 않는다 ) 값(value) : 키(key)와 달리 데이터의 중복을 허용한다. 키만 중복을 왜 허용하지 않는지에 대한 예로, 아이디와 비밀번..

Tistory

[Java/자바] Collections 클래스

Collections는 클래스로 Collection 인터페이스와 다릅니다. Collections 클래스 안의 메서드들은 static이기 때문에 인스턴스를 생성하지 않고 바로 사용 가능합니다. Collections 클래스는 Collection 인터페이스로 구현한 클래스들에 대한 객체생성, 정렬(sort), 병합(merge), 검색(serch) 등의 기능을 수행하도록 도와주는 클래스입니다. Collection 인터페이스로 구현한 클래스에 대한 설명은 아래 포스팅을 통해 알 수 있습니다. [Java/자바] 컬렉션 프레임워크(Collections Framework) 컬렉션 프레임워크란 "다수의 데이터를 쉽고 효과적으로 처리할 수 있는 표준화된 방법을 제공하는 클래스의 집합을 의미" 합니다. 즉, 데이터를 저장하..

Tistory

[Java/자바] Comparator와 Comparable

Comparable과 Comparator는 인터페이스로 실제 소스는 다음과 같습니다. public interface comparable { public int compareTo(Object o1, Object o2); } public interface comparator { int compare(Object o1, Object o2); boolean equals(Object obj); } 인터페이스이기에 Comparable이나 Comparator을 사용하고자 한다면 인터페이스 내에 선언된 메소드를 반드시 구현해야합니다. compareTo()와 compare()는 선언형태와 이름이 약간 다를 뿐 두 객체를 비교한다는 같은 기능을 목적으로 만들어졌습니다. compareTo() 반환값은 int이지만, 실제로는..

Tistory

[Java/자바] HashSet 클래스 사용법

HashSet HashSet은 Set인터페이스를 구현한 가장 대표적인 컬렉션으로, 중복된 요소를 저장하지 않습니다. 그렇기 때문에 HashSet에 이미 저장되어 있는 요소를 추가하고자 한다면 객체를 저장하기 전에, 먼저 객체의 hashCode()메소드를 호출해서 해시 코드를 얻어낸 다음 저장되어 있는 객체들의 해시 코드와 비교한 뒤 같은 해시 코드가 있다면 다시 equals() 메소드로 두 객체를 비교해서 true가 나오면 동일한 객체로 판단하고 중복 저장을 하지 않습니다. ArrayList와 달리 저장순서를 유지하지 않기 때문에, 저장순서를 유지하고자 한다면 LinkedHashSet을 사용해야합니다. HashSet 선언 import java.util.HashSet; HashSet set = new Ha..

Tistory

[Java/자바] ArrayList 클래스 사용법

ArrayList ArrayList는 List 인터페이스를 구현하기 때문에 데이터의 저장순서가 유지되고 중복을 허용한다는 특징을 가집니다. Object배열을 이용해 데이터를 순차적으로 index는 0부터 시작하고 그 다음은 1,2,3 ~ 순으로 저장됩니다. 만약 배열에 더 이상 저장할 공간이 없으면 보다 큰 새로운 배열을 생성해 기존의 배열에 저장된 내용을 새로운 배열로 복사한 다음 저장됩니다. 또한 선언된 배열의 타입이 모든 객체의 최고조상인 Object이기 때문에 모든 종류의 객체를 담을 수 있습니다. ArrayList 선언 import java.util.ArrayList; ArrayList arraylist1 = new ArrayList(); ArrayList arraylist2 = new Arra..

Tistory

[Java/자바] LinkedList 클래스 사용법

기본적인 형태의 배열 ( array )는 구조가 간단하여 사용하기가 쉽고, 데이터를 읽어오는데 걸리는 시간이 가장 빠르다는 장점을 가지고 있습니다. 하지만 아래와 같은 단점도 가지고 있습니다. Array ( 배열 ) 의 단점 1. 크기를 변경할 수 없다. 크기를 변경할 수 없기 때문에 새로운 배열을 생성해서 데이터를 복사해야한다. 2. 메모리 낭비 실행속도를 향상시키기 위해선 충분히 큰 크기의 배열을 생성해야 하므로 메모리가 낭비된다. 3. 비순차적인 데이터의 추가 또는 삭제에 시간이 많이 걸린다. 차례대로 데이터를 추가하고 마지막에서부터 데이터를 삭제하는 것은 빠르지만, 배열의 중간에 데이터를 추가하려면, 빈자리를 만들기 위해 다른 데이터들을 복사해서 이동해야한다. LinkedList는 이러한 단점을 ..

Tistory

[Java/자바] Iterator, Listlterator 클래스 사용법

Iterator iterator()는 Collection 인터페이스에 정의된 메서드로, Collection 인터페이스의 자손인 List와 Set에도 포함되어 있습니다. 그래서 List나 Set인터페이스를 구현하는 컬렉션은 iterator()가 각 컬렉션의 특징에 맞게 포함되어 있습니다. Map 인터페이스를 구현한 클래스의 경우에는 key - value 쌍으로 저장하기 때문에 iterator()를 직접호출 할 수 없고, keySet()이나 entrySet() 메서드를 통해 키와 값을 Set형태로 얻은 뒤 iterator()를 호출할 수 있습니다. Map map = new HashMap(); Iterator it = map.entrySet().iterator(); iterator() 메서드는 반복문, 주로 ..

Tistory

[Java/자바] 컬렉션 프레임워크(Collections Framework)

컬렉션 프레임워크란 "다수의 데이터를 쉽고 효과적으로 처리할 수 있는 표준화된 방법을 제공하는 클래스의 집합을 의미" 합니다. 즉, 데이터를 저장하는 자료 구조와 데이터를 처리하는 알고리즘을 구조화하여 클래스로 구현해 놓은 것입니다. 또한, 인터페이스와 다형성을 이용한 객체지향적 설계를 통해 표준화되어 있어 재사용성이 높은 코드를 작성할 수 있고, 다수의 데이터를 다루는데 필요하고 다양하고 풍부한 클래스들을 제공하여 프로그래머들에게 편리함을 제공해줍니다. 컬렉션 프레임워크 핵심 인터페이스 컬렉션 프레임워크에서는 데이터를 저장하는 자료 구조에 따라 다음과 같은 3가지 타입이 존재 합니다. 그리고 인터페이스 List와 Set의 공통된 부분을 뽑아서 새로운 인터페이스인 Collection을 추가로 정의하였습니..

Tistory

[알고리즘] 유클리드 호제법 - 최소공배수, 최대공약수 구하기

유클리드 호제법 유클리드 호제법이란, 두 개의 수가 주어졌을 때, 최대공약수를 구하는 알고리즘입니다. 최소공배수는 주어진 두 개의 수를 곱한 값을, 그 두 개의 수의 최대공약수로 나누어 구할 수 있습니다. 최대공약수 : GCD(greatest common divisor) 최소공배수 : LCM(largest common multiple) 유클리드 호제법으로 최대공약수를 구하는 원리 1980과 168의 최소공배수를 유클리드 호제법을 이용하면 다음과 같은 과정을 거치게 됩니다. 1. 1980을 168로 나눕니다. 2. 1980을 168로 나눈 나머지 132와 168을 다시 나눕니다. 3. 168을 132로 나눈 나머지 36과 132를 다시 나눕니다. 4. 나머지가 0이 될때까지 반복합니다. 5. 나머지가 0이..

Tistory

[Java/자바] 인터페이스(interface)란 ?

인터페이스란 ? 인터페이스는 일종의 추상클래스로, 추상메서드를 갖지만 추상클래스보다 추상화 정도가 높아 추상클래스와 달리 몸통을 갖춘 일반 메서드 또는 멤버변수를 구성원으로 가질 수 없습니다. 오직 추상메서드와 상수만을 멤버로 가질 수 있으며, 그 외의 다른 어떠한 요소도 허용되지 않습니다. 추상 클래스를 부분적으로만 완성된 "미완성 설계도"라고 한다면, 인터페이스는 구현된 것은 아무것도 없는 그냥 스케치만 되어 있는 "기본 설계도"라 할 수 있습니다. 인터페이스의 특징 다중 상속이 가능하다. 추상 메서드와 상수만을 가진다. 생성자 생성이 불가능하다. 메서드 오버라이딩이 필수적이다. 인터페이스의 장점 1. 개발시간을 단축시킬 수 있다. 인터페이스를 통해 메서드를 호출하는 쪽에서는 메서드의 내용과 관계없이..

Tistory

[Java/자바] Math 클래스 정리 (feat.삼각함수)

Math클래스는 기본적인 수학계산에 유용한 메서드로 구성되어 있습니다. 이번 포스팅을 통해 Math클래스의 자주 사용되는 메서드에 대해 다뤄볼 것이며 삼각함수 구하는 법도 다뤄보려 합니다. Math 클래스 Math.abs() 주어진 값의 절대값을 반환합니다. public class MathTest { public static void main(String[] args) { int i = Math.abs(-2); double d = Math.abs(-4); System.out.println(i); System.out.println(d); } } Math.sqrt() - ( double형으로 반환 ) 주어진 값의 제곱근 값을 반환합니다. public class MathTest { public static v..

Tistory

[Java/자바] 스택(Stack)과 큐(Queue)

스택(Stack)과 큐(Queue)를 설명하기 앞서 간단하게 알아봅시다. Stack은 LIFO(Last In First Out) 구조로 되어 있으며, 쉽게 해석하면 "후입 선출" 입니다. 즉, 마지막(최근)에 넣은 것을 먼저 뺀다는 말이죠. Queue는 FIFO(First IN First Out) 구조로, Stack과 반대로 "선입 선출" 입니다. 아르바이트하면서 냉장고에 재고 채워넣을 때 선입선출이란말 자주 들어보셨죠 ? 즉, 먼저 넣은 것(오래된 것)을 먼저 뺀다는 말입니다. 스택(Stack)과 큐(Queue) 비교 코드 import java.util.Stack; import java.util.LinkedList; import java.util.Queue; class StackQueueEx { pub..

Tistory

객체지향프로그래밍 (OOP)에 대해 알아보자.

객체지향프로그래밍 ( Object Oriented Programming ) 이란 ? 먼저 OOP를 이해하기 위해선 절차지향적 프로그래밍에 대해 알아야하는데요, 절차 지향 프로그래밍 ( PP : Procedural Programming )에 대해 설명하자면, 순차적인 처리를 중요시하며, 프로그램 전체가 유기적으로 연결되어 있습니다. 그렇기 때문에 프로그램을 이해하기 어렵고 유지보수가 어렵다는 등의 단점이 있지만 속도가 빠르다는 장점이 있습니다. OOP는 위와 같은 절차지향적 프로그래밍의 단점을 보완하기 위해서 만들어졌습니다. 객체란 "실제로 존재하는 것"으로 우리가 주변에서 볼 수 있는 책상, 의자, 컴퓨터와 같은 사물들을 곧 객체라고 할 수 있습니다. 이처럼, 객체지향프로그래밍 ( OOP )은 현실 세계..

Tistory

[Java/자바] String 클래스의 생성자와 메서드

아래의 표는 String클래스 내에 정의된 생성자의 메서드의 목록입니다. 자바의 정석3을 참고해 자주사용되는 것들만을 표로 적었습니다. 메서드/설명 예 제 결 과 String (String s) 주어진 문자열 (s)을 갖는 String 인스턴스를 생성 String s = new String("HI?"); s="HI?" String(char[] value) 주어진 문자열(value)을 갖는 String인스턴스를 생성 char[] c = {'H','e','l','l','o'} String str = new String(c) s= "Hello" String(StringBuffer buf) StringBuffer 인스턴스가 갖고 있는 문자열과 같은 내용의 String인스턴스를 생성 StringBuffer sb ..

Tistory

[Java/자바] StringBuffer 클래스 사용법

String 클래스는 immutable(불변) 불변성을 가졌기 때문에 String 객체를 변경시 실제로 변경되는 것이 아닌 새로운 String 객체를 생성합니다. 즉, 지정된 문자열을 변경할 수 없습니다. 반면 StringBuffer/StringBuilder 클래스는 mutable(가변) 가변성을 가져, 동일한 객체내에서 문자열 변경이 가능합니다. StringBuffer/StringBuilder 클래스의 차이점 StringBuffer는 멀티쓰레드에 안전하도록 동기화되어 있습니다. 그래서 멀티쓰레드로 작성된 프로그램이 아닌 경우, StringBuffer의 동기화는 불필요하게 성능만 떨어트리게 됩니다. 그래서 StringBuffer에서 쓰레드의 동기화만 뺀 StringBuilder 가 추가되었습니다. Str..

Tistory

[Java/자바] Super와 Super()

super super는 자손 클래스에서 조상 클래스로부터 상속받은 멤버를 참조하는데 사용되는 참조변수입니다. 멤버변수와 지역변수의 이름이 같을 때 this를 붙여 구별했듯이 상속받은 멤버와 자신의 멤버와 이름이 같을 때는 super를 붙여 구분할 수 있습니다. super와 this 비교 class SuperTest { public static void main(String args[]) { Child c = new Child(); c.method(); } } class Parent { int x=10; } class Child extends Parent { int x = 20; void method() { System.out.println("x=" + x); System.out.println("this...

Tistory

[Java/자바] 추상 클래스와 추상 메서드란 (abstract)?

추상이란 ? 추상의 사전적 의미를 보면 "여러 가지 사물이나 개념에서 공통되는 특성이나 속성 따위를 추출하여 파악하는 작용." 입니다. "상속"이 자손 클래스를 만드는데 조상 클래스를 사용하는 것이라면, "추상화"는 기존의 클래스의 공통적인 부분을 뽑아 조상 클래스를 만드는 것이라 할 수 있습니다. 추상화 : 클래스간의 공통점을 찾아 공통의 조상을 만드는 작업. 구체화 : 상속을 통해 클래스를 구현, 확장하는 작업. 상속계층도를 따라 내려갈수록 클래스는 점점 기능이 추가되어 구체화의 정도가 커져 세분화되고, 반대로 올라갈수록 추상화의 정도가 커져 공통요소만 남게됩니다. 추상 클래스 ( abstract class ) 클래스를 설계도라 비유한다면, 추상클래스는 미완성 설계도라고 할 수 있습니다. 클래스가 미..

Tistory

[Java/자바] 다형성(polymorphism)이란 ?

다형성 다형성은 객체지향 언어인 자바의 아주 중요한 특징 중 하나입니다. 다형성은 상속과 깊은 관계를 가지고 있으므로 상속에 대해 알고 싶다면 아래 포스팅을 참고하시면 됩니다. [Java/자바] 클래스의 관계 - 상속(is-a)과 포함(has-a) 상속 상속이란, 기존의 클래스를 재사용해 새로운 클래스를 작성하는 것입니다. 상속을 통해서 클래스를 작성하면, 적은 양의 코드로 새로운 클래스를 작성할 수 있고 코드를 공통적으로 관리 hstory0208.tistory.com 다형성이란, "여러 가지 형태를 가질 수 있는 능력"을 의미하며 자바에서 한 타입의 참조변수로 여러 타입의 객체를 참조할 수 있도록 함으로써 다형성을 구현합니다. 쉽게 말하면, "조상클래스 타입의 참조변수로 자손클래스의 인스턴스를 참조할 ..

Tistory

[Java/자바] 클래스의 관계 - 상속(is-a)과 포함(has-a)

상속 상속이란, 기존의 클래스를 재사용해 새로운 클래스를 작성하는 것입니다. 상속을 통해서 클래스를 작성하면, 적은 양의 코드로 새로운 클래스를 작성할 수 있고 코드를 공통적으로 관리할 수 도 있어 코드의 추가 및 변경이 용이합니다. 상속 방법 상속 방법은 아주 간단하게 상속받고자 하는 클래스의 이름 앞에 "extends"를 붙여주면 됩니다. 만약 새로 작성하고자 하는 클래스의 이름이 "Child"이고 상속받고자 하는 기존 클래스의 이름이 "Parent"라면 다음과 같습니다. class Child extends Parent { ... } 이 두 클래스는 서로 상속관계에 있다고 하며, 상속해주는 클래스를 "조상 클래스", 상속 받는 클래스를 "자손 클래스"라고 합니다. 이 상속관계를 그림으로 표현하면 다음..

Tistory

[Java/자바] 오버라이딩(overriding)이란 ?

오버라이딩 ( overriding ) 오버라이딩이란, 조상 클래스로부터 상속받은 메서드의 내용을 변경하는 것을 말합니다. 상속받은 메서드를 그대로 사용해도 되지만, 자손 클래스에 맞게 변경해야할 경우 오버라이딩을 사용합니다. 오버라이딩의 조건 오버라이딩이 성립되기 위해서는 다음과 같은 조건들을 만족해야 합니다. 자손 클래스에서 오버라이딩하는 메서드는 조상 클래스의 메서드와 1. 이름이 같아야 한다. 2. 매개변수가 같아야 한다. 3. 반환타입이 같아야 한다. 요약하면 선언부가 서로 일치해야 한다는 것과 같습니다. 오버라이딩 예시 class Point { int x; int y; String getLocation() { return "x :" + x + ", y :" + y; } } class Point3..

Tistory

[Java/자바] 오버로딩 (overloading)이란 ?

오버로딩(Overloading)이라는 뜻은 사전적으로 '과적하다.'라는 뜻으로, 오버로딩이란 ? 한 클래스 내에서 같은 이름의 메서드를 여러 개 정의하는 것을 말합니다. 오버로딩의 조건 오버로딩이 성립되기 위해선 다음과 같은 조건을 만족해야합니다. 1. 메서드 이름이 같아야 한다. 2. 매개변수의 개수 또는 타입이 달라야 한다. 비록 메서드의 이름이 같더라도 매개변수가 다르면 서로 구별될 수 있기 때문에 오버로딩이 가능합니다. 위의 조건을 만족시키지 못할시에는, 메서드가 중복으로 간주되어 컴파일 시 에러가 발생합니다. 주의할 점으로는 반환 타입( 리턴 타입 )은 오버로딩을 구현하는데 아무런 영향을 주지 않습니다. 오버로딩 예시 코드 아래 코드는 전부 오버로딩의 조건을 만족합니다. class Overloa..

Tistory

[Java/자바] 생성자( Constructor )란 ?

생성자 ( Constructor ) 생성자는 new 연산자를 통해 인스턴스가 생성될 때 호출되고 제일 먼저 실행되는 "인스턴스 초기화 메서드" 입니다. 어떻게 보면 메서드와 비슷해보이지만 생성자는 단순히 인스턴스 변수들의 초기화에 사용되는 조금 특별한 메서드입니다. 생성자 역시 메서드처럼 클래스 내에 선언되며, 구조도 메서드와 유사하지만 리턴값 (return)이 없다는 점이 다릅니다. 그렇다고 해서 리턴값이 없음을 뜻하는 void를 사용하지는 않습니다. 생성자의 조건 1. 생성자의 이름은 클래스의 이름과 같아야 한다. 2. 생성자는 리턴 값이 없다. 생성자 선언 방법 생성자는 다음과 같이 정의합니다. 생성자도 오버로딩이 가능하므로 하나의 클래스의 여러 개의 생성자가 존재할 수 있습니다. 클래스이름 (타입..

Tistory

[Java/자바] 멤버변수 초기화 방법 (명시적 초기화, 초기화 블럭)

아래의 포스팅을 통해 멤버변수가 무엇인지, 지역변수가 무엇인지에 대해 알아보았습니다. (Java/자바) 클래스 변수, 인스턴스 변수, 지역 변수란? 이 글을 읽기 앞서 자바의 클래스와 객체란? 인스턴스란 ? 무엇인지 모른다면 아래 포스팅을 참고하시면 좋습니다. (Java/자바) 클래스와 객체 클래스와 객체 클래스와 객체를 설명하는 예시로 여 hstory0208.tistory.com 다시 한번 간단하게 복습하자면 다음과 같습니다. 멤버변수(클래스변수, 인스턴스변수)와 배열의 초기화는 선택적이지만, 지역변수의 초기화는 필수적이다. 이번 시간에는 멤버변수의 초기화의 방법들에 대해 알아보고자 합니다. 멤버변수의 초기화 방법으로는 총 3가지가 있습니다. 명시적 초기화 생성자 초기화 블럭 - 인스턴스 초기화 블럭,..

Tistory

[Java/자바] 메서드(Method)란 ?

메서드 ( Method ) 메서드란 특정 작업을 수행하는 문장들을 하나로 묶은 것으로 수학의 함수와 비슷합니다. 대표적으로 절댓값을 구하는 메서드 Math.abs(-3)을 실행하면 3의 결과를 반환합니다. 메서드를 사용하는 이유 1. 높은 재사용성 ( reusability ) 이미 자바 API에서 제공하는 메서드들을 사용하면서 코딩의 편리함을 느끼실 겁니다. 이렇게 메서드를 한번 만들어 놓으면 몇 번이고 호출할 수 있으며, 다른 프로그램에서도 사용이 가능합니다. 2. 중복된 코드의 제거 프로그램을 작성하다 보면, 같은 내용의 문장들이 중복되곤 합니다. 이렇게 반복되는 문장들을 묶어 하나의 메서드로 작성해 놓으면, 중복을 제거하고 메서드를 호출함으로써 대체할 수 있습니다. public static void..

Tistory

[Java/자바] 재귀호출이란 ?

재귀호출이란 ? 메서드의 내부에서 메서드 자신을 다시 호출하는 것을 말합니다. 그리고 재귀호출을 하는 메서드를 "재귀 메서드"라고 합니다. void method() { method(); // 재귀호출. 메서드 자신을 호출한다. } 그런데 오로지 재귀호출뿐이라면, 무한히 자기 자신을 호출하기 때문에 무한 반복에 빠지게 됩니다. 무한반복문이 조건문과 함께 사용되어야 하는 것처럼, 재귀호출도 조건문이 필수적으로 따라다닙니다. void method(int n) { if(n==0) return; // n의 값이 0이라면 메서드 종료. System.out.println(n); method(--n); // 재귀호출. } 반복문보다 재귀호출이 더 빠른가 ? 결론부터 말하면 아닙니다. 메서드를 호출하는 것은 반복문보다 ..

Tistory

[Java/자바] 클래스(static) 메서드와 인스턴스 메서드

클래스 변수와 인스턴스 변수에서도 그랬듯이, 메서드 앞에 static이 붙으면 클래스 메서드, 없으면 인스턴스 메서드 입니다. 클래스 메서드도 클래스 변수처럼, 객체를 생성하지 않고도 "클래스이름.메서드이름(매개변수)"와 같은식으로 호출이 가능합니다. 반면에, 인스턴스 메서드는 반드시 객체를 생성해야만 호출이 가능합니다. (Java/자바) 클래스 변수, 인스턴스 변수, 지역 변수란? 이 글을 읽기 앞서 자바의 클래스와 객체란? 인스턴스란 ? 무엇인지 모른다면 아래 포스팅을 참고하시면 좋습니다. (Java/자바) 클래스와 객체 클래스와 객체 클래스와 객체를 설명하는 예시로 여 hstory0208.tistory.com 인스턴스 메서드 인스턴스 메서드는 인스턴스 변수와 관련된 작업을 하는, 즉 메서드의 작업을..

Tistory

(Java/자바) System.arraycopy()를 이용해 배열 복사

System 클래스의 arraycopy()를 사용해 빠르게 배열을 복사 할 수 있습니다. 아래의 여러 예시를 통해 알아 볼 것이지만 System.arraycopy(num, 0, newNum, 0, num.length); 쉽게 이해하자면 newNum 배열의 0번째 부터 데이터를 넣을 건데, 그 데이터는 num 배열의 0번째 부터 num.length개의 데이터를 넣을 것이다. 쉬운 이해를 위해 예제 코드를 통해 알아봅시다. public class ArrayEx4 { public static void main(String[] args) { char[] abc = {'A', 'B', 'C', 'D', 'E'}; char[] num = {'0', '1', '2', '3', '4', '5', '6', '7', '8..

Tistory

[Java/자바] 클래스 변수, 인스턴스 변수, 지역 변수란?

이 글을 읽기 앞서 자바의 클래스와 객체란? 인스턴스란 ? 무엇인지 모른다면 아래 포스팅을 참고하시면 좋습니다. (Java/자바) 클래스와 객체 클래스와 객체 클래스와 객체를 설명하는 예시로 여러 예시가 있습니다. 게임 비유 : 클래스(직업)에 따라 클래스(직업)에 맞는 아이템과 동작들이 주어져서 객채가 생성되는 것. 붕어빵 비유 : hstory0208.tistory.com 자바에서 변수는 클래스 변수, 인스턴스 변수, 지역 변수로 모두 3가지의 변수가 있습니다. 그리고 클래스 변수와, 인스턴스 변수를 "멤버변수"라고 합니다. class test { int a; // 인스턴스 변수 static int b;// 클래스 변수 (static 변수, 공유 변수) // 메서드 영영 void method() { i..

Tistory

[Java/자바] 클래스와 객체

클래스와 객체 클래스와 객체를 설명하는 예시로 여러 예시가 있습니다. 게임 비유 : 클래스(직업)에 따라 클래스(직업)에 맞는 아이템과 동작들이 주어져서 객채가 생성되는 것. 붕어빵 비유 : 클래스라는 모형틀(붕어빵틀)을 만들고 팥을 넣고 구워 객채(붕어빵)를 만든다. 이러한 예시를 보고 클래스와 객체가 무엇인지 아래 설명을 본다면 좀 더 이해가 쉬울 겁니다. 클래스 클래스란 "객체를 정의해놓은 것" 또는 "객체의 설계도 또는 틀"이라고 정의할 수 있습니다. 클래스는 객체를 생성하는데 사용되며, 객체는 클래스에 정의된 대로 생성됩니다. 클래스의 정의 : 객체를 정의해 놓은 것 클래스의 용도 : 객체를 생성하는데 사용 객체 객체는 "실제로 존재하는 것"으로 우리가 주변에서 볼 수 있는 책상, 의자, 컴퓨터..

Tistory

ASCII(아스키 코드)와 Unicode(유니코드)란 ?

개발을 하다 보면 아스키 코드, 유니코드란 말 참 많이들어 보셨을겁니다. 많이는 들어봤지만 자바스크립트를 공부할때는 실제로 크게 쓰이지않아 나중에 알아봐야지 했지만, 자바를 공부하고 나서 아스키코드와 유니코드를 이해하는게 필요하다고 느끼게 되어 ASCII(아스키 코드)와 Unicode(유니코드)가 무엇인지에 대해 포스팅해보려 합니다. 설명하기 앞서 인코딩(encoding)과 디코딩(decoding)에 대해 알아보겠습니다. 위 그림을 보면 문자 'A'의 유니코드가 65인 것을 알 수 있습니다. 그래서 문자 'A'를 인코딩하면 65가 되고, 반대로 65 유니코드를 디코딩하면 문자 'A'가 됩니다. 여기서 인코딩이란 ? 문자를 코드로 변환하는 것을 말합니다. 즉, 컴퓨터는 0과 1밖에 모르기 때문에 'A'라는..

Tistory

[Java/자바] 연산자의 모든 것

연산자는 '연산을 수행하는 기호'를 말하며 +, -, * 등이 연산자에 해당됩니다. 연산자가 연산을 수행하려면 연산자의 대상이 있어야하는데, 이 대상을 '피연산자'라고 합니다. 피연산자로 상수, 변수, 식을 사용할 수 도 있습니다. 연산자(operator) = 연산을 수행하는 기호 ( +, -, * 등 ) 피연산자(operand) = 연산자의 작업 대상(변수, 상수, 리터럴, 수식) 연산자의 종류 연산자의 종류는 다음과 같으며 하나씩 알아보도록 하겠습니다. 종류 연산자 설명 산술 연산자 + - * / % 사칙 연산( +, -, *, / )과 나머지 연산 ( % ) 비교 연산자 > = , = 두 피연산자의 값의 크기를 비교합니다. 참이면 true를, 거짓이면 false를 반홚바니다. 기본형 중에서는 boo..

Tistory

(Java/자바) 숫자를 문자열로 변환 - toString(), valueOf()

이번 포스팅에서는 숫자를 문자열로 변환하는 방법에 대해 알아보려합니다. 문자열을 숫자로 변환하는 방법은 아래 포스팅을 참고하시면 됩니다. (Java/자바) 문자열을 정수로 변환 - parseInt(), valueOf() 문자열(String)을 정수로 변환하는 작업은 자주 있는 일입니다. 반대로 정수를 문자열로 변환하는 것도 마찬가지겠죠 이번 포스팅에선 문자열을 정수로 변환해주는 메서드 parseInt() 와 valueOf() 에 hstory0208.tistory.com 숫자를 String으로 변환하는 방법은 총 3가지가 있습니다. toString(), valueOf() 그리고 간단하게 빈 문자열과 int를 '+' 연산자로 연결하여 문자열로 변환하는 방법. 하나씩 알아보겠습니다. Integer.toStri..

Tistory

(Java/자바) 프로그래머스 Lv1 - 정수 내림차순으로 배치하기

문제 설명 함수 solution은 정수 n을 매개변수로 입력받습니다. n의 각 자릿수를 큰것부터 작은 순으로 정렬한 새로운 정수를 리턴해주세요. 예를들어 n이 118372면 873211을 리턴하면 됩니다. 제한 조건 n은 1이상 8000000000 이하인 자연수입니다. 입출력 예 n return 118372 873211 Solution.java import java.util.*; class Solution { public long solution(long n) { String[] arr = String.valueOf(n).split(""); Arrays.sort(arr); // 오름차순 정렬 StringBuilder sb = new StringBuilder(); for (int i = 0; i < arr..

Tistory

[Java/자바] StringBuilder 클래스란 ?

String은 변경 불가능한 문자열을 생성하지만 StringBuilder는 변경 가능한 문자열을 만들어 주기 때문에, String을 합치는 작업이 필요할 시 사용할 수 있습니다. 객체 선언 StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder("ABC"); 문자열을 바로 넣을 수도 있다. StringBuilder 메서드 public class sb { public static void main(String[] args) { StringBuilder sb = new StringBuilder(); // 문자열 추가 System.out.println(sb.append("bbb")); // bbb System.out.printl..

Tistory

(Java/자바) 프로그래머스 Lv1 - 하샤드 수

문제 설명 양의 정수 x가 하샤드 수이려면 x의 자릿수의 합으로 x가 나누어져야 합니다. 예를 들어 18의 자릿수 합은 1+8=9이고, 18은 9로 나누어 떨어지므로 18은 하샤드 수입니다. 자연수 x를 입력받아 x가 하샤드 수인지 아닌지 검사하는 함수, solution을 완성해주세요. 제한 조건 x는 1 이상, 10000 이하인 정수입니다. 입출력 예 arr return 10 true 12 true 11 false 13 false 입출력 예 #1 10의 모든 자릿수의 합은 1입니다. 10은 1로 나누어 떨어지므로 10은 하샤드 수입니다. 입출력 예 #2 12의 모든 자릿수의 합은 3입니다. 12는 3으로 나누어 떨어지므로 12는 하샤드 수입니다. 입출력 예 #3 11의 모든 자릿수의 합은 2입니다. 1..

Tistory

(Java/자바) 프로그래머스 Lv1 - 문자열 내 p와 y의 개수

문제설명 대문자와 소문자가 섞여있는 문자열 s가 주어집니다. s에 'p'의 개수와 'y'의 개수를 비교해 같으면 True, 다르면 False를 return 하는 solution를 완성하세요. 'p', 'y' 모두 하나도 없는 경우는 항상 True를 리턴합니다. 단, 개수를 비교할 때 대문자와 소문자는 구별하지 않습니다. 예를 들어 s가 "pPoooyY"면 true를 return하고 "Pyy"라면 false를 return합니다. 제한사항 문자열 s의 길이 : 50 이하의 자연수 문자열 s는 알파벳으로만 이루어져 있습니다. 입출력 예 s answer "pPoooyY" true "Pyy" false 입출력 예 #1 'p'의 개수 2개, 'y'의 개수 2개로 같으므로 true를 return 합니다. 입출력 예 ..

Tistory

(Java/자바) 문자열을 정수로 변환 - parseInt(), valueOf()

문자열(String)을 정수로 변환하는 작업은 자주 있는 일입니다. 반대로 정수를 문자열로 변환하는 것도 마찬가지겠죠 이번 포스팅에선 문자열을 정수로 변환해주는 메서드 parseInt() 와 valueOf() 에 대해 알아보고 이 둘의 차이점에 대해 설명해보고자합니다. Integer.parseInt() parseInt() 메서드는 파라미터로 숫자로 변환할 문자열을 입력받고, 기본형인 int(정수)로 변환합니다. 두번째 매개변수가 생략된 경우 10진수로 변환된 값을 반환하고, 10진수가 아닌 다른 진수로 변환하고 싶으면 두 번째 매개변수에 변환하고자 하는 진수를 입력합니다. public class ParseInt { public static void main(String[] args) { String st..

Tistory

(Java/자바) 프로그래머스 Lv1 - 자릿수 더하기

문제설명 자연수 N이 주어지면, N의 각 자릿수의 합을 구해서 return 하는 solution 함수를 만들어 주세요. 예를들어 N = 123이면 1 + 2 + 3 = 6을 return 하면 됩니다. 제한사항 N의 범위 : 100,000,000 이하의 자연수 입출력 예 N answer 123 6 987 24 입출력 예 #1 문제의 예시와 같습니다. 입출력 예 #2 9 + 8 + 7 = 24이므로 24를 return 하면 됩니다. Solution.java 내가 푼 풀이 자바스크립트로 푼 방식대로 풀어 for문을 이용해서 풀었습니다. 자바스크립트와 좀 다른점이 많아 문자를 정수로 변환한다던가 answer += Integer.parseInt(str[i]) 로 answer에 str의 i번째 값을 추가하는 방식을..

1 2 3 4