맞는데 왜 틀릴까..?

전체 글 306

[Java] DFS BFS 기본 (DFS와 BFS)

자바로 처음 풀어본 알고리즘 문제. 알고리즘을 너무 오랜만에 풀어봐서 감을 익히려고 알고리즘 근본 문제인 dfs, bfs를 풀어봤다. 자바는 그동안 사용했던 파이썬과 다른 점이 매우 많은 것 같다. 파이썬이 얼마나 선녀였던지 알 수 있었지만 학기 내내 사용하던 로우레벨 언어 C와 비교하면 자바 또한 선녀였다. C를 사용했던 덕분에 queue와 linkedlist, sort를 직접 구현하지 않고 라이브러리를 이용할 수 있다는 것이 얼마나 편한 것인지 알았다. https://www.acmicpc.net/problem/1260 1260번: DFS와 BFS 첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의..

[Java] Multithread Programming 2 - multiBank

multithread programming을 이용해 계좌 A에서 B로 이체 후, A와 B의 계좌 잔액을 들여다보는 프로그램을 만들어보자 Account 클래스 계좌 Account 클래스 생성 입금과 출금, 잔액을 보여주는 메소드 생성 public class Account { String accountNo; String ownName; int bal; Account(String accountNO, String ownName, int bal){ this.accountNo = accountNO; this.ownName = ownName; this.bal = bal; } void printAccount() { System.out.println("계좌번호: " + accountNo); System.out.print..

Java 2022.12.18

[Java] Multithread Programming

Multithread thread가 둘 이상인 프로그램을 Multithread라고 한다. main 메소드의 첫 번째 명령문부터 실행 (main thread) 이 시작된다. main thread 는 program 이 시작되면 자동으로 시작되지만, 다른 thread 는 main thread 에서 만들어 시작해야 함. 이 thread 들은 시작되고 나면 main thread 와 동등한 레벨이 됨. main thread 가 끝나더라도 다른 thread 는 실행을 계속할 수 있음. main thread 가 끝났다고 해서 program 이 끝나는 것이 아니라, 모든 thread 가 끝나야만 완료되는 것임. Multithread programming은 아래 두 가지 방법으로 작성할 수 있다. java.lang.Thr..

Java 2022.12.18

[Java] Vector

벡터 Vector 클래스는 java.util 패키지에 있는 컬렉션의 일종으로 가변 크기의 배열을 구현하고 있다. 요소의 개수가 늘어나면 자동으로 배열 크기가 늘어나고 어떤 타입의 객체라도 저장 가능하다. 정수와 같은 기초 데이터도 오토박싱 기능을 이용하여 객체로 변환되어 저장된다. ArrayList와 거의 동일하나 Vector는 항상 동기화되어 있어서 스레드 간 동기화를 지원하지만 ArrayList는 지원하지 않는다. 또한 Vector가 ArrayList 보다 속도가 더 느리다. Vector 테스트 벡터 객체 vc에 정수형, 상수형을 넣어보자. import java.util.Vector; public class VectorTest { public static void main(String[] args) ..

Java 2022.12.18

[Java] 제네릭 프로그래밍, ArrayList

제네릭 프로그래밍 다양한 종류의 데이터를 처리할 수 있도록 클래스와 메소드를 작성하는 기법 제네릭 클래스 제네릭 프로그래밍을 활용하여 Box 클래스를 하나의 클래스로 여러 타입이 동작할 수 있도록 구현함 class Box{ private T data; //String, Integer도 클래스 이므로 가장 상위 클래스인 object로 선언해도 동작함 public T get() { return data; } public void set(T data) { this.data = data; } } public class MyBox { public static void main(String[] args) { Box b = new Box(); b.set("Hello World!"); //문자열 객체 저장 String..

Java 2022.12.18

[리눅스] 시스템 프로그래밍 - 메모리 관리

프로세스 구조 코드 세그먼트 : 기계어 명령어, 리터럴 상수, 프로그램 코드 및 상수 저장 공간 데이터 세그먼트 : 전역 변수, 정적 변수 스택 : 실행 시간 스택으로 함수가 호출될 때마다 생성, (지역 변수, 매개 변수, 반환 주소, 반환 값) 등 저장 힙 : 동적 메모리 할당 (malloc in C) 동적 할당 필요할 때 필요한 만큼만 메모리를 요청해서 사용하여 메모리를 절약한다. 사용한 후 더이상 필요가 없을 경우, 해당 영역을 반납한다. malloc() 은 주소를 반환하는데, 다양한 타입의 메모리 할당이 가능하다. (char, int, double) 따라서 malloc()의 포인터 타입은 void* 이므로 형변환이 필수 int* score = (int*)malloc(num*sizeof(int));..

Linux 2022.12.09

[시스템 해킹과 보안] 백도어

백도어 트로이 목마 : 사용자가 의도치 않은 코드를 정상적인 프로그램에 삽입한 프로그램 스파이웨어 : 설치된 시스템의 정보를 주기적으로 원격지의 특정한 서버에 보내는 프로그램 백도어 : 원래 의미는 운영체제나 프로그램을 생성할 때 정상적인 인증 과정을 거치지 않고, 운영체제나 프로그램 등에 접근할 수 있도록 만든 일종의 통로. 원래는 원격 관리 프로그램으로 개발되었지만 백도어로 악용됨. 개발된 후에는 삭제되어야 함에도 불구하고 제품에 그대로 남아서 출시. 트로이 목마도 백도어의 한 가지라 할 수 있다. 백도어의 종류 로컬 백도어 : 로컬에서 서버의 shell을 얻어내 관리자로 권한을 상승할 때 사용. 공격자는 일반 계정이 하나 필요함 (일반 계정에서 root 계정으로 권한 상승) 원격 백도어 : 원격으로..

[시스템 해킹과 보안] 패스워드 크래킹

패스워드 크래킹 패스워드 관리는 보안 관리자의 첫 번째 방어책이다. 좋은 패스워드 : 기억하기 쉽고 크래킹 하기 어려운 패스워드 해쉬 (Hash) 해쉬 (Hash) : 임의의 데이터로부터 일종의 짧은 전자지문을 만들어 내는 방법 암호화 (Encryption) : 특별한 알고리즘을 이용해 데이터를 전달하는 것 해쉬와 암호화는 모두 패스워드를 효과적으로 숨기는 기술이나, 해시 알고리즘은 결과물의 복호화가 불가능하다. 이렇게 역해쉬가 불가능하다면 해시를 사용하는 이유는 무엇일까? -> 다른 문장으로 같은 전자지문 (해쉬 값)을 만들 수 없으므로 진위 여부 확인이 가능하다. 해쉬 알고리즘 기본적인 해쉬 알고리즘 1. 123456789 와 123486789 가 있을 때, 두 수를 가운데를 기준으로 둘로 나누고 큰..

[시스템 해킹과 보안] 계정과 권한

리눅스/유닉스의 계정과 권한 시스템에서 해킹을 하는 주요 목적은 권한 상승이다. 즉 일반 사용자가 올바르지 못한 경로로 root 계정의 권한을 얻는 것이 해킹이라고 볼 수 있다. /etc/paswd 파일 내용 root : x : 0 : 0 : root : /root : /bin/bash 1 2 3 4 5 6 7 root : 사용자 계정 (id)을 나타낸다. x : 패스워드가 암호화되어 shadow 파일에 저장되어 있음을 나타낸다 0 : 사용자 번호(UID, User ID) 다 0 : 그룹 번호(GID, Group ID) 다 root : 사용자의 일반 이름이다. 시스템 설정에 별다른 영향이 없는 설정으로 자신의 이름을 입력해도 된다. /root : 사용자의 홈 디렉터리를 설정한다. 관리자이므로 홈 디렉터리..

[C로 쓴 자료구조] 그래프(Graph)

Graph 완전 그래프 Edge의 수가 최대인 그래프 n개의 vertex 일 때 최대 edge 수 : n(n-1)/2 경로의 길이 경로 상에 있는 edge의 수 단순 경로(simple path) 처음과 마지막을 제외한 vertex가 다른 경로 그래프 표현 방법 분석 G에 존재하는 edge 수 검사, or G가 연결되었는지 검사 인접 행렬 : n(n-1)/2 개의 항 조사 -> O(n^2) 인접 리스트 : O(n+e) Digraph에서 vertex의 in-degree 조사 인접 행렬 : O(n) 인접 리스트 : O(n+e) DFS (깊이 우선 탐색) 로직 1. 출발 정점 v의 인접 리스트부터 방문 2. v에 인접하면서 아직 방문하지 않은 정점 w를 선택 3. w를 시작점으로 하여 다시 dfs 시작 4. r..

자료구조 2022.12.08