teching의 등록된 링크

키자드에 등록된 총 167개의 포스트를 확인하실 수 있습니다.

Tistory

필터(filter), 인터셉터(interceptor), AOP(Aspect-Oriented Programming) 살펴보기

Spring에서 필터와 인터셉터 그리고 AOP는 전부 공통 로직을 분리하여 처리하기 위해서 사용하기 위해서 사용되는 기능이다. 하지만 사용방법과 적용되는 위치의 차이가 있기 때문에 알맞게 사용해야 한다. 큰 구조는 Spring mvc Request 라이프 사이클을 통해 확인할 수 있다. ( AOP는 표시되어 있지 않지만...) 필터(Filter): 필터는 서블릿 컨테이너(예: Tomcat, Jetty)에서 요청과 응답을 가로채는 기능이다. 주로 요청과 응답의 헤더를 수정하거나 인코딩을 처리하는 등의 작업에 사용된다. Spring의 javax.servlet.Filter 인터페이스를 구현하여 사용한다. 필터는 web.xml에 등록하여 적용되고, Spring Boot에서는 FilterRegistrationBe..

Tistory

Bean, VO, DTO, Entity 구분하기

개발을 하면서 데이터를 다루기 위해서 여러 종류의 클래스들을 사용하게 되는데 대표적으로 Bean, VO, DTO, Entity 등이 있다. 이것들을 구분하여 언제 사용해야 하는지 알아보는 시간을 가져보았다. Bean Bean은 Java Bean과 Spring Bean으로 나눠지는데 조금 다른 의미가 있어 구분할 필요가 있다고 생각한다. Java Bean 자바로 작성된 소프트웨어 컴포넌트 클래스로 동작하기 위해 따라야할 몇 가지 관례가 있다 클래스는 직렬화되어야 한다.(클래스의 상태를 지속적으로 저장 혹은 복원시키기 위해) 클래스는 기본 생성자를 가지고 있어야 한다. 클래스의 속성들은 get, set 혹은 표준 명명법을 따르는 메서드들을 사용해 접근할 수 있어야 한다. 클래스는 필요한 이벤트 처리 메서드들..

Tistory

2022년 11월 부터 2023년 7월까지의 일일커밋 회고

