분류 전체보기 140

그래프 순회 (DFS, BFS)

그래프 순회(Graph Travaersal)이란 트리 순회와 마찬가지로 그래프의 모든 정점에 접근하는 것이며 실생활에서 연관검색, 사용자 맞춤 추천, 최단거리검색등에 사용된다. 해당 포스트의 코드구현은 이전 포스트에서 작성한 인접리스트를 이용하였다. (이전 포스트: https://mason-lee.tistory.com/73) class Traversal { constructor(graph) { this.graph = graph; } } const graph = new Graph(); graph.addVertex("A"); graph.addVertex("B"); graph.addVertex("C"); graph.addVertex("D"); graph.addVertex("E"); graph.addVertex..

그래프 (Graphs)

그래프는 여러개의 정점(Vertex)들이 간선(Edge)들로 서로 복잡하게 연결되있는 관계를 표현한 자료구조이다. 직접적인 관계가 있는 경우에는 두 정점 사이를 직접적으로 이어주는 간선이 있으며 간접적인 관계라면 몇개의 정점들과 간선들에 걸쳐 이어진다. 리스트, 트리, 그래프 리스트, 트리, 그래프 모두 비슷한 구조를 가지고 있다. 리스트 : 하나의 노드에 다른 하나의 노드가 연결되있고 또 다른 노드들이 체인처럼 직렬로 연결된 형태 트리 : 리스트와 같이 하나의 진행방향을 가지지만 하나의 노드에 여러 노드가 병렬적으로 연결된 형태 그래프 : 각 노드들이 순서와 개수에 상관없이 무작위로 연결된 형태 위와 같은 특징을 가지고 있으며 리스트에서 그래프로 점차적으로 진화된 형태를 띄고 있다. 이에 따라 그래프는..

표현가능한 이진트리

이번 코딩테스트의 전체적인 요구사항은 long타입의 넘버를 담은 배열의 각 수들을 이진수로 변환후 포화 이진트리로 만들어 해당 숫자가 이진트리로 표현이 가능한가를 구해내야된다. 해당 테스트를 완료하는데 4시간 소요됨 (문제 본문, 프로그래머스 : https://school.programmers.co.kr/learn/courses/30/lessons/150367 ) 리스트와 재귀를 이용 class Solution { public long[] solution(long[] numbers) { long[] answer = new long[numbers.length];//결과값을 담는 배열 for(int i =0; i maxLength){ maxLength = (maxLength*2)+1; } // 포화이진트리는..

[CS] 기술 면접 준비 part1. 자바와 OOP의 기본

잘 모르는 내용에 대해서 모르는 부분을 인정하고 아는 부분까지는 최선을 다해 설명하려고 노력 하였는가? 추측성 단어가 아닌 자신감 있는 단어로 답변하였는가? 한번 들었을 때 이해하기 쉬운 답변이었는가? 몸을 베베꼬거나 다른데를 보거나 하는 나쁜자세를 취하지 않았나? 질문을 잘 이해하고 문제의 요지를 잘 파악하였는가 해당 개념 설명이 간단 명료한가? 개념 설명과 예시가 단순 암기가 아니라 자신의 언어로 충분히 풀어 설명 되었나요? 두괄식으로 개념을 설명하고, 그에 따른 예시를 풀어서 설명하고 있나요? 개념 활용 예시가 구체적이고 풍부했는가? 잘 모르는 내용에 대해 불명확하게 설명한 부분이 있었는가? 정확한 CS 용어(ex. 변수를 만들어서 값을 넣어요. → 변수를 선언하고 값을 할당합니다. 등) 를 사용해..

CS & Interview 2023.03.13

스레드의 동기화

프로세스는 자원, 데이터, 그리고 스레드로 구성된다. 프로세스는 스레드가 운영 체제로부터 자원을 할당 받아 소스 코드를 실행하여 데이터를 처리하는데 이 때, 싱글 스레드 프로세스는 데이터에 단 하나의 스레드만 접근하므로, 문제될 사항이 없지만 멀티 스레드 프로세스의 경우, 두 스레드가 동일한 데이터를 공유하게 되어 문제가 발생할 수 있다. 아래의 코드는 하나의 객체 enemy의 두명의 플레이어(두개의 스레드)가 공격하여 쓰러트리게 되는 코드이다. public class Main { public static void main(String[] args) { // 하나의 Enemy 객체를 공유하는 두개의 스레드 생성 Runnable enemyGetAttacked = new ThreadTask3(); Threa..

Java/Java 2023.03.12

스레드 (Thread)

프로세스(Process)와 스레드(Thread) 프로세스는 실행 중인 애플리케이션을 의미한다. 즉, 애플리케이션을 실행하면 운영체제로부터 실행에 필요한 만큼의 메모리를 할당 받아 프로세스가 됩니다. 프로세스는 데이터, 컴퓨터 자원, 그리고 스레드로 구성되는데, 스레드는 데이터와 애플리케이션이 확보한 자원을 활용하여 소스 코드를 실행한다. 즉, 스레드는 하나의 코드 실행 흐름이라고 볼 수 있다. 메인 스레드(Main thread) 자바 애플리케이션을 실행하면 가장 먼저 실행되는 메서드는 main 메서드이며, 메인 스레드가 main 메서드를 실행시켜준다. 메인 스레드는 main 메서드의 코드를 처음부터 끝까지 순차적으로 실행시키며, 코드의 끝을 만나거나 return문을 만나면 실행을 종료한다. 만약, 어떤 ..

Java/Java 2023.03.12

자바 가상 머신(Java Virtual Machine)

자바가 탄생하기 이전에 객체지향 프로그램으로 자주 사용되었던 C++에는 큰 문제가 하나 있었다. 바로 운영체제로부터 독립적이지 못하다는 점이다. 쉽게 말해, Windows를 위해 만든 프로그램은 Windows에서만 작동이 가능했고, Mac OS에서 그 프로그램을 실행시키려면 Mac OS에 맞게 새로 프로그램을 만들고 컴파일해야 했다. 즉, 프로그래밍 언어가 운영체제에 종속적이기 때문에, 어떤 프로그램을 만들 때 각 운영체제 별로 따로 만들어주어야 했었다. 자바는 이러한 문제점을 해결하고자 탄생한 언어이다. 자바는 C++처럼 객체지향 프로그래밍이 가능하면서도, 운영체제로부터 독립되어있기 때문에, 자바로 소스 코드를 한 번만 작성하면 어떤 운영체제에서도 코드를 수정할 필요 없이 프로그램을 실행시킬 수 있다...

Java/Java 2023.03.11

실험을 통해 깨닳은 추상화의 중요성

이번 포스트는 지난 포스트에서 스트림의 groupingBy에 대해 공부하던 도중 알게된 것들을 다룬다. (지난포스트: https://mason-lee.tistory.com/65) 사건의 발단 사건의 발단은 스트림의 groupingBy를 구현해보다가 코드를 좀더 깔끔하게 보여지기를 원해서 새로운 클래스에 스태틱 메서드를 작성하게 되었다. 이후 해당 클래스를 콜렉션 프레임워크 처럼 필요할때마다 꺼내쓰면 어떨까? 라는 의문이 들어 실험을 하게 되었다. public class Main { public static void main(String[] args) { List list = new ArrayList(); list.add( new Human("김철수",23,"남자")); list.add( new Human..

Personal Research 2023.03.11

스트림의 메서드

스트림에 대해 공부하던중 몇몇 유용해보이는 메서드들이 있어 이에대해 포스팅하게 됬다. orElse() List list = Arrays.asList(); // 컴파일 오류 발생 Double value = list.stream() .mapToDouble((a)->a) .average(); // 런타임 오류 발생 Double value = list.stream() .mapToDouble((a)->a) .average() .getAsDouble(); 위와 같은 코드를 작성하면 컴파일 에러가 발생한다. 이유는 average()를 이용해 평균값을 구할때 입력값이 아예 없으면 즉 빈 리스트를 불러와 평균값을 구할수가 없기 때문이다. 해당 리스트에 숫자형 데이터 "0"이라도 존재 한다면 "0"을 리턴하지만 빈 리스트..

Java/Java 2023.03.11

스트림 (Stream)

스트림 스트림(Stream)은 배열, 컬렉션의 저장 요소를 하나씩 참조해서 람다식으로 처리할 수 있도록 해주는 반복자이다. 스트림을 사용하면 List, Set, Map, 배열 등 다양한 데이터 소스로부터 스트림을 만들 수 있고, 이를 표준화된 방법으로 다룰 수 있으며 스트림은 제공하는 다양한 메서드들을 이용하여 데이터 소스를 다룰수 있다. 어떠한 집합의 데이터들에 접근하는데 반복문으로 처리가 가능하다. 하지만 for문이나 Itorator를 사용할경우 코드가 길고 가독성이 떨어질수 있으나 스트림을 통해 구현한다면 코드를 좀더 직관적으로 작성이 가능하다. 선언형과 명령형 프로그래밍 비교 // List에 있는 숫자들 중에서 4보다 큰 짝수의 합계 구하기 // ------------------------반복문 ..

Java/Java 2023.03.10