본문 바로가기

전체 글

(165)
[프로그래머스] (Lv.1) 핸드폰 번호 가리기 문제 프로그래머스 모바일은 개인정보 보호를 위해 고지서를 보낼 때 고객들의 전화번호의 일부를 가립니다. 전화번호가 문자열 phone_number로 주어졌을 때, 전화번호의 뒷 4자리를 제외한 나머지 숫자를 전부 *으로 가린 문자열을 리턴하는 함수, solution을 완성해주세요. - 출력 예시 - 정답 코드 import java.util.Arrays; class Solution { public String solution(String phone_number) { char[] charArr = phone_number.toCharArray(); char[] newCharArr = new char[phone_number.length()]; Arrays.fill(newCharArr, '*'); System.ar..
[프로그래머스] (Lv.1) 행렬의 덧셈 문제 행렬의 덧셈은 행과 열의 크기가 같은 두 행렬의 같은 행, 같은 열의 값을 서로 더한 결과가 됩니다. 2개의 행렬 arr1과 arr2를 입력받아, 행렬 덧셈의 결과를 반환하는 함수, solution을 완성해주세요. - 출력 예시 - 정답 코드 class Solution { public int[][] solution(int[][] arr1, int[][] arr2) { int[][] answer = new int[arr1.length][arr1[0].length]; for(int i=0; i
[프로그래머스] (Lv.1) x만큼 간격이 있는 n개의 숫자 문제 함수 solution은 정수 x와 자연수 n을 입력 받아, x부터 시작해 x씩 증가하는 숫자를 n개 지니는 리스트를 리턴해야 합니다. 다음 제한 조건을 보고, 조건을 만족하는 함수, solution을 완성해주세요. - 출력 예시 - 정답 코드 class Solution { public long[] solution(int x, int n) { long[] answer = new long[n]; for (int i = 0; i < n; i++) { answer[i] = ((long) i + 1) * x; } return answer; } } import java.util.*; class Solution { public static long[] solution(int x, int n) { long[] a..
[프로그래머스] (Lv.1) 직사각형 별찍기 문제 이 문제에는 표준 입력으로 두 개의 정수 n과 m이 주어집니다. 별(*) 문자를 이용해 가로의 길이가 n, 세로의 길이가 m인 직사각형 형태를 출력해보세요. - 출력 예시 - 정답 코드 import java.util.Scanner; class Solution { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int a = sc.nextInt(); int b = sc.nextInt(); for(int i=0; i
[Java] System.out.printf() 메서드 사용법 (feat. String.format()) 연습문제 중 다음과 같은 표현으로 출력되는 예시가 있다. 내용에 따라 변하는 형태인데, 기존의 println()이나 print() 메서드로는 한계를 느꼈다. 위와 같이 출력하려면 어떻게 코드를 짜야할까? 정답은 printf()과 String.format() 메서드에 있다. 첫 번째 예시의 경우 특정 값을 변환하고자 하는 값으로 더 이상 나눌 수 없을 때까지 나누는 과정을 나타낸다. 출력하는 부분의 코드는 다음과 같다. System.out.printf(String.format("%%2d | %%%dd\n", n), r, x); do { System.out.printf(" +"); for (int i = 0; i < n + 2; i++) System.out.print('-'); System.out.print..
[완강 후기] 포큐 아카데미 'COMP2500 객체지향 프로그래밍 및 설계' - 공부 기간 : 2022년 5월 2일 ~ 8월 15일 (총 15주 과정) - 공부 시간 : 총 115시간 59분 - 플랫폼 : POCU 아카데미 홈페이지 - 100% 온라인 강의 선택 이유 현재 개발자로 일하고 있는 지인의 소개로 포큐(POCU) 아카데미를 처음 알게 됐다. 그 친구는 나에게 포큐 과정을 입이 닳도록 칭찬했는데 요약하자면 "해당 코스를 패스만 해도 바로 실무에서 일할 수 있을 정도의 실력이다"라고 높게 평가했다. 포큐 아카데미에는 다양한 강좌가 개설되어 있다. '왕초보 프로그래밍 입문(C#)'부터 '실무 프로그래밍 입문', 그리고 '소프트웨어 공학용 수학', 'C 언매니지드 프로그래밍', '알고리듬 및 자료구조' 등 입문부터 전문 과정까지 있다. 이 중에서 친구가 추천해준 강의가 바로 ..
[Java] 가변인자로 받은 원소들은 어디로 향할까? (feat. Arrays.asList()로 리스트화 하기) 메서드를 사용하다 보면 '가변 인자'를 사용할 때가 있다. 가변 인자를 사용하면 해당 원소들은 어떻게 처리될까? 가변 인자 기능은 JDK1.5부터 사용이 가능해졌다. 그전까지는 메서드의 매개변수 개수가 고정적이었으나 해당 업데이트 이후부터 매개변수 개수를 "동적"으로 지정할 수 있게 된 것이다. 가변 인자는 '매개변수 타입... 변수명' 형식으로 선언한다. // 예시 String concatenate(String... str) {...} 가변인자의 기능 원리는, 가변 인자가 내부적으로 '배열'을 생성하고 매개변수에 들어온 원소들을 해당 배열에 배치한다. 아래 예제에서 변수명 args는 개발자가 입력한 매개변수들로 만들려는 배열의 이름과 동일하다. public String[] method1(String....
(22년 정기 3회) 정보처리기사 [필기] 합격 후기 및 공부 방법 - 자격명: 정보처리기사 - 국가기술자격 - 회차: 2022년 정기 기사 3회 [필기] - 시험 일시: 2022.07.10 - 시험 시간: 2시간 30분 (총 150분) - 시행기관: 한국산업인력공단 - 문제 유형: 객관식 100문제 (Part 1 : 20문제 | Part 2 : 20문제 | Part 3 : 20문제 | Part 4 : 20문제 | Part 5 : 20문제) - 검정비: 19,400원 정보처리기사, 그 자격증을 향하여 IT 업종에 일하기 위한 자격증을 찾아봤을 때 어김없이 등장하는 자격시험이 '정보처리기사'였다. 물론 효용성에 대한 찬반 의견은 첨예하게 갈렸다. 개발자로 일하고 있는 주변 지인들에게 물어봐도 A는 정보처리기사를 공부할 시간에 프로그래밍 역량을 쌓는 것이 더 좋다고 만류했고..
Ch.17 그래프로 뭐든지 연결하기 (도서 요약 "누구나 자료구조와 알고리즘") 친구를 맺어주는 소셜 네트워크를 만들어보자. 철수가 영희의 친구라면, 영희 역시 철수의 친구다. 이처럼 친구 관계는 서로 상호적이다. 이러한 데이터를 조직할 수 있는 간단한 방법은 '2차원 배열'로 리스트를 저장하는 것이다. String[][] friendShips = { {"Alice", "Bob"}, {"Bob", "Cynthia"}, {"Cynthia", "Diana"}, {"Diana", "Bob"}, {"Elise", "Fred"}, {"Fred", "Alice"} } 하지만 이 방식으로는 'Alice'의 친구가 누구인지 빠르게 알 수 없다. 컴퓨터는 목록 내 관계를 일일이 확인해야만 친구 관계를 알 수 있다. 이것은 O(N)이 걸리는 매우 느린 방법이다. '그래프(graph)'라는 자료 구조를..
Ch.16 트라이(trie)해 보는 것도 나쁘지 않다 (도서 요약 "누구나 자료구조와 알고리즘") 검색 자동완성 기능은 "catn"이라고 입력하면 자동으로 "catnip"이나 "catnap" 같은 단어를 추천해준다. 단어를 자동으로 완성하기 위해 스마트폰은 전체 단어 사전에 접근한다. 하지만 영단어를 전부 배열에 저장했다면, "catn"으로 시작하는 단어를 찾기 위해 모든 단어를 검색해야 한다. O(N)이라 비효율적이다. 해시 테이블도 단어를 통째로 해싱해야 값을 저장할 메모리 위치가 결정되니 도움이 안 된다. '정렬된 배열'에 단어를 저장하면 성능이 크게 개선된다. 배열에 단어가 알파벳순으로 들어 있으면 이진 검색으로 O(longN) 시간 안에 "catn"으로 시작하는 단어를 찾을 수 있다. 심지어 특수한 트리 기반 자료 구조를 사용하면 O(1)의 속도로 더 빨라질 수도 있다. '트라이'는 자동 완..
Ch.15 힙으로 우선순위 유지하기 (도서 요약 "누구나 자료구조와 알고리즘") 이진 탐색 트리 말고 다른 트리 종류도 많다. 모든 자료 구조가 그렇듯이 각 트리 종류마다 장단점이 있고 특정 상황에서 어떤 종류를 활용해야 할지 아는 것이 중요하다. 이번에는 특정 시나리오에 유리하게 활용할 수 있는 트리 자료 구조 중 하나인 '힙'을 알아본다. 힙은 데이터 세트에서 가장 큰 또는 가장 작은 데이터 원소를 계속 알아내야 할 때 굉장히 유용하다. 힙의 기능을 파악하기 위해선 '우선순위 큐'부터 살펴봐야 한다. 15. 1 우선순위 큐 지난번 배웠던 큐는 First In, First Out(FIFO) 방식으로 항목을 처리하는 리스트였다. 따라서 큐 끝에서만 데이터를 삽입하고 큐 앞에서만 접근과 삭제를 수행할 수 있다. 즉 데이터가 삽입됐던 순서에 접근 우선권이 있다. '우선순위 큐(prior..
Ch.14 이진 탐색 트리로 속도 향상 (도서 요약 "누구나 자료구조와 알고리즘") 데이터를 특정 순서대로 정렬하고 싶을 때 '퀵 정렬'을 사용할 수 있다. 하지만 정렬 알고리즘은 아무리 빨라도 O(NlogN) 시간이 걸린다. 따라서 데이터를 자주 정렬해야 한다면 다시 정렬하는 일이 없게 처음부터 데이터를 항상 정렬된 순서로 유지하는 편이 낫다. 정렬된 배열은 순서대로 데이터를 유지하는 효과적인 도구다. 또 특정 연산에 매우 빨라서 읽기에는 O(1), 검색(이진 검색을 사용할 때)에는 O(logN)이 걸린다. 그러나 정렬된 배열도 한계는 있다. 정렬된 배열은 삽입과 삭제가 상대적으로 느리다. 삽입과 삭제 시 값들을 전부 한 셀씩 오른쪽, 왼쪽으로 시프트 해야 하기 때문이다. 최악의 시나리오일 경우 N단계 걸리고, 평균적으로 N / 2단계가 걸린다. 전반적으로 빠른 속도를 내는 자료구조를..
Ch.13 노드 기반 자료 구조 (도서 요약 "누구나 자료구조와 알고리즘") 지금부터 다룰 자료 구조는 모두 '노드(node)'라는 개념에 기반해 만들어졌다. 노드란 컴퓨터 메모리 곳곳에 흩어져 있는 데이터 조각이다. 노드 기반 자료 구조는 데이터를 조직하고 접근하는 새로운 방법을 제공하기 때문에 성능상 이점이 많다. '연결 리스트'는 가장 기본적인 노드 기반 자료 구조이다. 배열과 거의 같아 보이지만, 연결 리스트는 효율성 면에서 장단점이 있다. 13. 1 연결 리스트 연결 리스트(linked list)는 배열과 마찬가지로 항목의 리스트를 표현하는 자료 구조다. 배열과 연결 리스트는 외견상 상당히 비슷해 보이지만, 내부적으로는 크게 다르다. 컴퓨터 메모리는 데이터 조각을 저장하는 셀들의 거대한 집합이다. 따라서 배열을 생성하면 메모리 내에 연속된 빈 셀 그룹을 찾아 데이터를 저..
Ch.12 속도를 높이는 재귀 알고리즘 (도서 요약 "누구나 자료구조와 알고리즘") 지금까지 버블 정렬, 선택 정렬, 삽입 정렬 같은 많은 정렬 알고리즘을 살펴봤다. 하지만 실제로 배열을 정렬할 때는 이러한 방법을 쓰지 않는다. 컴퓨터 언어 중 대다수가 내부적으로 채택한 정렬 알고리즘이 있는데 바로 '퀵 정렬(Quicksort)'이다. 퀵 정렬의 동작 방식을 공부하면 재귀를 사용해 어떻게 알고리즘의 속도를 크게 향상하는지 배울 수 있다. 퀵 정렬은 매우 빠른 정렬 알고리즘으로 특히 평균 시나리오에서 효율적이다. 최악의 시나리오(즉, 역순으로 정렬된 배열)에서는 삽입 정렬이나 선택 정렬과 성능이 유사하지만 대부분의 경우 일어나는 평균 시나리오에서는 훨씬 빠르다. 퀵 정렬은 '분할(partitioning)'이라는 개념에 기반하므로 분할을 먼저 알아보자. 12. 1 분할 배열을 분할(part..
Ch.11 재귀적으로 작성하는 법 (도서 요약 "누구나 자료구조와 알고리즘") 사실 재귀는 알고리즘의 시간 복잡도에 몹시 부정적인 영향을 미친다. 이번에는 재귀적으로 작성하는 다양한 카테고리를 살펴보자. 11. 1 재귀 카테고리: 반복 실행 가장 기본적인 카테고리는 '반복적'으로 수행하는 알고리즘이다. 예를 들어 앞에서 살펴본 반복적으로 실행되는 '카운트다운 알고리즘'이 그것이다. 코드는 10에서부터 9, 8, ... , 0까지의 수를 출력한다. 함수의 출력 횟수는 매번 다르나 코드의 본질은 결국 숫자 출력 작업을 반복적으로 실행하는 것이다. public void countdown(int number) { System.out.println("카운트 다운 " + number); if (number == 0) { return; } else { countdown(number - 1); ..