Java 공부/Java 일반 13

입력값의 제공 횟수가 정해져있지 않을 때의 해결법 (백준 기준)

백준 문제를 풀다 보면, 입력값의 제공 횟수가 정해져있지 않은 문제가 자주 등장한다. 예를 들면 다음 문제와 같다. https://www.acmicpc.net/problem/4436 4436번: 엘프의 검 중간계에 살고있는 엘프 종족은 특정 숫자를 다른 숫자보다 중요하다고 믿는다. 따라서, 그들은 금속 n만큼을 이용해서 칼을 만들 때, 두께를 다음과 같은 규칙을 지키는 k로 한다면, 엄청나게 www.acmicpc.net 본 문제에서는 한 줄에 하나씩 입력값이 주어진다. 단, 총 몇 줄의 입력값이 주어지는지는 정해져있지 않다. 따라서 계속해서 반복문을 돌리며 입력을 받다가, 입력값이 null이 되는 순간 작동을 종료해야 한다. 예를 들면 다음과 같이 하면 된다. import java.io.BufferedR..

Class로 클래스의 정보 얻어오기 (리플렉션)

인프런에서 스프링 입문 강의를 듣다 보니 .class라는 것이 많이 나와서, 이것이 뭔지 간단하게 정리해두고자 한다. 리플렉션(1), Class 클래스 리플렉션(Reflection)은 객체를 통해 클래스의 정보를 분석해내는 프로그램 기법입니다. (사전적 의미 : 거울 등에 비친, 반사) 클래스 파일의 위치나 이름만 있으면 해당 클래스의 정보를 얻어내고 joont.tistory.com 이 블로그 글이 도움이 많이 되었다. 리플렉션이란 리플렉션은 어떤 객체를 가지고, 그 객체에 해당하는 클래스에 대한 정보를 알아내는 것이다. 클래스를 정의해놓은 코드를 찾아가지 않아도, 그 클래스를 바탕으로 생성된 한 객체의 이름만 알고 있으면 객체를 이용하여 클래스의 정보를 분석해낼 수 있다. Class 자바에는 Class..

람다식 (Lamda Expression)

스프링 기초 공부를 하던 중, 강사님의 예시 코드에 람다식이 자주 등장해서 찾아보게 되었다. 일단 스프링 공부를 별 문제 없이 해나갈 수 있을 정도로만 람다식에 대해 살펴보고 내가 스스로 알아들을 수 있으며 앞으로 잊지 않는 데 도움이 될 정도로만 간단하게 정리해보기로 했다. 람다식 만드는 법 함수를 람다식으로 고쳐쓸 때의 규칙은 다음과 같다. 함수의 리턴 타입과 함수명을 지운다. 매개변수들의 타입을 명시하지 않아도 알 수 있는 상황이라면 매개변수들의 타입을 생략할 수 있다. (코드를 짜다 보면 맥락상 알 수 있는 경우가 대부분이기 때문에 웬만하면 생략한다) 매개변수가 하나뿐이고 타입을 생략하였다면 ( ) 를 생략할 수 있다. 타입을 생략하지 않았다면 ( ) 는 지울 수 없다는 점에 주의하자. 매개변수가..

자바에서 1차원 배열을 활용한 우선순위 큐 구현하기

2022 상반기 신촌 ICPC 알고리즘 캠프의 트리 강의 내용을 기반으로, 매우 기본적인 우선순위 큐 프로그램을 구현하였다. 아래는 해당 강의의 노트정리 게시글이다. 초급 9회차 트리 강의 초반부에는 트리에 대한 기본적인 설명이 진행된다. 특히 적어둘 만한 것으로는 이진 트리에 관한 내용이 있었다. 학교 수업에서 배웠으나 잊고 있었던 내용인데, 이 기회에 확식히 기억해 blowupmomo.tistory.com 우선순위 큐의 작동 방식을 제대로 이해하기 위하여 만들어보았다. 아무 자료도 안 찾아보고 주먹구구식으로 구현했다. 이것보다 많이 효율적인 구현 방식을 찾게 되면 하단에 추가하겠다. 2022.07.19 정수만 저장하는 우선순위 큐이다. 정수의 크기가 클수록 우선순위가 높다. 커맨드를 입력해 콘솔에서 ..

자바에서 내 마음대로 정렬하기: Comparator Overriding

기본 데이터타입이 아닌 객체(Object)를 정렬해야 할 때가 있다. 또한, 자바에서 기본으로 제공해주는 정렬함수로는 수행하기 힘든 복잡한 방식/기준의 정렬이 필요할 때도 있다. 백준 #1931 회의실 배정 문제가 그 예시이다. 이럴 때 쓸 수 있는 방법은 여러 가지가 있는데, 그 중 Comparator의 compare 함수를 재정의하여 사용하는 방법을 정리해보겠다. 자바에 정의되어있는 Comparator를 오버라이드하여 내가 정한 기준에 따라 객체를 정렬하도록 만드는 방식이다. 어떤 새로운 형식의 객체를 정의하든지 상관 없다. 정렬의 방식과 기준도 자유롭게 정할 수 있다. 1차원 배열을 정렬할 때는 Arrays.sort() List 등을 정렬할 때는 Collections.sort()를 사용한다. 사용법..

자바로 트리 만들기

자바에서 간단한 트리를 만들어보았다. 클래스 Node 필드: 이름, 부모, 자식들 public int name; public Node parent; public ArrayList childs; 메소드: 생성자 public Node (int name){ this.name = name; childs = new ArrayList(); } 트리는 Node 객체들의 배열이다. 직관적으로 사용하기 위하여 1번 노드는 tree[1], 2번 노드는 tree[2]인 것으로 한다. 즉 5개의 노드를 가진 트리는 길이가 6인 Node 배열로 구현한다. parent가 null이면 그 노드는 root이다. childs가 비어있다면 그 노드는 leaf이다. 코드 다음은 입력받은 노드의 바로 아랫단계의 자식들을 모두 출력하는 코드..

부분문자열을 얻어올 때 사용하는 substring()

substring(int index) 특정 위치부터 끝까지의 부분문자열을 리턴한다. String str = "일이삼사오"; System.out.print(str.substring(2)); 위와 같은 코드를 실행하면 화면에는 "삼사오"가 출력된다. substring(int start, int end) 부분문자열의 시작위치와 끝 위치를 모두 지정할 수 있다. start 위치의 문자부터 end-1 위치의 문자까지를 리턴한다. end까지가 아닌 end-1까지라는 점에 주의하자. String str = "일이삼사오"; System.out.print(str.substring(1,4)); 위와 같은 코드를 실행하면 화면에는 "이삼사"가 출력된다. StringIndexOutOfBounds 예외를 관리할 때에도 1의 차..

개행문자

줄바꿈을 나타내는 문자를 개행문자라 한다. 개행문자에는 두 가지가 있다. \n 커서를 한 칸 아래로 이동하여 새로운 라인을 추가한다. \r 커서를 맨 왼쪽으로 이동한다. 그런데 운영체제마다 개행문자가 다르다. 윈도우: \n\r MAC: \r UNIX: \n 이로 인한 문제를 예방하기 위해 코드에 개행문자 자체를 적는 대신, 코드가 실행되는 환경의 운영체제에 맞는 개행문자를 알아서 취하도록 할 수 있다. 다음과 같이 쓰면 된다. System.getProperty("line.separator"); //혹은 System.lineSeparator(); StringBuilder에서 사용하는 예시는 다음과 같다. StringBuilder sb = new StringBuilder(); sb.append("abc");..