먼저 일일커밋에 대해서 알게 된 경로는 백엔드 교육을 받으면서 우연히 강사님께서 소개해주신 이동욱 님의 블로그(https://jojoldu.tistory.com/ )를 소개시켜 주셨고 블로그를 보던 중 일일 커밋에 대한 글을 보고 알게 되었다. 일일커밋을 보고 마치 게임을 하듯이 경험치를 쌓는 느낌으로 할 수 있다는 느낌은 게임을 좋아했던 나를 일일커밋에 뛰어들게 만들었다. 처음에는 익숙하지 않았지만 매일매일 쌓여가는 잔디를 보며 내가 성장하고 있다는 느낌에 뿌듯함을 느꼈다. 점점 일일커밋이 습관이 되고 어느 순간부터는 하루라도 빼먹으면 불안감에 휩싸이는 집착이 되었다... 어떠한 커밋을 했는가인 내용은 둘째가 되었고 커밋을 한다는 그 행위에 집착하게 된것 같다. 즉, '깊이'를 늘릴생각을 하지 않게 된..

Tistory

코드리뷰 약어 살펴보기

사이드 프로젝트를 진행하고 있는 팀원들과 코드리뷰 아닌 코드리뷰를 진행하고 있는데 그동안은 정해진 규칙 없이 아무렇게나 작성하곤 했다. 그러다 보니 중요한 코멘트와 중요하지 않고 단순 의견임을 나태내기 어렵다는 생각이 들기 시작했다. 때로는 잘 작성한 것 같아 그냥 “수고하셨습니다.”만 날리곤 했다. 따라서 코드리뷰에서 주로 사용한느 약어들을 정리하여 실제로 사용보면 어떨까 하여 알아보았다. CL (ChangeList) 코드 변경 단위, 변경된 코드 리스트 NIT (NITpicking) 중요하지는 않지만 더 나은 방법이 있다는 의견 (TMI와 비슷한 느낌이다.) LGTM (Look Good To Me) 내가 보기엔 좋아보여라는 뜻으로 문제가 없어 보일 때 사용한다 비슷한 말로 (SGTM (Sounds G..

Tistory

[JSP] jsp 태그 알아보기

JSP 세팅 spring 3.0부터는 의존성 변경해야함 implementation 'jakarta.servlet:jakarta.servlet-api' implementation 'jakarta.servlet.jsp.jstl:jakarta.servlet.jsp.jstl-api' implementation 'org.apache.tomcat.embed:tomcat-embed-jasper' implementation 'org.glassfish.web:jakarta.servlet.jsp.jstl' JSP 태그 문법 (xml 문법) 주석 () 선언 ( ... ) 지시 () () (xmlns:prefix="tag library URL") 표현 ( ... ) 스크립트 ( ... )

Tistory

Java 로깅 알아보기 1 - Logging이란

로깅 (Logging) 시스템의 작동 정보인 로그(Log)를 기록하는 것 시스템이 작동할 때 작동 상태의 기록과 보존, 이용자의 습성 조사 및 시스템 동작의 분석 등을 하기 위해 작동 중 각종 정보를 기록하는 것 일반적인 출력인 System.out.println()은 동기이기 때문에 로그를 출력하는 동안 다음 동작을 할 수 없기 때문에 성능저하가 발생한다. Slf4j (Simple Java Facade For Java) 로깅 프레임워크가 아님. 다양한 로깅 프레임워크가 접근할 수 있도록 하는 추상화 계층(인터페이스) 단독적으로 사용할 수 없다. 브리지를 통해 자바의 다양한 로깅 프레임워크를 간편하게 사용할 수 있다. 로그 종류 Fatal : 아주 심각한 에러 Error : 요청을 처리하던 중 문제가 발생..

Tistory

Java 로깅 알아보기 2 - logback

2023.08.04 - [자바(Java)] - Java 로깅 알아보기 1 - Logging이란 기본적인 내용은 이전 글을 통해 확인하는 것을 추천! Log4j 구조 Logger : 로그의 주체, 로그의 메시지 전달, 특정 패키지 안의 특정 레벨 이상만 출력 Appender: 어디에 출력할지에 대해 기술 Encoder: 어떻게 출력할지에 대해 기술 Logback 환경 설정 (logback.xml) resources 하단에 logback.xml 파일 생성 %d{yyyy-MM-dd HH:mm:ss} %highlight([%-5p]) --- [%F]%M\\(%L\\) : %m%n 속성 설정 appender 부분은 출력위치를 결정해 주고 (STDOUT), Appender로 사용할 클래스를 설정해 주는 부분이다. ..

Tistory

AOP에 대해 알아보자

스프링의 중요 개념 중 하나인 AOP (Aspect-Oriented Programming)에 대해서 알아보는 시간을 가져보려고 한다. AOP란? AOP란 개발을 하면서 중복코드를 제거하고 모듈성을 향상하기 위해서 사용되는 프로그래밍 패러다임이다. spirng은 이러한 AOP를 지원하고 있다. AOP의 핵심은 “횡단 관심사”를 분리하는 것이다. 즉, 애플리케이션의 주요 로직과는 별도로 존재하는 공통된 기능들을 한 곳에 모아서 관리하는 것 이러한 공통 기능을 “Aspect”라고 하며, 이를 원하는 부분에 주입하여 적용한다! AOP 장점 모듈성 향상 : 핵심 비즈니스 로직과 공통 기능들을 분리하여 코드의 가독성과 유지보수성을 개선한다. 중복 코드 제거 : 공통 기능이 여러곳에서 필요한 경우, AOP를 사용하여..

Tistory

[Querydsl] querydsl 간단하게 알아보기

업무에서 Querydsl을 사용하게 될것같아서 간단하게 알아보는 시간을 가져 보았다. Querydsl를 짧게 표현하자면 SQL, JPQL등 쿼리를 코드로 작성하게 해주는 빌더 오픈소스 프레임워크이다. 소개 배경 Querydsl을 사용하기 이전에는 query를 문자열로 작성해야 했다. JPQL을 생각해보면 아래와 같이 작성하고 있었다. @query("select a from Test a") Optional findAll(); 이와 같이 작성하면 쿼리를 문자열로 작성하다보니 실수할 수 있고 또 문제가 컴파일때 발생하지 않고 실행시에만 문제를 찾을 수 있다는 단점이 있었다. 이를 해결하고자 Querydsl은 자바코드로 쿼리를 작성할 수 있게 해주어 개발자의 실수를 줄일고 컴파일 타임에 오류를 찾을 수 있도록 ..

Tistory

[Spring boot] war로 배포하기, SpringBootServletInitalizer

현재는 spring boot에 Tomcat이 내장되어있는 Embedded Tomcat형태의 jar파일로 빌드되어 단순히 실행하면 되지만 jsp를 사용하는 웹어플리케이션같은 경우에는 war로 빌드하여 Tomcat이나 Jetty와 같은 외부 서블릿 컨테이너를 통해서 배포를 해야 했는데 이경우에 SpringBootServletInitalizer를 상속받아서 실행되도록 하여야 한다. 즉, SpringBootServletInitalizer를 상속받는 이유는 웹 어플리케이션 서버를 war형태로 배포하기 위해서 사용한다. jar vs war 그렇다면 war와 jar는 어떤 차이가 있는건지도 알아보았다. 먼저 두파일 전부 어플리케이션을 간단하게 배포하고 실행시킬 수 있도록 관련파일들을 패키징해주는 것이 목적이다. ja..

Tistory

[JPA] 페이징 처리, Paging (Pagination, Infinite Scroll)

페이징 처리 페이지네이션? 무한 스크롤? 페이징 처리는 한 번에 모든 데이터를 가져오면 많은 시간이 걸리기 때문에 단위를 나눠서 데이터를 가져올 수 있도록 단편화시키는 것을 의미한다. 구글만 보더라도 아래와 같이 페이지네이션을 처리해 두었다. 위와 같이 페이지를 나누어 사용자가 골라 접근할 수 있도록 만든 것을 페이지네이션이라고 부른다. 웹페이지를 이용할 때 흔하게 볼 수 있는 모습이다. 반면 요즘에는 SNS 같은 곳을 보면 이러한 숫자방식의 페이지네이션이 아닌 스크롤을 모두 내리면 추가적인 콘텐츠를 불러오는 방식의 무한 스크롤(infinite scroll) 방식도 많이 사용한다. 하지만 이러한 방식의 차이는 어떻게 보여주냐의 차이일 뿐 내부적인 로직은 거의 흡사하다. 기본적인 동작 원리는 조회할 때 얼..

Tistory

6월 23일(금) 이노팩토리 면접 후기

여기저기 많은 기업에 서류를 넣고 탈락을 반복하던 와중 이노 팩토리라는 기업에서 면접 제안을 받게 되었다. 지금 시기에 흔치 않은 기회라 거절 않고 바로 수락하여 면접을 보게 되었다. 면접은 1:1로 진행되었고 집에서부터 걸린 시간, 공백기에 대한 질문, 기업에 대해 아는지와 같은 기본적인 질문들로 시작하셨다. 또한 자바에 관련된 질문을 해주셨는데 1. List vs Set vs Map 2. List vs ArrayList 3. 데이터베이스 Join 4. Inner Join vs Outter Join 이렇게 질문을 주셨고 아는 한도내에서 최대한 답변을 드렸다. 또한 원하는 연봉을 물어보시길래 내부 규정에 따르겠다고 말했으나 한 번 더 여쭤보셔서 3500을 불렀다. 이유도 여쭤보시길래 비슷한 조건의 많은 ..

Tistory

[Docker] Dockerfile 작성하는 방법

도커파일 작성 방법에 대해 학습하기 위해서 공식문서를 참고하여 학습하는 시간을 가져보았다. https://docs.docker.com/engine/reference/builder/ Dockerfile reference docs.docker.com 도커파일(DockerFile)이란? 도커의 이미지를 생성할 때 수행할 코드들을 작성해 두는 텍스트 파일이다. 즉, 템플릿 같은 역할을 하게 된다. 예로 java 17 버전을 이용한 spring boot jar 파일을 실행시킬 이미지를 만드는 dockerfile이다. FROM openjdk:17 ARG JAR_FILE=./build/libs/*.jar COPY ${JAR_FILE} /app.jar ENTRYPOINT ["java","-jar","/app.jar"]..

Tistory

7월 4일(화) 클릭앤터치 면접 후기

클릭앤터치 기업의 면접에 다녀왔다. 역삼에서 내려서 회사까지 걸어서 15분 정도 걸어가야 해서 도착하니 운동할 때보다 땀이 더 많이 났다 여자저차 도착해서 면접 시작했다. 면접은 면접관 2분 나 혼자 해서 2:1 면접으로 진행됐다. 처음은 자기소개로 시작했다. 여기서 기업이름을 잘못 말해서 시작부터 꼬였다. 이후로 순서는 모르겠고 대략 생각나는 질문만 기억해 보면 진행했던 프로젝트 소개 가족관계 (이건 왜 물어봤을까...) 오는 데 걸린 시간 인터프리터 vs 컴파일 사용해 본 언어를 인터프리터와 컴파일로 분류해 본다면? 자바 특징 다형성 설명 개발을 하면서 막히는 부분이 생기면 대처방법 사회생활을 하면서 중요하게 생각하는 3가지 연계질문 2~3개 더 던저주셨다. 공백기 질문 과에서는 어떠한 것을..

Tistory

[JPA] 생성일, 수정일 자동 기입 기능 추가하기 (AuditingEntityListener)

게시글과 같은 기능을 구현하다보면 생성일, 수정일을 관리해야하는 경우가 흔하게 발생한다. 이럴때 서비스로직에 직접 생성, 수정시에 해당 날짜를 생성일, 수정일 컬럼에 직접 update하는 방식으로 구현할 수 있다. 하지만 이렇게 되면 사람이 코드를 작성하다보니 까먹고 추가를 안하는 경우가 생겨 정상적으로 동작하지 않는 컬럼이 될수 있다. 이러한 부분을 해결하기 위해서 엔티티에 리스너를 추가하여 엔티티를 조작할때 추가적인 로직을 설정할 수 있다. 바로 AuditingEntityListener를 이용하는 것이다. EntityListener EntityListener는 엔티티에 이벤트가 발생하는 것을 감지하여 동작하는 로직을 구현할 수 있도록 해준다. JPA는 7가지의 이벤트를 감지할 수 있다. 사용 방법은 ..

Tistory

성격 검사 페이지 구현 회고 2 - 리액트에서 동적 비디오 로딩화면 구현하기 (복병 IOS혼내주기)

로딩화면? 성격 검사에 모두 응답을 하고 결과를 계산하기 위해 서버와 통신하는 사이 귀여운 캐릭터가 빙글빙글 도는 영상을 제공하려고 하였다. 기존에는 컴포넌트를 한 개씩 순서대로 보여주며 결과를 서버로부터 내려받을 때까지 로딩 애니메이션을 보여주다가 서버와 통신을 마치면 결과에 해당하는 캐릭터로 변신하는 애니메이션을 보여주고 끝나면 폭죽을 터트리며 결과화면으로 이어지는 하나의 애니메이션처럼 보이도록 단순하게 만들었다. 근데 단순히 컴포넌트를 변경하는 방법으로 구현했을 경우 네트워크 속도에 따라서 아직 영상 메타데이터들 조차 다운로드 되지 않아 빈화면으로 바뀌었다가 다시 변신 영상이 로드되는 모습이 보이게 되어 매끄럽지 않고 중간에 한번 끊기는 모습을 보여주었다. 또한 로딩 애니메이션이 끝난 뒤에 변신 애..

Tistory

Gradle을 이용한 순수 자바 Jar 만들기

스프링 부트에서는 간단하게 bootJar 커맨드를 이용해서 Jar파일로 만드는 것이 간편했지만 자바만 사용했을 때에는 몇 가지 작업을 해주어야 한다. 1. Gradle plugin 설정 그래들에는 Java에 관련된 Task들을 작업해 둔 기본 plugin이 존재한다. 이를 이용하면 빌드와 같은 작업들을 간단하게 할 수 있다. build.gradle에 다음 구문을 추가해주면 된다. plugins { id 'java' } 이와 같이 추가해주고 gradle build gradle jar 명령어를 실행해 주거나 인텔리제이에서 가장 우측에 보면 Gradle 탭이 있는데 거기에서 Tasks - build에 들어가서 build와 jar를 순서대로 작동시켜 주면 된다. 이렇게 하면 프로젝트 최상위 디렉터리에 build..

Tistory

Builder Pattern, 빌더 패턴

빌더 패턴 (Builder Pattern) 빌더 패턴이란? 객체를 단계별로 생성할 수 있게 만들어주는 패턴이다. 왜 사용하나요? 생성자의 의미가 좀 더 명확해진다. 재사용을 높인다. 단일 책임의 원칙 (생성만을 담당하는 빌더가 생김) 클래스에 여러 필드들이 있고 생성자에 너무 많은 파라미터를 두게 되면 호출 시에 매우 지저분한 코드가 될 것이다. 또한 파라미터를 부분적으로 사용하지 않는 경우 오버로딩을 통해서 해결할 수 있지만 생성자의 수가 기하급수적으로 늘어나게 될것이다. 빌더 패턴은 이러한 경우에 사용하면 좋은 효과를 볼 수 있다. 예를 들어 집을 만든다고 했을 때 창문의 형태, 수영장 여부, 크기, 주변 나무 개수, 지붕의 형태, 집의 형태 등등 다양한 조건이 올 수 있다. 이 것을 한 번에 만든다..

Tistory

JVM (Java Virtual Machine), 자바 가상 머신

JVM JVM이란? Java Virtual Machine의 줄임말로 자바를 실행하기 위한 가상 머신을 의미한다. Java는 OS에 종속적이지 않다는 특징이 있는데 이를 위해서 OS와 독립적으로 JAVA를 실행시켜 주는 역할을 하게 된다. 자바의 컴파일 과정 일종의 가상 머신이다. 우리가 작성한 java 코드 (원시 코드)는 CPU가 인식하지 못하기 때문에 기계어로 번역을 해주어야 한다. JVM이 기계어로 번역해주기 때문에 JVM이 읽을 수 있는 코드인 Java Bytecode (. class) 파일로 번역을 해서 JVM에 전달해 주게 된다. 우리는 java코드만 작성하여 class 파일만 생성하면 JVM을 통해 OS에 무관하게 실행시킬 수 있는 것이다. 자바 컴파일러 JDK 설치하면 bin에 존재하는 j..

Tistory

Spring boot의 설정 정보(application.yml / properties) 분리시키기 - spring profiles

사용 이유 현재 진행 중인 프로젝트에서 오라클 클라우드 프리티어를 이용해서 배포 테스트를 진행하게 되었다 현재 application.yml을 서브 모듈 ( https://teching.tistory.com/144 )을 사용해서 관리하고 있는 상황이었다. spring boot 설정 정보 외부에서 관리하기 2 - submodule https://teching.tistory.com/143 [spring boot 설정 정보 외부에서 관리하기 Spring boot 설정 정보 관리하기 서버를 github를 사용해서 형상관리를 할 생각인데 레파지토리를 public으로 열어두려고 한다... 공개 teching.tistory.com 오라클 클라우드의 DB는 특이하게 지갑을 이용해서 접속해야 하는데 그 경로를 지정 해주어..

Tistory

MacOS에서 JDK (Java Developer Kit) 설치하기

맥북을 사용 중에 Java의 버전을 관리하고 싶어 설치방법을 알아보던 중 기록해두어야 할 것 같아서 글을 작성하게 되었다 맥북을 사용하는 사람이라면 대부분 설치되어있는 homebrew를 사용하여 설치하려고 한다. (그게 아니라면 직접 openjdk의 레파지토리에 들어가서 다운로드해주면 된다.) 주소 : https://jdk.java.net/java-se-ri/17 Java Platform, Standard Edition 17 Reference Implementations Java Platform, Standard Edition 17 Reference Implementations The official Reference Implementation for Java SE 17 (JSR 392) is based..

Tistory

성격 검사 페이지 구현 회고 1 - github pages에서 react 배포하기

https://16ssss.github.io/ Sixteens. site 16ssss.github.io 해당 페이지를 만들고 배포하면서 겪었던 문제들을 회고하기 위해서 이 글을 작성하게 되었다. 구현하게 된 계기 현재 진행하고 있는 프로젝트에서 웹을 다룰 줄 아는 팀원이 없었다... 그나마 내가 리액트를 접해본 적이 있었기에 내가 담당하게 되었다. (백엔드에서 어느 정도 성장을 이루면 프런트엔드도 맛보리라 생각했기에 이 기회에 맛을 봐보자라고 생각했었음) 그렇게 나만 믿으라며 의기양양하게 시작하게 된 리액트... 하지만 시작부터 순조롭지 않았다. gh-pages 리액트를 깃허브 페이지에 배포하기 위해서는 빌드한 파일을 레파지토리에 올리고 github pages 설정을 해주어야 한다. 이걸 직접 했었는데 ..

Tistory

AWS 알아보기 5 - AWS RDS & Aurora

AWS RDS & Aurora AWS RDS란? 클라우드 관계형 데이터베이스를 간편하게 설정, 운영 및 확장할 수 있는 관리형 서비스 모음 RDS는 EC2위에서 동작하는 서비스 ( DB를 사용하기 위해서는 인스턴스가 필요하기 때문) 굳이 그렇게 하지 않는 이유는 DB를 좀 더 손쉽게 관리, 모니터링하기 위해서 RDS를 사용 RDS를 왜 사용? → 주요 기능들 때문 RDS 백업: 자동 백업, DB 스냅샷 멀티 AZ: 두 개 이상의 AZ에 걸쳐 DB를 구축하고 원본과 다른 DB(standby)를 자동으로 동기화(Snyc), 읽기 전용 복제본 CloudWatch 연동: DB인스턴스의 모니터링 (디테일 모니터링, CPU, Storage 사용량, 그 이외의 Error Log 등) → 클라우드 워치에 익숙해져야 한..

Tistory

AWS 알아보기 6 - DynamoDB & Elasticache

DynamoDB & Elasticache AWS DynamoDB 완전관리형 NoSQL 데이터베이스 서비스로서 원활한 확장성과 함께 빠르고 예측 가능한 성능을 제공 서버리스이므로, 따로 유지비용 없이 사용한 만큼한 지불 보조 인덱스를 통한 빠른 조회를 지원 NoSQL 특성상 관계가 없기 때문에 일반적으로 데이터를 찾기에는 인덱싱이 없으면 속도가 느려지지만 그 부분을 해결해 줍니다. 서버리스(람다) 서버와의 궁합이 매우 잘 맞는다. 람다에는 RDS를 사용하는 것은 기피해야 하고 다이나모 DB를 만들어야 한다. 람다는 서버리스이기 때문에 오토스케일링이 자유롭다. 따라서 DBMS의 connection pool을 넘어갈 수 있기 때문에 위험하다. 혹은 planetscale라는 서버리스 서비스를 사용한다. 파티션키..

Tistory

트랜잭션 (tansaction)

트랜잭션 (tansaction) 트랜잭션이란? 트랜잭션이란 서비스에서 쪼갤수 없는 쪼갤수없는 로직의 단위이다. 예로 은행업무에서 이체를 할때 두가지 로직을 수행하게 된다. A의 통장에 X만큼의 금액을 감소시킨다. B의 통장에 X만큼의 금액을 증가시킨다. 이 두개의 로직중 한개만 동작해서는 안되고 항상 두개가 동작하거나 두개다 동작하지 않아야 한다. 따라서 이 두개의 로직은 하나의 트랜잭션으로 묶여야 한다. 트랜잭션의 속성 ACID 원자성(Atomicity), 일관성(Consistency), 격리성(Isolation), 영속성(Durability)이 존재한다. 이 4가지 속성의 앞글자를 따서 ACID라고 부른다. 원자성(Atomicity) 트랜잭션에 속한 각각의 문(데이터를 읽기, 쓰기, 업데이트 또는 삭..

Tistory

AWS 알아보기 2 - AWS 인프라

AWS 인프라 AWS VPC Virtual Private Cloud 최초에 구축하는 사람이 아니라면 거의 만질일이 없다. (devops 전담팀이 따로 있을 정도) 가상 네트워크 서비스로 퍼블릭 네트워크와 프라이빗 네트워크를 분리하고 모니터링할 수 있도록 해주는 서비스 네트워크 구성과 관련된 사실상 모든 기능을 담당하며, 자체 데이터 센터에서 운영하는 기존 네트워크와 매우 유사한 형태 private 서브넷은 외부와의 인터넷은 연결이 안되는데 Nat게이트웨이를 사용하면 연결 가능 AWS API Gateway 어떤 규모에서든 개발자가 API를 손쉽게 생성, 게시, 유지 관리, 모니터링 및 보안 유지할 수 있도록 하는 완전관리형 서비스 서버의 “대문”과 같은 역할 API Gateway가 할 수 있는 것들: 트래..

Tistory

AWS 알아보기 3 - 컴퓨팅 파워 (Computing Power)

Computing Power (서버) AWS EC2, AWS Elastic Beanstalk, AWS ECS, AWS Fargate, AWS Lambda (Serverless) AWS EC2 (Amazon Elastic Cloud Compute) 가장 기본적인 형태의 클라우드 컴퓨팅 (= 클라우드 컴퓨터 한 대) 온디맨드 선결제 금액이나 장기 약정 없이 저렴하고 유연하게 Amazon EC2를 사용하기 원하는 사용자 스팟 인스턴스 시작 및 종료 시간이 자유로운 애플리케이션 (노는 자원 활용하기) 안정성이 보장되는 서버에는 사용하면 안된다 보통 배치에 사용, 머신러닝에 사용 Saving Plans 1년 또는 3년 기간의 일정 사용량 약정을 조건으로 EC2 및 Fargate 사용량에 대해 저렴한 요금을 제공하..

Tistory

AWS 알아보기 4 - 메시지 큐 (Message Queue)

Message Queue AWS SQS, AWS Kinesis Queue? https://www.codenary.co.kr/architecture/list?category=실시간 스트리밍 https://www.codenary.co.kr/architecture/list?category=Event Driven https://www.codenary.co.kr/architecture/list?category=대용량 처리 비동기로 이벤트를 처리하기 위해 사용 AWS SQS Amazon Simple Queue Service 마이크로서비스, 분산 시스템 및 서버리스 애플리케이션을 위한 완전관리형 메시지 대 기열 표준 대기열 무제한 처리량 / 최소한 한 번 전달 (여러번 전달 될 수도 있음) / 최선 노력 순서 보통 ..

Tistory

Abstract Factory Pattern, 추상 팩토리 패턴

추상 팩토리 패턴(abstract factory pattern) 추상 팩토리 패턴이란? 추상 팩토리 패턴은 관련된 여러 객체를 일관된 방식으로 생성하는 인터페이스를 제공하는 패턴이다. 즉, 관련성 있는 여러 종류의 객체를 생성하는 경우 사용된다.. 추상 팩토리 패턴을 사용하면 구체적으로 어떤 클래스의 인스턴스를 사용하는지 클라이언트에게 감출 수 있다. 이 추상 팩토리 패턴을 이해하기 위해서는 팩토리 메서드 패턴을 이해해야 한다. 왜냐면 팩토리 메서드 패턴에서 발전한 것이 추상 팩토리 패턴이기 때문이다. --> 팩토리 메서드 패턴 학습하러 가기 팩토리 메서드 VS 추상 팩토리 팩토리 메서드 추상 팩토리 의도 단일 유형 객체 생성 관련 유형 그룹으로 관리 구현 방법 추상 클래스 인터페이스 다만, 구현방법은 ..

Tistory

컨테이너, Container

Container Container란? 가상화 기술중 하나 호스트 운영체제 위에 여러 개의 격리된 환경을 생성하는 것 각각의 컨테이너 안에서 애플리케이션을 실행하게 된다. (실행환경을 애플리케이션 마다 관리할 수 있게 된다.) 리눅스의 커널 기능을 사용하여 만들어 졌다. chroot(파일 시스템 격리), namespace(프로세스 격리), cgroup(하드웨어 격리) 조합으로 격리 프로세스 단위 격리 대표적인 예로 도커가 있다. VM vs Container 컨테이너 기술은 각 애플리케이션 또는 서비스에 대해 별도의 OS 인스턴스 오버헤드가 필요하지 않기 때문에 더 가볍고 효율적입니다. VM < - > Container 출처: https://www.itworld.co.kr/news/103469 하이퍼 바이..

Tistory

AWS 알아보기 1 - AWS란?

AWS란? On-premise vs Cloud Computing On-premise 온프레미스란기업의 서버를 클라우드 같은 원격 환경에서 운영하는 방식이 아닌, 자체적으로 보유한 전산실 서버에 직접 설치해 운영하는 방식 Cloud Computing 클라우드 컴퓨팅은 인터넷을 통하여 데이터를 저장하거나 데이터베이스, 서버, 네트워킹, 소프트웨어와 같은 도구, 애플리케이션등 다양한 서비스를 제공하는 방식 Cloud Computing을 쓰는 이점 점점 증가하는 서버 인스턴스의 수를 온프레미스로 감당하기엔 점점 벅참 (공간적, 비용적 문제) 이를 클라우드 컴퓨팅을 통해 해결 글로벌 서비스를 제공하려면 각 국가에 데이터 센터를 직접 구축해야하는 것을 대신 AWS를 통해 해결 예로 카프카의 클러스터 규모를 살펴보면..

Tistory

Spring boot 설정 정보 외부에서 관리하기 2 - submodule

https://teching.tistory.com/143 Spring boot 설정 정보 외부에서 관리하기 1 - 개요 Spring boot 설정 정보 관리하기 서버를 github를 사용해서 형상관리를 할 생각인데 레파지토리를 public으로 열어두려고 한다... 공개하게 되면 spring boot의 application.yml파일에는 아래와 같이 DB 접속 정 teching.tistory.com 지난번에 설정정보를 관리하는 여러 방법을 알아본 후 그 중 Submodule을 사용해서 설정정보를 관리해 보려고 한다. 이를 위해서 submodule에 대한 공부가 필요한것 같아 가볍게 알아보는 시간을 가져보려고 한다. 서브 모듈 서브 모듈이란? 서브 모듈이란, 프로젝트 내부에 다른 프로젝트를 사용해야 하는 경..

Tistory

REST란

REST 개념 REpresentational State Transfer의 약자 월드 와이드 웹(www)과 같은 분산 하이퍼미디어 시스템을 위한 소프트웨어 개발 아키텍처의 한 형식 REST는 기본적으로 웹의 기존 기술과 HTTP 프로토콜을 그대로 활용하기 때문에 웹의 장점을 최대한 활용할 수 있는 아키텍처 스타일 REST는 네트워크 상에서 Client와 Server 사이의 통신 방식 중 하나 한마디로 웹의 장점을 살려 활용하기 위한 하나의 네트워크 기반 어플리케이션 아키텍처 스타일 아키텍처 스타일? 스타일을 따르는 아키텍처가 지켜야하는 제약조건들의 집합 REST 구성 자원 (Resource) : URI 모든 자원에 고유한 ID 존재, 자원은 Server에서 관리 자원을 구별하는 ID는 HTTP URI다..

Tistory

SingleTon Pattern , 싱글톤 패턴

싱글톤 패턴 (Single Ton) 싱글톤 패턴이란? 싱글톤은 클래스를 구현할때 메모리상에 하나의 인스턴스만 존재하게 하여 사용하는 패턴 왜 사용 하나요? 객체를 구현할때 메모리 리소스가 사용된다. 한개의 전역 객체로 만들어 둔다면 이러한 리소스낭비를 줄일 수 있기 때문입니다! 어디에서나 접근 가능하도록 만들기 위함입니다. 언제 사용하나요? 데이터베이스 커넥트 풀과 같이 같은 객체를 자주 사용하는 경우에 사용하면 좋아요! 문제점 싱글톤에 많은 역할들이 담기게 되면 객체지향원칙에 어긋나게 된다. => 유지보수가 힘들어 진다. 만약 멀티 스레드 환경에서 동기화 문제를 처리하지 않는다면 2개가 생기는 문제가 발생할 수 있습니다. 구현 방법 (자바) 다른 객체들이 싱글턴 클래스와 함께 new 연산자를 사용하지 ..

Tistory

Factory Method Pattern, 팩토리 메서드 패턴

팩토리 메서드 패턴이란? 팩토리 메서드 패턴은 부모(상위)클래스에 알려지지 않은 추상 클래스를 생성하는 패턴으로 자식(하위)클래스가 직접 어떤 객체를 생성할지 결정하도록 하는 패턴! 즉, 객체 생성을 위한 패턴으로 생성과 사용의 분리를 통해서 유연하게 객체를 생성할 수 있게 된다. 또한 객체 생성에 필요한 과정들을 템플릿처럼 정해놓고 각 과정을 구현할 수 있다. 왜 사용하나요? 생성자 (Creator)와 구현 객체(concrete product)의 강한 결합을 피함 객체가 생성될때 반복적으로 할 일을 수행시킬 수 있음 캡슐화, 추상화를 통해 생성되는 객체의 구체적인 타입 은닉 단일 책임 원칙 (SRP) 준수 객체 생성 코드를 한 곳 (패키지, 클래스 등)으로 이동시켜 코드를 유지보수하기 쉽게할 수 있으므..

Tistory

디자인 패턴 (Design patterns)

GoF의 디자인 패턴(개정판) 객체지향 소프트웨어를 설계할 때 겪는 문제들에 대한 해결책을 집대성하여 제시하는 『GoF의 디자인 패턴』. 이 책은 디자인 패턴이 무엇인지, 패턴이 어떻게 객체지향 프트웨어 설계에 어떻게 도움을 주는지, 실제 디자인 패턴은 어떻게 되는가 등에 관하여 정리한 내용들을 수록하고 있다. 저자 에릭 감마, 리처드 헬름, 랄프 존슨, 존 블리시디스 출판 Pearson 출판일 2011.11.01 디자인 패턴은 GoF(4인의 갱)으로도 알려진 Erich Gamma(에리히 감마), Richard Helm(리처드 헬름), Ralph Johnson(랄프 존슨), John Vlissides(존 블리시데스)이 1994년 출판한 "Design Patterns: Elements of Reusable..

Tistory

JAVA 면접 예상 질문 리스트

요즘 유행하는 chatgpt를 사용해보고 싶어 chatgpt를 사용해서 자바에서 알아둬야 할 것들을 정리해 보았습니다. Java 언어의 특징은 무엇이며, 이를 어떻게 활용할 수 있나요? 플랫폼에 독립적인 애플리케이션 개발: Java는 JVM에서 실행되므로, 플랫폼에 구애받지 않고 애플리케이션을 개발할 수 있습니다. 객체지향적인 설계: Java는 OOP를 지원하므로, 객체지향적인 설계를 통해 코드의 가독성과 재사용성을 높일 수 있습니다. 안정적인 애플리케이션 개발: Java는 예외 처리를 지원하여, 애플리케이션의 안정성을 높일 수 있습니다. 개발 생산성 향상: 다양한 라이브러리와 프레임워크를 제공하므로, 개발 생산성을 향상시킬 수 있습니다. Java에서 객체지향 프로그래밍(OOP)이란 무엇이며, OOP의 ..

Tistory

Spring boot 설정 정보 외부에서 관리하기 1 - 개요

Spring boot 설정 정보 관리하기 서버를 github를 사용해서 형상관리를 할 생각인데 레파지토리를 public으로 열어두려고 한다... 공개하게 되면 spring boot의 application.yml파일에는 아래와 같이 DB 접속 정보, API 키와 같은 공개되면 안 되는 민감정보가 포함되어 있어 위험할 수 있다고 생각이 들었다. 이것을 그대로 public 레파지토리 올리면 무수한 해킹 요청이 있을 것만 같았다. server: port: 9999 spring: datasource: url: jdbc:mysql://localhost/mydb username: root password: secret 그래서 설정 정보를 갖고있는 파일을 레파지토리에 포함하지 않고 따로 관리하기 위해서는 어떤 방법이 ..

Tistory

자바 코딩테스트를 위한 정리 - 입출력2 (EOF 처리)

EOF란 End of File의 줄임말로 파일의 끝을 뜻합니다. 알고리즘 테스트에선 일반적으로 테스트 케이스의 수를 따로 명시해주지 않고 입력을 가변적으로 받을때 사용하게 됩니다. 예로 '4375번 문제 (문제 제목: 1)'이 있습니다. 이와 같이 문제에서 테스트케이스의 개수 혹은 끝을 명시해주지 않을때 어떻게 처리해야하는지 알아보도록 하겠습니다. 자바의 대표적인 두가지 입력 클래스인 아래 2가지 기준으로 설명하겠습니다. 1. Scanner 2. BufferedReader 1. Scanner Scanner에서 EOF를 처리하는 방법은 hasNext()메소드를 사용해서 처리하는 방법입니다. 해당 메소드는 다음 입력이 있으면 true 없으면 false를 반환합니다. 이를 사용해서 EOF여부를 확인할 수 있습..

Tistory

Sync(동기), Async(비동기) 와 Blocking(블로킹), Non-Blocking(논블로킹)의 차이점

얼마전까지만 해도 동기, 비동기와 블로킹, 논블로킹의 차이에 대해 인지하고 있지 않았는데 다 다른것을 의미한다는 것을 알게되었고 좀 더 명확하게 알고자 정리를 하게 되었다. 간단하게 정리를 하자면 두가지의 큰 차이점은 동기/비동기는 프로세스의 수행 순서에 대한 이야기인 반면 블로킹/논블로킹은 입출력(프로세스 유후 상태)에 대한 이야기이다. 동기와 비동기 동기와 비동기는 함수의 제어권과는 관련없이 함수의 동작순서에 초점을 맞춘것이다. 동기 (Synchronized) 먼저 동기를 살펴보자. 동기의 단어의 뜻을 살펴보면 同期 같은 시기, 또는 같은 기간 라는 뜻을 가지고 있다. 즉, 데이터의 요청과 응답이 동시에 일어난다는 뜻이다. 호출하는 A가 호출되는 B가 끝날때까지 신경을 쓰고있다면 이것은 동기함수이다...

Tistory

AWS EC2 인스턴스 생성하기

01_AWS EC2 인스턴스 EC2 인스턴스 생성 1. EC2 인스턴스 생성을 위해서 EC2 서비스 접속 2. 인스턴스 탭 클릭 3. 오른쪽 상단위에 “인스턴스 시작” 클릭 4. 인스턴스 생성 5. 이름 설정 : 인스턴스의 이름 입력하기 6. 애플리케이션 및 OS 이미지 선택: EC2 인스턴스에 설치할 OS를 선택 7. 인스턴스 유형 선택 (현재 jenkins과 micro 유형사이에 오류가 발생해서 jenkins 사용시 micro 시스템에서 가능한지 확인 후 생성 권장) 8. 키 페어 : SSH 연결과 같은 인스턴스 접속 할때 사용할 키 선택 OR 생성 9. 네트워크 설정: VPC, 서브넷 등 네트워크 설정. 일반 사용자라면 건들지 않고 기본 설정으로 사용해도 된다. 10. 스토리지 구성: 볼륨 설정을 ..

Tistory

AWS S3 인스턴스 생성 + Spring boot 연동

버킷 생성 1. 버킷 인스턴스 대시보드에 들어가기 버킷 만들기 클릭 버킷 이름 작성 AWS 리전: 아시아 태평양(서울) 선택 그외에 모든 설정은 그대로 버킷 생성 S3 권한이 있는 IAM 계정 만들기 & 엑세스 키 발급받기 S3 권한이 있는 IAM계정을 발급 받아서 진행하는 것이 보안에 좋아요! 지금은 S3 IAM 계정이 있기 때문에 엑세스 키 발급만 진행하도록 하겠습니다. 1. aws 프로필 - 보안 자격 증명 2. 보안 자격증명에 들어가면 아래 액세스 키 만들기 를 통해서 액세스 키를 만들어 주면됩니다. 비밀번호는 이때밖에 볼수없으니 잘 기록해두거나 csv파일로 잘 저장해두세요! Spring boot에서 연동하기 1. 의존성 추가 pom.xml에 아래 스타터를 추가해주세요. (maven을 기준입니다...

Tistory

웹 서버(WEB), 웹 애플리케이션 서버(WAS), 서블릿, 스레드

웹 서버(Web Server) HTTP 기반으로 동작 정적 리소스 제공(템플릿), 기타 부가기능 정적(파일) HTML, CSS, JS, 이미지, 영상 예) NGINX, APACHE 웹 애플리케이션 서버(WAS, Web Application Server) HTTP 기반으로 동작 웹 서버 기능 포함 (정적 리소스 제공 가능) 프로그램 코드를 실행해서 애플리케이션 로직 수행 - 동적 HTML, HTTP API(JSON) - 서블릿, JSP, 스프링 MVC 예) 톰캣(Tomcat), Jetty, Undertow 웹 서버와 웹 애플리케이션 서버의 차이 웹 서버는 정적 리소스(파일), WAS는 애플리케이션 로직 하지만 둘의 용어의 경계가 모호하다. - 웹 서버도 프로그램을 실행하는 기능을 포함하기도 함. - 웹 애..

Tistory

백준 1920: 수 찾기 (파이썬)

문제: https://www.acmicpc.net/problem/1920 1300번: K번째 수 세준이는 크기가 N×N인 배열 A를 만들었다. 배열에 들어있는 수 A[i][j] = i×j 이다. 이 수를 일차원 배열 B에 넣으면 B의 크기는 N×N이 된다. B를 오름차순 정렬했을 때, B[k]를 구해보자. 배열 A와 B www.acmicpc.net 코드 #https://teching.tistory.com/ import sys def find(a, list): left = 0 right = len(list) while left < right: mid = (left + right) // 2 if list[mid] > a: right = mid elif list[mid] < a: left = mid + 1 e..

Tistory

자바 코딩테스트를 위한 정리 - 입출력

입력 1. scanner() 가장 기본적인 입력 클래스이다. import java.util.Scanner; 사용하기 위해서는 패키지를 추가해주어야 한다. Scanner scanner = new Scanner(System.in); 스캐너는 토큰 단위로 동작하는 클래스임을 기억하자.(토큰 단위: 공백/개행 문자로 구분되는 단위) Scanner() 메서드 (반환형) - close(): 입력 종료, 할당받았던 자원들 반납하기 띄어쓰기 단위 - next(): String 읽기 (String) - nextInt(): int 읽기 (int) - nextBoolean(): boolean 읽기 (boolean) - nextByte(): byte읽기 (byte) - nextShort(): short 읽기 (short) -..

Tistory

HTTP 알아보기 3 - 상태 코드

HTTP 상태 코드 클라이언트가 보낸 요청의 처리 상태를 응답에서 알려주는 기능 1xx (Informational): 요청이 수신되어 처리 중. 2xx (Successful): 요청 정상 처리. 3xx (Redirection): 요청을 완료하려면 추가 행동이 필요할 때 4xx (Client Error): 클라이언트 오류, 잘못된 문법 등으로 서버가 요청을 수행할 수 없을 때 5xx (Server Error): 서버 오류, 서버가 정상 요청을 처리하지 못하는 상태. 따라서 인식할 수 없는 상태 코드를 서버가 반환하면 클라이언트는 상위 상태 코드로 해석해서 처리하면 된다. 예를 들어, 299번의 모르는 코드가 오면 2xx코드 (Successful, 정상 처리)로 처리하면 된다. 1xx (Infromation..

Tistory

HTTP 알아보기 4 - 헤더

HTTP Header header-field = field-name ":" OWS field-value OWS (OWS: 띄어쓰기 허용) field-name 대소문자 구문 없음 HTTP 전송에 필요한 모든 부가 정보 예) 메시지 바디의 내용, 메시지 바디의 크기, 압축, 인증, 요청 클라이언트, 서버 정보, 캐시 관리 정보... 표준 헤더가 매우 많음 필요시 임의의 헤더 추가 가능 분류 - General 헤더: 메시지 전체에 적용되는 정보, 예) Connection: close - Request 헤더: 요청 정보, 예) User-Agent: Mozilla/5.0 (Macintosj; ..) - Response 헤더: 응답 정보, 예) Server: Apache - Entity 헤더: 엔티티 바디 정보, ..

Tistory

HTTP 알아보기 5 - 캐시, 프록시 캐시

캐시가 없을 때 같은 데이터를 반복해서 보낼 때 HTTP 헤더의 크기가 1MB, 바디의 크기가 10MB라면 총 11MB의 데이터를 반복해서 전송해야 한다. 따라서 사용자는 반복되는 데이터를 불필요하게 계속 받아야 하므로 로딩 속도가 느려지게 된다. 해당 문제를 해결하기 위해서 캐시라는 기술을 적용하게 되었다. 캐시 클라이언트가 최초로 서버에 요청을 할때 데이터를 정상적으로 보내준다. 헤더에 cache=control: max-age=60 (생명 주기, 초 단위)를 포함하여 보낸다. 클라이언트는 두번째 요청부터는 캐시에 해당 데이터가 유효 상태로 있다면 서버에서 받을 필요 없이 바로 캐시 저장소에서 꺼내서 쓸 수 있게 된다. 캐시 시간이 초과되면 최초로 서버에 요청하는 단계를 반복한다. 정리 캐시 가능 시간..

Tistory

IP, TCP/UDP, DNS

패킷 교환(IP - Internet Protocol, 인터넷 프로토콜) 독립적인 다양한 형태의 네트워크를 엮어내겠다는 아이디어에서 시작했다. 따라서 기존의 전화망 이외에 위성을 사용한 통신망, 지상의 무선 네트워크도 모두 포괄해야 했기 때문에 선을 연결해서 하는 전화망 타입인 회선교환이 아닌 데이터를 패킷으로 쪼개 교환하는 방법을 택해였다. 이에 따라 다양한 네트워크에서 사용하는 통신 규칙이 (패킷의 틀과 같은) 필요했다. 이렇게 만들어진 것이 바로 IP(Internet Protocol)이다. 다양한 네트워크를 노드라고 부르기로 하였고 모든 노드들을 유기적으로 연결했다. 이러한 노드들을 통해서 나의 메시지(패킷)를 전달하기 위해서는 주소가 필요하다. (마치 우체국을 통해서 우편을 보낼때 상대방의 주소를 ..

Tistory

URI, URL, URN

URI (Uniform Resource Identifier) URI는 로케이터(Locator), 이름(name) 또는 둘 다 추가로 분류될 수 있다. (https://www.ietf.org/rfc/rfc3986.txt - 1.1.3. URI, URL, and URN) Uniform: 리소스를 식별하는 통일된 방식 Resource: 자원, URI로 식별할 수 있는 모든 것(제한 없음) Identifier: 다른 항목과 구분하는데 필요한 정보 URL Locator로 리소스가 있는 위치를 지정한다. 변할 수 있다. 보통 URI라고 말하면 URL을 뜻한다. URL : scheme://[userinfo@]host[:port][/path][?query][#fragment] userinfo@ - 사용자 인증정보 - ..

Tistory

HTTP 알아보기 1 - 특징, 메시지

HTTP(HyperText Transfer Protocol) 하이퍼텍스트 문서 간 링크를 통해 전송 HTTP 메시지에 모든 것을 전송한다 HTML, TEXT IMAGE, 음성, 영상, 파일 JSON, XML(API) 거의 모든 형태의 데이터 전송 가능함 서버 간에 데이터를 주고받을 때도 대부분 HTTP 사용한다. 역사 HTTP/0.9 (1991년): GET 메서드만 지원, HTTP 헤더 X HTTP/1.0 (1996년): 메서드, 헤더 추가 HTTP/1.1 (1997년): 가장 많이 사용하는 버전 - TCP 사용 - RFC2068 (1997) > RFC2616(1999) > RFC7230~7235(2014) HTTP/2 (2015년): 성능 개선 - TCP사용 HTTP/3 (2020년~): TCP대신 U..

Tistory

HTTP 알아보기 2 - 메서드, API

HTTP 메서드 HTTP API를 만든다고 가정해보자. 따라서 회원 정보 관리 API를 만들어 보았다. 회원 목록 조회 (/read-member-list) 회원 조회 (/read-member-by-id) 회원 등록 (/create-member) 회원 수정 (/update-member) 회원 삭제 (/delet-member) 해당 방법처럼 만드는 경우가 있는데 위의 방법은 좋지 않은 방법이다. URI는 리소스 식별!!, URI 계층 구조를 활용해야 한다. 리소스란? - 회원을 등록하고 수정하고 조회하는 것이 리소스가 아님. - 회원이라는 개념 자체가 바로 리소스 리소스를 식별하는 방법 - 회원을 등록하고 수정하고 조회하는 것을 모두 배제 - 따라서 회원이라는 리소스만 식별하면 된다. -> 회원 리소스를 U..

Tistory

백준 2740: 행렬 곱셈 (파이썬)

문제: https://www.acmicpc.net/problem/2740 2740번: 행렬 곱셈 첫째 줄에 행렬 A의 크기 N 과 M이 주어진다. 둘째 줄부터 N개의 줄에 행렬 A의 원소 M개가 순서대로 주어진다. 그 다음 줄에는 행렬 B의 크기 M과 K가 주어진다. 이어서 M개의 줄에 행렬 B의 원소 K개 www.acmicpc.net 코드 #https://teching.tistory.com/ import sys n1, m1 = map(int, sys.stdin.readline().split()) matrix1 = [list(map(int, sys.stdin.readline().split())) for _ in range(n1)] n2, m2 = map(int, sys.stdin.readline().sp..

Tistory

백준 11444: 피보나치 수 6 (파이썬)

문제: https://www.acmicpc.net/problem/11444 11444번: 피보나치 수 6 첫째 줄에 n이 주어진다. n은 1,000,000,000,000,000,000보다 작거나 같은 자연수이다. www.acmicpc.net 코드 # https://teching.tistory.com/ import sys def matrixMultiple(matrix1, matrix2): res = [[0]*len(matrix2[0]) for _ in range(len(matrix1))] for i in range(len(matrix1)): for j in range(len(matrix2[0])): for k in range(len(matrix1[0])): res[i][j] += matrix1[i][k] ..

Tistory

피보나치 수를 구하는 다양한 방법

알고리즘 문제를 풀다 보니 피보나치 수를 구하는 방법이 상당히 많다. 따라서 이 피보나치 수로 배울 수 있는 알고리즘이 다양하기에 한번 정리를 해보려고 한다. 피보나치 수열이란? 기원전 5세기 인도의 수학자 핑갈라가 쓴 책에서 처음 언급 됐으며 유럽에서 레오나르도 피보나치가 토끼 수의 증가에 대해서 이야기 하면서 유명해졌다. 해당 내용은 n번째 달의 토끼 쌍의 수는 첫 달에는 새로 태어난 토끼 한 쌍만이 존재한다. 두 달 이상이 된 토끼는 번식이 가능하다. 번식 가능한 토끼 한 쌍은 매달 새끼 한 쌍을 낳는다. 토끼는 죽지 않는다 이 문제를 통해서 나온 것이 바로 피보나치 수열이다. 첫 번째 달, 두 번째 달 까지는 1쌍이 존재할 것이다. 세 번째 달이 되면서 토끼가 번식이 가능해지면서 2쌍이 되고 3번..

Tistory

백준 1780 : 종이의 개수 (파이썬)

문제: https://www.acmicpc.net/problem/1780 1780번: 종이의 개수 N×N크기의 행렬로 표현되는 종이가 있다. 종이의 각 칸에는 -1, 0, 1 중 하나가 저장되어 있다. 우리는 이 행렬을 다음과 같은 규칙에 따라 적절한 크기로 자르려고 한다. 만약 종이가 모두 같은 수 www.acmicpc.net 코드 1 #https://teching.tistory.com/ import sys cnt = { -1: 0, 0: 0, 1: 0 } def check(paper, n): if n == 1: return True plag = paper[0][0] for i in range(n): for j in range(n): if plag != paper[i][j]: return False r..

Tistory

백준 1629: 곱셈 (파이썬)

문제: https://www.acmicpc.net/problem/1629 1629번: 곱셈 첫째 줄에 A, B, C가 빈 칸을 사이에 두고 순서대로 주어진다. A, B, C는 모두 2,147,483,647 이하의 자연수이다. www.acmicpc.net 코드 # https://teching.tistory.com/ a, b, c = map(int, input().split()) def pastPow(a, b, c): if b == 0: return 1 elif b == 1: return a % c else: DivCon = pastPow(a, b // 2, c) if b % 2 == 0: return (DivCon * DivCon) % c else: return (DivCon * DivCon * pastP..

Tistory

프로그래머스 lv2: 괄호 변환(파이썬)

문제: https://programmers.co.kr/learn/courses/30/lessons/60058 코딩테스트 연습 - 괄호 변환 카카오에 신입 개발자로 입사한 "콘"은 선배 개발자로부터 개발역량 강화를 위해 다른 개발자가 작성한 소스 코드를 분석하여 문제점을 발견하고 수정하라는 업무 과제를 받았습니다. 소스를 programmers.co.kr 코드 #https://teching.tistory.com/ def isRight(p): score = 0 res = True for i in p: if i == '(': score -= 1 else: score += 1 if score > 0: res = False if score == 0: return res else: return False def sp..

Tistory

백준 11401: 이항 계수 3 (파이썬)

문제: https://www.acmicpc.net/problem/11401 11401번: 이항 계수 3 자연수 \(N\)과 정수 \(K\)가 주어졌을 때 이항 계수 \(\binom{N}{K}\)를 1,000,000,007로 나눈 나머지를 구하는 프로그램을 작성하시오. www.acmicpc.net 코드 #https://teching.tistory.com/ n, k = map(int, input().split()) mode = 1_000_000_007 def pastPow(a, b, c): if b == 0: return 1 elif b == 1: return a % c else: DivCon = pastPow(a, b // 2, c) if b % 2 == 0: return (DivCon * DivCon) ..

Tistory

프로그래머스 lv3: 디스크 컨트롤러 (파이썬)

문제: https://programmers.co.kr/learn/courses/30/lessons/42627 코딩테스트 연습 - 디스크 컨트롤러 하드디스크는 한 번에 하나의 작업만 수행할 수 있습니다. 디스크 컨트롤러를 구현하는 방법은 여러 가지가 있습니다. 가장 일반적인 방법은 요청이 들어온 순서대로 처리하는 것입니다. 예를 programmers.co.kr 코드 # https://teching.tistory.com/ import heapq from collections import deque def solution(jobs): n = len(jobs) jobs = deque(sorted([[jobs[i][1],jobs[i][0]] for i in range(n)], key= lambda x: (x[1]..

Tistory

프로그래머스 lv3: 네트워크 (파이썬)

문제: https://programmers.co.kr/learn/courses/30/lessons/43162 코딩테스트 연습 - 네트워크 네트워크란 컴퓨터 상호 간에 정보를 교환할 수 있도록 연결된 형태를 의미합니다. 예를 들어, 컴퓨터 A와 컴퓨터 B가 직접적으로 연결되어있고, 컴퓨터 B와 컴퓨터 C가 직접적으로 연결되어 있 programmers.co.kr 코드 #https://teching.tistory.com/ def dfs(node, n, edge, visited): visited[node] = True for i in range(n): if edge[node][i]: if not visited[i]: dfs(i, n, edge, visited) def solution(n, computers): ..

Tistory

백준 2630: 색종이 만들기 (파이썬)

문제: https://www.acmicpc.net/problem/2630 2630번: 색종이 만들기 첫째 줄에는 전체 종이의 한 변의 길이 N이 주어져 있다. N은 2, 4, 8, 16, 32, 64, 128 중 하나이다. 색종이의 각 가로줄의 정사각형칸들의 색이 윗줄부터 차례로 둘째 줄부터 마지막 줄까지 주어진다. www.acmicpc.net 코드 #https://teching.tistory.com/ import sys cntWhite = 0 cntBlue = 0 def makeConftti(paper): global cntBlue, cntWhite tmp = 0 for line in paper: tmp += sum(line) n = len(paper) if tmp == n*n: cntBlue += 1..

Tistory

백준 1992: 쿼드트리 (파이썬)

문제: https://www.acmicpc.net/problem/1992 1992번: 쿼드트리 첫째 줄에는 영상의 크기를 나타내는 숫자 N 이 주어진다. N 은 언제나 2의 제곱수로 주어지며, 1 ≤ N ≤ 64의 범위를 가진다. 두 번째 줄부터는 길이 N의 문자열이 N개 들어온다. 각 문자열은 0 또 www.acmicpc.net 코드 #https://teching.tistory.com/ import sys res = "" def makeConftti(list): global res tmp = 0 for line in list: tmp += sum(line) n = len(list) if tmp == n*n: res += "1" return elif tmp == 0: res += "0" return #가..

Tistory

프로그래머스 lv3 : 입국심사(파이썬)

https://programmers.co.kr/learn/courses/30/lessons/43238 코딩테스트 연습 - 입국심사 n명이 입국심사를 위해 줄을 서서 기다리고 있습니다. 각 입국심사대에 있는 심사관마다 심사하는데 걸리는 시간은 다릅니다. 처음에 모든 심사대는 비어있습니다. 한 심사대에서는 동시에 한 programmers.co.kr 문제 설명 n명이 입국심사를 위해 줄을 서서 기다리고 있습니다. 각 입국심사대에 있는 심사관마다 심사하는데 걸리는 시간은 다릅니다. 처음에 모든 심사대는 비어있습니다. 한 심사대에서는 동시에 한 명만 심사를 할 수 있습니다. 가장 앞에 서 있는 사람은 비어 있는 심사대로 가서 심사를 받을 수 있습니다. 하지만 더 빨리 끝나는 심사대가 있으면 기다렸다가 그곳으로 가..

Tistory

백준 5430: AC (파이썬)

문제 : https://www.acmicpc.net/problem/5430 5430번: AC 각 테스트 케이스에 대해서, 입력으로 주어진 정수 배열에 함수를 수행한 결과를 출력한다. 만약, 에러가 발생한 경우에는 error를 출력한다. www.acmicpc.net 코드 #https://teching.tistory.com/ from collections import deque import sys t = int(sys.stdin.readline().rstrip()) for _ in range(t): ops = sys.stdin.readline().rstrip() sys.stdin.readline() # 큐 변환 nums = sys.stdin.readline()[1:-2] reverse = -1 if nums..

Tistory

백준 1931 : 회의실 배정 (파이썬)

회의실 배정 시간 제한 메모리 제한 제출 정답 맞힌 사람 정답 비율 2 초 128 MB 111245 34066 24345 29.312% 문제 한 개의 회의실이 있는데 이를 사용하고자 하는 N개의 회의에 대하여 회의실 사용표를 만들려고 한다. 각 회의 I에 대해 시작시간과 끝나는 시간이 주어져 있고, 각 회의가 겹치지 않게 하면서 회의실을 사용할 수 있는 회의의 최대 개수를 찾아보자. 단, 회의는 한번 시작하면 중간에 중단될 수 없으며 한 회의가 끝나는 것과 동시에 다음 회의가 시작될 수 있다. 회의의 시작시간과 끝나는 시간이 같을 수도 있다. 이 경우에는 시작하자마자 끝나는 것으로 생각하면 된다. 입력 첫째 줄에 회의의 수 N(1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N+1 줄까지 각 회의..

Tistory

백준 1676 : 팩토리얼 0의 개수 (파이썬)

팩토리얼 0의 개수 시간 제한 메모리 제한 제출 정답 맞힌 사람 정답 비율 2 초 128 MB 36812 17491 14523 47.923% 문제 N!에서 뒤에서부터 처음 0이 아닌 숫자가 나올 때까지 0의 개수를 구하는 프로그램을 작성하시오. 입력 첫째 줄에 N이 주어진다. (0 ≤ N ≤ 500) 출력 첫째 줄에 구한 0의 개수를 출력한다. 예제 입력 1 10 예제 출력 1 2 예제 입력 2 3 예제 출력 2 0 코드 #https://teching.tistory.com/ n = int(input()) fac = 1 for i in range(1,n+1): fac *= i fac = str(fac) answer = 0 for i in range(len(fac)-1,-1,-1): if fac[i] != ..

Tistory

백준 2004 : 조합 0의 개수(파이썬)

코드 #https://teching.tistory.com/ import sys input = sys.stdin.readline n, k = map(int, input().split()) def countTF(num, d): cnt = 0 div = d while div

Tistory

백준 2565 : 전깃줄 (파이썬)

전깃줄 시간 제한 메모리 제한 제출 정답 맞힌 사람 정답 비율 1 초 128 MB 21244 9978 7947 46.761% 문제 두 전봇대 A와 B 사이에 하나 둘씩 전깃줄을 추가하다 보니 전깃줄이 서로 교차하는 경우가 발생하였다. 합선의 위험이 있어 이들 중 몇 개의 전깃줄을 없애 전깃줄이 교차하지 않도록 만들려고 한다. 예를 들어, < 그림 1 >과 같이 전깃줄이 연결되어 있는 경우 A의 1번 위치와 B의 8번 위치를 잇는 전깃줄, A의 3번 위치와 B의 9번 위치를 잇는 전깃줄, A의 4번 위치와 B의 1번 위치를 잇는 전깃줄을 없애면 남아있는 모든 전깃줄이 서로 교차하지 않게 된다. 전깃줄이 전봇대에 연결되는 위치는 전봇대 위에서부터 차례대로 번호가 매겨진다. 전깃줄의 개수와 전깃줄들이 두 전봇..

Tistory

백준 1912: 연속합 (파이썬)

연속합 시간 제한 메모리 제한 제출 정답 맞힌 사람 정답 비율 1 초 (추가 시간 없음) 128 MB 96217 32707 22675 32.757% 문제 n개의 정수로 이루어진 임의의 수열이 주어진다. 우리는 이 중 연속된 몇 개의 수를 선택해서 구할 수 있는 합 중 가장 큰 합을 구하려고 한다. 단, 수는 한 개 이상 선택해야 한다. 예를 들어서 10, -4, 3, 1, 5, 6, -35, 12, 21, -1 이라는 수열이 주어졌다고 하자. 여기서 정답은 12+21인 33이 정답이 된다. 입력 첫째 줄에 정수 n(1 ≤ n ≤ 100,000)이 주어지고 둘째 줄에는 n개의 정수로 이루어진 수열이 주어진다. 수는 -1,000보다 크거나 같고, 1,000보다 작거나 같은 정수이다. 출력 첫째 줄에 답을 출..

Tistory

스프링에 대해서

2000년 초반 자바당 정파 기술 EJB(Enterprise Java Beans)를 표준기술로 사용함. 금융권에서도 잘 사용하고 기술영업도 이것으로 함. 이론적인 것은 매우 좋음(분산기술, 원하는 계층만 더 추가하기도 편함) 하지만 개발비용이 너무 비싸고 구현하기에 너무 어렵고 속도도 느렸다. 또한 EJB인터페이스에 의존하여 코드를 구현해야 했음. 그래서 POJO(Plan Old Java Object) 오래된 순수한 자바로 돌아가자는 의견도 있었음. 이렇게 어렵고 힘들게 개발하다가 로드 존슨이 2002년 Expert One-on-One J2EE Design and Development 출간 EJB 컨테이너를 대체할 수 있고 단순함 후에 Spring으로 발전 또한 개빈 킹이 Hibernate(하이버네이트)..

Tistory

백준 17298 : 오큰수 (파이썬)

오큰수 성공 시간 제한 메모리 제한 제출 정답 맞힌 사람 정답 비율 1 초 512 MB 32990 11047 8074 33.192% 문제 크기가 N인 수열 A = A1, A2, ..., AN이 있다. 수열의 각 원소 Ai에 대해서 오큰수 NGE(i)를 구하려고 한다. Ai의 오큰수는 오른쪽에 있으면서 Ai보다 큰 수 중에서 가장 왼쪽에 있는 수를 의미한다. 그러한 수가 없는 경우에 오큰수는 -1이다. 예를 들어, A = [3, 5, 2, 7]인 경우 NGE(1) = 5, NGE(2) = 7, NGE(3) = 7, NGE(4) = -1이다. A = [9, 5, 4, 8]인 경우에는 NGE(1) = -1, NGE(2) = 8, NGE(3) = 8, NGE(4) = -1이다. 입력 첫째 줄에 수열 A의 크기 ..

Tistory

백준 10844 : 쉬운 계단 수 (파이썬)

쉬운 계단 수 시간 제한 메모리 제한 제출 정답 맞힌 사람 정답 비율 1 초 256 MB 96338 29894 21422 29.090% 문제 45656이란 수를 보자. 이 수는 인접한 모든 자리의 차이가 1이다. 이런 수를 계단 수라고 한다. N이 주어질 때, 길이가 N인 계단 수가 총 몇 개 있는지 구해보자. 0으로 시작하는 수는 계단수가 아니다. 입력 첫째 줄에 N이 주어진다. N은 1보다 크거나 같고, 100보다 작거나 같은 자연수이다. 출력 첫째 줄에 정답을 1,000,000,000으로 나눈 나머지를 출력한다. 예제 입력 1 1 예제 출력 1 9 예제 입력 2 2 예제 출력 2 17 코드 # https://teching.tistory.com/ n = int(input()) cache = { 1: ..

Tistory

백준 2156 : 포도주 시식 (파이썬)

문제 : https://www.acmicpc.net/problem/2156 2156번: 포도주 시식 효주는 포도주 시식회에 갔다. 그 곳에 갔더니, 테이블 위에 다양한 포도주가 들어있는 포도주 잔이 일렬로 놓여 있었다. 효주는 포도주 시식을 하려고 하는데, 여기에는 다음과 같은 두 가지 규 www.acmicpc.net 포도주 시식 시간 제한 메모리 제한 제출 정답 맞힌 사람 정답 비율 2 초 128 MB 90663 30808 22085 32.790% 문제 효주는 포도주 시식회에 갔다. 그 곳에 갔더니, 테이블 위에 다양한 포도주가 들어있는 포도주 잔이 일렬로 놓여 있었다. 효주는 포도주 시식을 하려고 하는데, 여기에는 다음과 같은 두 가지 규칙이 있다. 포도주 잔을 선택하면 그 잔에 들어있는 포도주는 모..

Tistory

백준 11053 : 가장 긴 증가하는 부분 수열 (파이썬)

문제 : https://www.acmicpc.net/problem/11053 11053번: 가장 긴 증가하는 부분 수열 수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이 www.acmicpc.net 가장 긴 증가하는 부분 수열 시간 제한 메모리 제한 제출 정답 맞힌 사람 정답 비율 1 초 256 MB 94352 36905 24215 37.108% 문제 수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} ..

Tistory

백준 11054 : 가장 긴 바이토닉 부분 수열 (파이썬)

가장 긴 바이토닉 부분 수열 시간 제한 메모리 제한 제출 정답 맞힌 사람 정답 비율 1 초 256 MB 31308 15918 12480 50.850% 문제 수열 S가 어떤 수 Sk를 기준으로 S1 < S2 < ... Sk-1 < Sk > Sk+1 > ... SN-1 > SN을 만족한다면, 그 수열을 바이토닉 수열이라고 한다. 예를 들어, {10, 20, 30, 25, 20}과 {10, 20, 30, 40}, {50, 40, 25, 10} 은 바이토닉 수열이지만, {1, 2, 3, 2, 1, 2, 3, 2, 1}과 {10, 20, 30, 40, 20, 30} 은 바이토닉 수열이 아니다. 수열 A가 주어졌을 때, 그 수열의 부분 수열 중 바이토닉 수열이면서 가장 긴 수열의 길이를 구하는 프로그램을 작성하시오..

Tistory

백준 1463 : 1로 만들기 (파이썬)

1로 만들기 시간 제한 메모리 제한 제출 정답 맞힌 사람 정답 비율 0.15 초 (하단 참고) 128 MB 183373 58888 37410 31.908% 문제 정수 X에 사용할 수 있는 연산은 다음과 같이 세 가지 이다. X가 3으로 나누어 떨어지면, 3으로 나눈다. X가 2로 나누어 떨어지면, 2로 나눈다. 1을 뺀다. 정수 N이 주어졌을 때, 위와 같은 연산 세 개를 적절히 사용해서 1을 만들려고 한다. 연산을 사용하는 횟수의 최솟값을 출력하시오. 입력 첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다. 출력 첫째 줄에 연산을 하는 횟수의 최솟값을 출력한다. 예제 입력 1 2 예제 출력 1 1 예제 입력 2 10 예제 출력 2 3 코드 # https://teching.tis..

Tistory

프로그래머스 lv1 : 신고 결과 받기 (파이썬)

문제 : https://programmers.co.kr/learn/courses/30/lessons/92334 코딩테스트 연습 - 신고 결과 받기 문제 설명 신입사원 무지는 게시판 불량 이용자를 신고하고 처리 결과를 메일로 발송하는 시스템을 개발하려 합니다. 무지가 개발하려는 시스템은 다음과 같습니다. 각 유저는 한 번에 한 명의 programmers.co.kr 문제 설명 신입사원 무지는 게시판 불량 이용자를 신고하고 처리 결과를 메일로 발송하는 시스템을 개발하려 합니다. 무지가 개발하려는 시스템은 다음과 같습니다. 각 유저는 한 번에 한 명의 유저를 신고할 수 있습니다. 신고 횟수에 제한은 없습니다. 서로 다른 유저를 계속해서 신고할 수 있습니다. 한 유저를 여러 번 신고할 수도 있지만, 동일한 유저에..

Tistory

프로그래머스 lv3 : 추석 트래픽 (파이썬)

문제 설명 추석 트래픽 이번 추석에도 시스템 장애가 없는 명절을 보내고 싶은 어피치는 서버를 증설해야 할지 고민이다. 장애 대비용 서버 증설 여부를 결정하기 위해 작년 추석 기간인 9월 15일 로그 데이터를 분석한 후 초당 최대 처리량을 계산해보기로 했다. 초당 최대 처리량은 요청의 응답 완료 여부에 관계없이 임의 시간부터 1초(=1,000밀리초)간 처리하는 요청의 최대 개수를 의미한다. 입력 형식 solution 함수에 전달되는 lines 배열은 N(1 ≦ N ≦ 2,000)개의 로그 문자열로 되어 있으며, 각 로그 문자열마다 요청에 대한 응답완료시간 S와 처리시간 T가 공백으로 구분되어 있다. 응답완료시간 S는 작년 추석인 2016년 9월 15일만 포함하여 고정 길이 2016-09-15 hh:mm:s..

Tistory

백준 1149 : RGB거리 (파이썬)

RGB거리 시간 제한 메모리 제한 제출 정답 맞힌 사람 정답 비율 0.5 초 (추가 시간 없음) 128 MB 72867 36485 27248 49.755% 문제 RGB거리에는 집이 N개 있다. 거리는 선분으로 나타낼 수 있고, 1번 집부터 N번 집이 순서대로 있다. 집은 빨강, 초록, 파랑 중 하나의 색으로 칠해야 한다. 각각의 집을 빨강, 초록, 파랑으로 칠하는 비용이 주어졌을 때, 아래 규칙을 만족하면서 모든 집을 칠하는 비용의 최솟값을 구해보자. 1번 집의 색은 2번 집의 색과 같지 않아야 한다. N번 집의 색은 N-1번 집의 색과 같지 않아야 한다. i(2 ≤ i ≤ N-1)번 집의 색은 i-1번, i+1번 집의 색과 같지 않아야 한다. 입력 첫째 줄에 집의 수 N(2 ≤ N ≤ 1,000)이 주..

Tistory

백준 1932 : 정수 삼각형 (파이썬)

문제 : https://www.acmicpc.net/problem/1932 1932번: 정수 삼각형 첫째 줄에 삼각형의 크기 n(1 ≤ n ≤ 500)이 주어지고, 둘째 줄부터 n+1번째 줄까지 정수 삼각형이 주어진다. www.acmicpc.net 정수 삼각형 한국어 시간 제한메모리 제한제출정답맞힌 사람정답 비율 2 초 128 MB 57640 32111 24045 58.623% 문제 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 위 그림은 크기가 5인 정수 삼각형의 한 모습이다. 맨 위층 7부터 시작해서 아래에 있는 수 중 하나를 선택하여 아래층으로 내려올 때, 이제까지 선택된 수의 합이 최대가 되는 경로를 구하는 프로그램을 작성하라. 아래층에 있는 수는 현재 층에서 선택된 수의 대각선 왼쪽 또는..

Tistory

백준 2579 : 계단 오르기 (파이썬)

계단 오르기 시간 제한 메모리 제한 제출 정답 맞힌 사람 정답 비율 1 초 128 MB 106925 36619 26518 34.447% 문제 계단 오르기 게임은 계단 아래 시작점부터 계단 꼭대기에 위치한 도착점까지 가는 게임이다. 과 같이 각각의 계단에는 일정한 점수가 쓰여 있는데 계단을 밟으면 그 계단에 쓰여 있는 점수를 얻게 된다. 예를 들어 와 같이 시작점에서부터 첫 번째, 두 번째, 네 번째, 여섯 번째 계단을 밟아 도착점에 도달하면 총 점수는 10 + 20 + 25 + 20 = 75점이 된다. 계단 오르는 데는 다음과 같은 규칙이 있다. 계단은 한 번에 한 계단씩 또는 두 계단씩 오를 수 있다. 즉, 한 계단을 밟으면서 이어서 다음 계단이나, 다음 다음 계단으로 오를 수 있다. 연속된 세 개의 ..

Tistory

H2 데이터베이스 설치

가볍게 사용하기 좋은 h2 dbms를 설치하는 방법에 대해서 글을 작성해볼까 합니다. h2는 자바로 만들어진 오픈소스 DBMS이다. http://www.h2database.com/html/main.html에 접속하여 다운로드할 수 있다. H2 Database Engine H2 Database Engine Welcome to H2, the Java SQL database. The main features of H2 are: Very fast, open source, JDBC API Embedded and server modes; in-memory databases Browser based Console application Small footprint: around 2.5 MB jar file size S..

Tistory

백준 1904 : 01타일 (파이썬)

01타일 시간 제한 메모리 제한 제출 정답 맞힌 살마 정답 비율 0.75 초 (추가 시간 없음) 256 MB 55826 18282 14608 32.615% 문제 지원이에게 2진 수열을 가르쳐 주기 위해, 지원이 아버지는 그에게 타일들을 선물해주셨다. 그리고 이 각각의 타일들은 0 또는 1이 쓰여 있는 낱장의 타일들이다. 어느 날 짓궂은 동주가 지원이의 공부를 방해하기 위해 0이 쓰인 낱장의 타일들을 붙여서 한 쌍으로 이루어진 00 타일들을 만들었다. 결국 현재 1 하나만으로 이루어진 타일 또는 0 타일을 두 개 붙인 한 쌍의 00 타일들만이 남게 되었다. 그러므로 지원이는 타일로 더 이상 크기가 N인 모든 2진 수열을 만들 수 없게 되었다. 예를 들어, N=1일 때 1만 만들 수 있고, N=2일 때는 0..

Tistory

프로그래머스 lv2 : 문자열 압축 (파이썬)

https://programmers.co.kr/learn/courses/30/lessons/60057# 코딩테스트 연습 - 문자열 압축 데이터 처리 전문가가 되고 싶은 "어피치"는 문자열을 압축하는 방법에 대해 공부를 하고 있습니다. 최근에 대량의 데이터 처리를 위한 간단한 비손실 압축 방법에 대해 공부를 하고 있는데, 문 programmers.co.kr 문자열 압축 문제 설명 데이터 처리 전문가가 되고 싶은 "어피치"는 문자열을 압축하는 방법에 대해 공부를 하고 있습니다. 최근에 대량의 데이터 처리를 위한 간단한 비손실 압축 방법에 대해 공부를 하고 있는데, 문자열에서 같은 값이 연속해서 나타나는 것을 그 문자의 개수와 반복되는 값으로 표현하여 더 짧은 문자열로 줄여서 표현하는 알고리즘을 공부하고 있습..

Tistory

백준 9461 : 파도반 수열 (파이썬)

파도반 수열 시간 제한 메모리 제한 제출 정답 맞힌 사람 정답 비율 1 초 128 MB 58944 25357 20753 41.563% 문제 오른쪽 그림과 같이 삼각형이 나선 모양으로 놓여져 있다. 첫 삼각형은 정삼각형으로 변의 길이는 1이다. 그 다음에는 다음과 같은 과정으로 정삼각형을 계속 추가한다. 나선에서 가장 긴 변의 길이를 k라 했을 때, 그 변에 길이가 k인 정삼각형을 추가한다. 파도반 수열 P(N)은 나선에 있는 정삼각형의 변의 길이이다. P(1)부터 P(10)까지 첫 10개 숫자는 1, 1, 1, 2, 2, 3, 4, 5, 7, 9이다. N이 주어졌을 때, P(N)을 구하는 프로그램을 작성하시오. 입력 첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있..

Tistory

백준 14889 : 스타트와 링크 (파이썬)

스타트와 링크 시간 제한 메모리 제한 제출 정답 맞힌 살마 정답 비율 2 초 512 MB 52962 26730 15618 47.160% 문제 오늘은 스타트링크에 다니는 사람들이 모여서 축구를 해보려고 한다. 축구는 평일 오후에 하고 의무 참석도 아니다. 축구를 하기 위해 모인 사람은 총 N명이고 신기하게도 N은 짝수이다. 이제 N/2명으로 이루어진 스타트 팀과 링크 팀으로 사람들을 나눠야 한다. BOJ를 운영하는 회사 답게 사람에게 번호를 1부터 N까지로 배정했고, 아래와 같은 능력치를 조사했다. 능력치 Sij는 i번 사람과 j번 사람이 같은 팀에 속했을 때, 팀에 더해지는 능력치이다. 팀의 능력치는 팀에 속한 모든 쌍의 능력치 Sij의 합이다. Sij는 Sji와 다를 수도 있으며, i번 사람과 j번 사..

Tistory

백준 9184 : 신나는 함수 실행 (파이썬)

신나는 함수 실행 시간 제한 메모리 제한 제출 정답 맞힌 사람 정답 비율 1 초 128 MB 20643 8926 6757 42.008% 문제 재귀 호출만 생각하면 신이 난다! 아닌가요? 다음과 같은 재귀함수 w(a, b, c)가 있다. if a 20, then w(a, b, c) returns: w(20, 20, 20) if a < b and b < c, then w(a, b, c) returns: w(a, b, c-1) + w(a, b-1, c-1) - w(a, b-1, c) otherwise it returns: w(a-1, b, c) + w(a-1, b-1, c) + w(a-1, b, c-1) - w(a-1, b-1, c-1) 위의 함수를 구현하는 것은 매우 쉽다. 하지만, 그대로 구현하면 값을 구..

Tistory

동적 계획법 (파이썬)

기본적인 접근 방식은 분할 정복 알고리즘과 비슷하다. 문제를 부분 문제로 나누어 각 부분 문제의 답을 계산하고, 이 계산한 결괏값을 이용해 원래 문제의 답을 산출한다. 그러나 동적 계획법은 문제를 나눌 때 부분 문제를 최대한 많이 이용하도록 나눈 다음, 주어진 부분 문제의 정답을 한번만 계산하고 저장해둔 뒤 다시 한 번 해당 문제를 풀 때에는 저장해둔 답을 바로 산출하여 속도를 향상한 것이다. 동적 계획벅을 구현하는 방법은 2가지가 있다. 하향식으로 문제를 풀어나가는 메모이제이션(Memoization) (주의 :메모라이제이션(Memorization) 아님!!) 상향식으로 문제를 풀어나가는 타뷸레이션(Tabulation) 즉, 계산했던 걸 저장한다라는 것이 핵심인 것이다. (캐싱이라고도 불림) 말로 하면 ..

Tistory

자바 스프링입문5 - 회원 관리 예제 만들기 1

비즈니스 요구사항 정리 회원 도메인과 리포지토리 만들기 회원 리포지토리 테스트 케이스 작성 회원 서비스 개발 회원 서비스 테스트 비즈니스 요구 사항 정리 데이터 : 회원ID, dlfma 기능 : 회원 등록, 조회 아직 데이터 저장소가 선정되지 않음(가상의 시나리오) 일반적인 웹 애플리케이션 계층 구조 회원 도메인과 리포지토리 만들기 hello.hellospring 패키지 아래 두 개의 패키지 domain, repository 생성 domain Member 클래스 생성 package hello.hellospring.domain; public class Member { private Long id; private String name; public Long getId() { return id; } publi..

Tistory

백준 9663 : N-Queen (파이썬)

N-Queen 시간 제한 메모리 제한 제출 정답 맞힌 사람 정답 비율 10 초 128 MB 56281 28251 18511 49.675% 문제 N-Queen 문제는 크기가 N × N인 체스판 위에 퀸 N개를 서로 공격할 수 없게 놓는 문제이다. N이 주어졌을 때, 퀸을 놓는 방법의 수를 구하는 프로그램을 작성하시오. 입력 첫째 줄에 N이 주어진다. (1 ≤ N < 15) 출력 첫째 줄에 퀸 N개를 서로 공격할 수 없게 놓는 경우의 수를 출력한다. 예제 입력 1 8 예제 출력 1 92 코드 # https://teching.tistory.com/ n = int(input()) cnt = 0 def nQueen(placed): global n, cnt row = len(placed) if row == n: c..

Tistory

백준 2580 : 스도쿠 (파이썬)

스도쿠 시간 제한 메모리 제한 제출 정답 맞힌 사람 정답 비율 1 초 256 MB 57923 16994 10663 27.427% 문제 스도쿠는 18세기 스위스 수학자가 만든 '라틴 사각형'이랑 퍼즐에서 유래한 것으로 현재 많은 인기를 누리고 있다. 이 게임은 아래 그림과 같이 가로, 세로 각각 9개씩 총 81개의 작은 칸으로 이루어진 정사각형 판 위에서 이뤄지는데, 게임 시작 전 일부 칸에는 1부터 9까지의 숫자 중 하나가 쓰여 있다. 나머지 빈 칸을 채우는 방식은 다음과 같다. 각각의 가로줄과 세로줄에는 1부터 9까지의 숫자가 한 번씩만 나타나야 한다. 굵은 선으로 구분되어 있는 3x3 정사각형 안에도 1부터 9까지의 숫자가 한 번씩만 나타나야 한다. 위의 예의 경우, 첫째 줄에는 1을 제외한 나머지 ..

Tistory

백준 14888 : 연산자 끼워넣기 (파이썬)

연산자 끼워넣기 시간 제한 메모리 제한 제출 정답 맞힌 사람 정답 비율 2 초 512 MB 54744 28745 18139 49.371% 문제 N개의 수로 이루어진 수열 A1, A2, ..., AN이 주어진다. 또, 수와 수 사이에 끼워넣을 수 있는 N-1개의 연산자가 주어진다. 연산자는 덧셈(+), 뺄셈(-), 곱셈(×), 나눗셈(÷)으로만 이루어져 있다. 우리는 수와 수 사이에 연산자를 하나씩 넣어서, 수식을 하나 만들 수 있다. 이때, 주어진 수의 순서를 바꾸면 안 된다. 예를 들어, 6개의 수로 이루어진 수열이 1, 2, 3, 4, 5, 6이고, 주어진 연산자가 덧셈(+) 2개, 뺄셈(-) 1개, 곱셈(×) 1개, 나눗셈(÷) 1개인 경우에는 총 60가지의 식을 만들 수 있다. 예를 들어, 아래와..

Tistory

정렬 알고리즘 3 : 계수 정렬(Counting sort)

세 번째로 알아볼 정렬 알고리즘은 바로 계수 정렬! 계수 정렬은 수의 범위가 적을 때 사용하면 좋은 정렬 알고리즘으로 배열의 가장 큰 값에 따라 시간 복잡도가 달라진다. 배열의 가장 큰 값이 k라고 한다면 O(n+k)의 시간 복잡도를 갖는다. 즉, 입력에 비해서 원소들의 값의 범위가 적다면 계수정렬을 사용하는 것이 효율적인 방법이 될 수 있다! 방법 1. 입력된 배열중 가장 큰 값(k) 찾기 2. k+1 크기의 0으로 초기화된 배열 생성한다. 이는 입력된 배열의 원소가 각각 몇 개가 있는지 셀 배열이다. 3. 배열의 원소를 하나씩 검사하여 2번에서 생성한 배열의 인덱스에 해당하는 값을 1씩 올려준다. (즉, 각 값이 몇 개가 나왔는지 카운팅 해준다.) 4. 각 인덱스를 값만큼 반복하여 출력한다. 예시 배..

Tistory

백준 2108 : 통계학 (파이썬)

통계학 시간 제한 메모리 제한 제출 정답 맞힌 사람 정답 비율 2 초 256 MB 73606 18796 15066 26.815% 문제 수를 처리하는 것은 통계학에서 상당히 중요한 일이다. 통계학에서 N개의 수를 대표하는 기본 통계 값에는 다음과 같은 것들이 있다. 단, N은 홀수라고 가정하자. 산술평균 : N개의 수들의 합을 N으로 나눈 값 중앙값 : N개의 수들을 증가하는 순서로 나열했을 경우 그 중앙에 위치하는 값 최빈값 : N개의 수들 중 가장 많이 나타나는 값 범위 : N개의 수들 중 최댓값과 최솟값의 차이 N개의 수가 주어졌을 때, 네 가지 기본 통계값을 구하는 프로그램을 작성하시오. 입력 첫째 줄에 수의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 단, N은 홀수이다. 그다음 N개의 줄..

Tistory

백준 15649 : N과 M (1) (파이썬)

N과 M (1) 시간 제한 메모리 제한 제출 정답 맞힌 사람 정답 비율 1 초 512 MB 50418 30965 20654 60.574% 문제 자연수 N과 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오. 1부터 N까지 자연수 중에서 중복 없이 M개를 고른 수열 입력 첫째 줄에 자연수 N과 M이 주어진다. (1 ≤ M ≤ N ≤ 8) 출력 한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안 되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열은 사전 순으로 증가하는 순서로 출력해야 한다. 예제 입력 1 3 1 예제 출력 1 1 2 3 예제 입력 2 4 2 예제 출력 2 1 2 1 3 1 4 2 1 2 3 2 4 ..

Tistory

깊이 우선 탐색(DFS), 너비 우선 탐색(BFS)

깊이 우선 탐색 (DFS : Depth First Search) 대표적으로 백트래킹에 사용한다. 일반적으로 재귀 호출을 사용하여 구현하지만, 단순한 스택 배열로 구현하기도 한다. 구조상 스택 오버플로우를 유의해야 한다. 자동 미로 생성에 많이 사용 되는 알고리즘! 장점 현 경로상의 노드만 기억하면 돼서 저장공간의 수요가 비교적 적다. 목표 노드가 깊은 단계에 있을 경우 해를 빨리 구할 수 있다. 단점 해가 없는 경로에 깊이 빠질 수 있다. ( 임의 깊이까지만 탐색하도록 만들기! ) 얻어진 해가 최단 경로가 아닐 수도 있다. 왜냐? DFS는 일단 해를 찾으면 탐색이 끝나기 때문이다. 동작 방식 트리나 그래프에서 한 루트로 탐색하다가 특정 상황에서 최대한 깊숙이 들어가서 확인한 뒤 다시 돌아가 다른 루트로 ..

Tistory

백준 10989 : 수 정렬하기3(카운팅정렬)

수 정렬하기 3 시간 제한 메모리 제한 제출 정답 맞힌 사람 정답 비율 5 초 (하단 참고) 8 MB (하단 참고) 143911 32743 24277 23.335% 문제 N개의 수가 주어졌을 때, 이를 오름차순으로 정렬하는 프로그램을 작성하시오. 입력 첫째 줄에 수의 개수 N(1 ≤ N ≤ 10,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 수가 주어진다. 이 수는 10,000보다 작거나 같은 자연수이다. 출력 첫째 줄부터 N개의 줄에 오름차순으로 정렬한 결과를 한 줄에 하나씩 출력한다. 예제 입력 1 10 5 2 3 1 4 2 3 5 1 7 예제 출력 1 1 1 2 2 3 3 4 5 5 7 코드 # https://teching.tistory.com/ import sys # 계수정렬 counti..

Tistory

정렬 알고리즘 1 : 버블 정렬

정렬 알고리즘을 정리하는 시간을 갖고자 한다. 첫 번째로 정리할 정렬 알고리즘은 바로 버블 정렬이다. 가장 기초적인 알고리즘으로 원소의 이동이 거품이 수면으로 떠오르는 모습이랑 비슷하여 지어진 이름이다. 버블 정렬을 실행하면 이러한 모습으로 정렬이 되게 된다. 실질적으론 사용하지 않는 알고리즘이다. 왜 사용하지 않는지는 아래 동작 예시를 보면 알게 된다! 방법 n개의 배열이 들어왔을 때 1번째와 2번째 원소를 비교하고, 2번째와 3번째,... , n-1번째와 n번째까지 정렬한다. 이를 n번 반복하면 된다. 이미 정렬되어있는 배열이 입력된다면 O(n)의 시간이 걸리겠지만 그게 아니라면 최대 O(n^2)의 시간이 걸린다. 예시 5 4 3 8 9 10 2 이러한 배열을 정렬한다면 첫 번째 사이클 (4 5) 3..

Tistory

정렬 알고리즘 2 : 병합 정렬(합병 정렬, Merge sort)

두 번째로 알아볼 정렬 알고리즘은 바로 병합 정렬이다! 먼저 동작 방식을 간단하게 살펴보자 폰 노이만이 개발한 알고리즘으로 데이터 크기만 한 메모리가 더 필요하다는 점이 단점이다. 장점은 데이터의 상태에 영향을 받지 않는다는 점이 있다. 즉, 항상 O(n log(n))의 시간 복잡도를 갖는다. n-way 합병 정렬이라고 부르지만 나는 흔히 사용하는 2-way 합병 정렬을 알아보도록 하겠다. 리스트의 길이가 1이면 이미 정렬된 것으로 본다. (1개밖에 없으므로) 정렬되지 않은 리스트를 절반으로 잘라 두 개의 부분 리스트로 나눈다. 부분 리스트에 1, 2번 과정을 반복한다.(재귀 이용) 잘게 쪼개진 부분리스트 들을 임시 리스트에 합병해가면서 정렬한다. 임시 배열에 저장된 결과를 원래 배열에 복사한다. 과정을..

1 2