https://www.acmicpc.net/problem/2346 처음 보자마자, 이건 양방향 연결 리스트를 사용하면 되겠구나 라는 생각이 들었다. 코드import java.io.*;import java.util.StringTokenizer;class Balloon { public int index; public int value; public Balloon prev; public Balloon next; public Balloon(int index, int value) { this.index = index; this.value = value; }}public class Main { public static void main(String[] ..
분류 전체보기
적절하지 않은 난수 값 사용은 보안 취약점 예측 가능한 난수를 사용하는 것은 시스템에 보안약점을 유발한다. Random은 정말 랜덤인거 아닌가?... 아니였다. 원인 컴퓨터의 난수발생기는 난수 값을 결정하는 시드(Seed) 값이 고정될 경우, 매번 동일한 난수값이 발생한다. public class Main { public static void main(String[] args) { Thread thread1 = new Thread(() -> System.out.println(getRandomValue(System.currentTimeMillis()))); Thread thread2 = new Thread(() -> System.out.println(getRandomValue(System.currentTi..
예외(Exception) 실무에 들어가서 놀란 것은 이 예외를 처리하는 부분이라고 볼 수 있다. 시큐어 코딩 가이드도 읽어가면서, 왜 e.printStackTrace()를 쓰면 안 되는지 예외 처리를 왜 해줘야 하는지 예외의 종류도 checked / unchecked 로 나뉘어져 있다는 것을 알게 되었다. 부끄럽지만 원래는 실무에 들어가기 전에 알고 있어야 하는 당연한 것이였다. e.printStackTrace()를 쓰면 안 되는 이유? e.printStackTrace()를 자세히 보면 예외 발생 스택 정보를 출력하면서 애플리케이션 내부 구조 및 메서드 호출 경로 등이 그대로 노출되게 된다. 이는 심각한 보안 취약점 이다. 또한 스택 추적 정보를 출력하는데 많은 시간과 자원을 사용합니다. Tmi. Sys..
논리 게이트 게이트(gate)는 간단한 불 함수를 구현한 물리적 장치다. 논리 게이트의 예시(위키) 모든 논리게이트는 입력 및 출력 데이터 형식이 같으므로(0 또는 1), 서로 연달아 이으면 더 복잡한 조합 게이트composite gate를 만들어 낼 수 있다. 예시) 모든 입력이 1이면 1을 반환하고, 그렇지 않으면 0을 반환하는 3-입력 불 함수 And(a , b, c)를 구현 불 대수 표기: a * b * c = (a * b) * c 접두어 표기법: And(a, b, c) = And(And(a, b), c) 오른쪽은 내부 아키텍처 : 구현 왼쪽은 게이트 : 인터페이스 프로그래밍 언어와 비슷하게, 사용자들은 구현을 알 필요가 없다. 인터페이스만 숙지하고 있으면 충분하다. 요약 논리 설계의 기술은 기존..
1.1 불 대수 불 대수(Boolean algebra)는 참/거짓, 1/0, 예/아니오, 켜짐/꺼짐 같은 불 2진 값을 다룬다. 불 연산자 (Boolean operator) And x * y Or x + y Not !x * y + x * !y Nand Not-And의 줄임말 Nand(x, y) == Not(And(x, y)) Xor exclusive or의 줄임말 2개의 변수 중 딱 하나만 1일 때 1이 된다. Nor Not - Or에서 따온 이름 And, Or, Not이 다른 불 연산자에 비해 더 흥미롭거나 특별한 이유가 있을까? 바로 답하면 And, Or, Not에는 실제로 특별한 것은 없다. [And, Or, Not] 의 세 가지 기본 연산자는 모두 Nand로 표현할 수 있다.! 어떤 불 함수도 N..
Hello World Hello World 같은 프로그램은 겉으로만 간단해 보일 뿐이다. public class Main { public static void main(String[] args) { System.out.println("Hello World"); } } 이런 프로그램이 컴퓨터에서 실제로 작동하기 위해서는 다음과 같은 과정이 수행됩니다. 컴퓨터가 이해할 수 있도록 고수준 코드의 문자열을 분석해서 프로그램이 수행하려는 작업의 의미를 찾아낸다. 대상 컴퓨터의 기계어로 그 의미를 다시 쓴 저수준 코드를 생성해야 한다. (컴파일) 기계어란? 미리 약속된 2진 코드로 구성된 추상화 개념이다. 이 추상화를 명확히 하려면 하드웨어 아키텍처(hardware architecture)를 반드시 구현해야 한다...