문제 핵심 포인트 굉장히 큰 크기(long보다 큰)의 int를 어떻게 계산할 것인가? 방법1. BigInteger 클래스 사용 import java.math.BigInteger; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scan = new Scanner(System.in); BigInteger big1 = scan.nextBigInteger(); BigInteger big2 = scan.nextBigInteger(); System.out.println(big1.add(big2)); } } 방법2. 배열을 이용해서 계산 (아래 코드에서 BufferWriter를 사용할 때 주의할 ..
API개념을 공부하기 위해 자료를 찾아봤는데, 많은 자료에서 API는 메뉴판이라는 비유로 설명을 하고 있었다. 메뉴판이라는 비유가 API라는 개념에 처음 접근하기에 친숙하고 가벼우면서도, 뭔가 개인적으로는 머리에 막 와닿지는 않았다. 이참에 많이 알려진 설명들에 내가 공부하면서 이해한 내용을 추가해서 정리해보려 한다. API란? 사전적인 정의 서로 다른 프로그램들 사이에서 데이터를 주고받기 위한 방법 , 애필리케이션에서 데이터를 읽거나 쓰기 위해 사용하는 인터페이스 설명 식당가서 요리사한테 , “ 야채 썰고 , 기름에 넣어서 야채기름 낸 다음 , 고기 썰어서 같이 볶고 , 마지막으로 밥 넣고 볶아서 가져와주세요” 라고 하진 않는다. 그냥 [메뉴판]을 보고 종업원에게 “[볶음밥] 주세요” 하지 여기서 [메..
Prefix sum ( 누적합 )장점 : 한번 누적합 배열을 만들어 놓으면 구간합을 빠르게 구할 수 있다.구간합 : 배열에서 특정 구간의 합 ( 예시 : arr[1234] ~ arr[1000000]까지의 모든 원소들의 합 )속도차이 ( 시간복잡도 )반복문을 사용해서 구간합을 연속적으로 구하는 일반적인 경우 시간복잡도는O(n)(반복문) x O(n)(구간합계산) = O(n²)이다. 하지만 누적합을 사용한다면O(n)(누적합 배열 구현) + O(n)(반복문) x O(1)(구간합 계산) = O(n)이 된다. 즉 훨씬 빠르다는 소리다.구현예시 누적합 구현시, 현재 위치 직전의 인덱스를 사용하기 때문에 기존 배열의 0번째 인덱스는 비워두는 편이 구현하기 수월하다.아래 코드와 그림을 보면 더 쉽게 이해할 수 있다.//..
아무 생각없이 int를 사용했다가 런타임 에러가 떠서 당황했다. 문제를 잘 보면 [입력 : 첫 번째 줄에 A, B, C (1 ≤ A, B, C ≤ 10¹²)이 공백을 사이에 두고 주어진다.] 에서 범위가 1 ~ 10의 12승이다. 하지만 int의 4바이트로 양의 범위는 최대 2,147,483,647(2의 31승 ) < 10의 10승 이기 때문에 런타임 에러가 뜬다. 따라서 8바이트 자료형(double,long long등)을 써줘야 런타임 에러가 발생하지 않는다. import java.util.Scanner; public class Main { public static void main(String[] args){ Scanner sc = new Scanner(System.in); long a,b,c; a ..
일단 추상클래스와 인터페이스는 추상메서드 없이는 설명이 불가능하기 때문에 추상메서드 먼저 살펴보자. 추상메서드란? 메서드는 선언부와 구현부로 나뉘는데 , 메서드들 중에서 선언부까지만 작성하고 구현부는 작성하지 않은 메소드를 추상메서드라고 한다. abstract를 메서드 앞에 붙여서 (정확히는 접근 제어자 앞이나 뒤에 붙여서) 추상메서드임을 명시한다. 추상메서드를 가진 클래스는 반드시 추상클래스여야 한다. 추상메서드는 구현부 즉 실행 코드가 없어서 추상메서드를 가진 클래스(추상클래스)는 인스턴스를 만들 수 없다. 추상클래스란? 구조적으로는 일반 클래스와 큰 차이는 없다. 똑같이 일반 필드 , 일반 메서드를 가질 수 있다. 차이점은 추상메서드를 가지고 있다는 것이다. abstract를 class 앞에 붙여서..
함수형 프로그래밍(Functional Programming)이란? 자료를 찾아보면서 이해하기 가장 좋았던 예시는 파이프라인이었다. 아래는 설명 전 이해를 돕기 위해한 자료로 , 내가 생각하는 함수형 프로그래밍의 기본 틀을 그림으로 표현한 것과 이미지이다. 개념 설명 파이프라인( 코딩에서는 함수 )은 input을 넣으면 input에 고정된 output을 내보낸다. 그림에서 보이다시피 외부에서는 파이프라인 안에 접근할 수도 볼 수도 없다. 마찬가지로 파이프라인 안에서도 외부에 접근하거나 볼 수 없다. 함수형 프로그래밍은 이런 파이프라인들( 함수들 )을 묶고 연결해서 프로그램을 만들어가는 프로그래밍 패러다임을 말한다. 함수형 프로그래밍의 특징 순수함수 = 함수에서 외부의 상태값을 참조하거나 외부의 상태를 변경..
데스크 탑에서 작업한 spring boot 프로젝트를 github에 올린뒤 노트북에서 pull해서 실행했는데 에러가 발생했다. 구글링을 해보니 chrome에서 보안상 https를 자동으로 붙여서 그런거다 , 서버 ip설정 문제다 .. 등등 많은 해결책이 있었지만 좀 생각해 보니 간단한 문제였다. 나는 mariadb에서 데스크탑과 노트북에서 사용하는 DB를 구분하려고 서로 사용하는 DB명을 다르게 했다. 근데 github올린 건 application.properties파일의 데이터베이스 설정에 데스트 탑 DB명으로 올려져 있기 때문에 생긴 문제였다. // application.properties 파일 ..... spring.datasource.url=jdbc:mariadb://localhost:3306/사..
DI 방법들을 알아보기에 앞서 먼저 @Autowired 어노테이션이 무엇인지 알아볼 필요가 있다. @Autowired는 사용된 위치의 변수 및 메서드에 필요한(의존하는) bean(스프링 빈)의 인스턴스를 IoC container에서 찾아 주입하는 역할을 한다. 쉽게 말해 스프링에서 의존관계 주입(DI)을 할 때 사용되는 어노테이션(Annotation)이다. 주의사항 : @Autowired는 의존 객체의 타입에 해당하는 bean을 찾아 주입한다. 그렇기 때문에 해당 타입의 bean이 없는 경우 작동하지 않는다. 또한 같은 이름의 bean이 여러 개일 경우도 있다.그럴 때는 @Primary 나 @ Qualifier(bean id) 등을 이용해서 해결할 수 있다. @Autowired 어노테이션은 기본적으로 생..