문제수빈이는 A와 B로만 이루어진 영어 단어 존재한다는 사실에 놀랐다. 대표적인 예로 AB (Abdominal의 약자), BAA (양의 울음 소리), AA (용암의 종류), ABBA (스웨덴 팝 그룹)이 있다.이런 사실에 놀란 수빈이는 간단한 게임을 만들기로 했다. 두 문자열 S와 T가 주어졌을 때, S를 T로 바꾸는 게임이다. 문자열을 바꿀 때는 다음과 같은 두 가지 연산만 가능하다.문자열의 뒤에 A를 추가한다.문자열의 뒤에 B를 추가하고 문자열을 뒤집는다.주어진 조건을 이용해서 S를 T로 만들 수 있는지 없는지 알아내는 프로그램을 작성하시오. 문제풀이import java.util.*;public class Main { static String target; public static voi..
전체 글
문제오늘은 스타트링크에 다니는 사람들이 모여서 축구를 해보려고 한다. 축구는 평일 오후에 하고 의무 참석도 아니다. 축구를 하기 위해 모인 사람은 총 N명이고 신기하게도 N은 짝수이다. 이제 N/2명으로 이루어진 스타트 팀과 링크 팀으로 사람들을 나눠야 한다.BOJ를 운영하는 회사 답게 사람에게 번호를 1부터 N까지로 배정했고, 아래와 같은 능력치를 조사했다. 능력치 Sij는 i번 사람과 j번 사람이 같은 팀에 속했을 때, 팀에 더해지는 능력치이다. 팀의 능력치는 팀에 속한 모든 쌍의 능력치 Sij의 합이다. Sij는 Sji와 다를 수도 있으며, i번 사람과 j번 사람이 같은 팀에 속했을 때, 팀에 더해지는 능력치는 Sij와 Sji이다.N=4이고, S가 아래와 같은 경우를 살펴보자. 예를 들어, 1, 2..
문제N자리 숫자가 주어졌을 때 숫자 K개를 지워서 얻을 수 있는 가장 큰 수를 구하는 프로그램을 작성하시오. 입력첫째 줄에 N과 K가 주어진다 (1 둘째 줄에 N자리 숫자가 주어진다. 이 수는 0으로 시작하지 않는다. 문제풀이import java.util.*;public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); int N = in.nextInt(); //n자리 int K = in.nextInt(); //K개를 지워서 얻을 수 있는 가장 큰 수 String num = in.next(); Stack stack = new ..
문제세로 R칸, 가로 C칸으로 된 표 모양의 보드가 있다. 보드의 각 칸에는 대문자 알파벳이 하나씩 적혀 있고, 좌측 상단 칸 (1행 1열) 에는 말이 놓여 있다.말은 상하좌우로 인접한 네 칸 중의 한 칸으로 이동할 수 있는데, 새로 이동한 칸에 적혀 있는 알파벳은 지금까지 지나온 모든 칸에 적혀 있는 알파벳과 달라야 한다. 즉, 같은 알파벳이 적힌 칸을 두 번 지날 수 없다.좌측 상단에서 시작해서, 말이 최대한 몇 칸을 지날 수 있는지를 구하는 프로그램을 작성하시오. 말이 지나는 칸은 좌측 상단의 칸도 포함된다. 입력첫째 줄에 R과 C가 빈칸을 사이에 두고 주어진다. (1 문제풀이import java.util.Scanner;public class Main { static int[][] map; ..

1. Github Actions를 선택한 이유Github Actions는 Github에서 제공하는 CI/CD 툴로 Github가 서버를 제공해주기 때문에 따로 서버를 구성하지 않아도 되고, YAML 기반 워크플로우 파일을 작성해 push, pull request 등의 이벤트를 트리거로 하여 다양한 작업을 자동으로 수행할 수 있습니다.또한 다양한 액션들을 제공해 손쉽게 CI를 구성할 수 있어 Github Actions를 선택하게 되었습니다. 2. Github Actions기본 용어Workflow 자동화된 프로세스를 정의하는 YAML 파일 github/workflows 디렉토리에 위치하며 특정 이벤트가 발생할 때 실행됩니다. Event 워크플로우를 트리거하는 활동들을 의미합니다.(push, pull requ..

1. 도커 컴포즈(Docker Compose)란 무엇일까?만약 MySQL, WordPress를 한 서버에 설치해야 한다고 생각해봅시다. 각각의 컨테이너를 만들고 설정하는 것은 매우 귀찮은 일입니다. 이런 단점을 해결하기 위해 도커 컴포즈(Docker Compose)가 사용됩니다.도커 컴포즈는 시스템 구축과 관련된 명령어를 하나의 텍스트 파일에 정의해 명령어 한번에 시스템 전체를 실행하고종료와 폐기까지 한번에 처리할 수 있도록 도와주는 도구입니다. 도커 컴포즈는 시스템 구축에 필요한 설정을 YAML 포맷으로 기재한 정의 파일을 이용해 전체 시스템을 일괄 실행 또는 종료 및 삭제합니다. (정의 파일에는 컨테이너나 볼륨을 어떠한 설정으로 만들지에 대한 항목이 들어가게 됩니다.) 2. 도커 컴포즈와 Docker..

application.yml 설정 추가spring: security: oauth2: client: registration: google: client-id: client-secret: scope: - email naver: client-id: client-secret: scope: - nickname - email client..

1. 스프링 컨테이너 기본전략스프링 컨테이너는 트랜잭션 범위의 영속성 컨텍스트를 사용합니다. 트랜잭션을 시작할 때 영속성 컨텍스트를 생성하고 트랜잭션이 끝날 때 영속성 컨텍스트를 종료하게 됩니다.=> 트랜잭션 범위와 영속성 컨텍스트의 생존 범위가 같다. 스프링을 사용하면 보통 @Transactional 어노테이션을 통해 트랜잭션을 사용하게 되는데 이 때 호출 메소드를 실행하기 직전에 스프링 트랜잭션 AOP가 먼저 발동하게 되고 이 후 메소드가 정상 종료되면 트랜잭션을 커밋하며 종료하는 흐름으로 진행됩니다.트랜잭션을 커밋하면 JPA는 영속성 컨텍스트를 플러시해 변경내용을 DB에 반영한 후 데이터베이스 트랜잭션을 커밋합니다.(예외가 발생하면 트랜잭션을 롤백하고 종료한다. 이 때는 플러시 호출 X) 2. 트랜..

1. OAuth란 무엇인가?OAuth는 Google, Naver 등과 같은 플랫폼에서 제공하는 사용자 데이터나 서비스에 접근하기 위해 사용자가 직접 자신의 데이터에 대한 접근 권한을 제 3자(우리가 개발하는 서비스)에게 위임할 수 있도록 해주는 개방형 표준 프로토콜입니다. 이는 사용자가 외부 소셜 계정으로 간편하게 회원가입 및 로그인을 할 수 있을 뿐만 아니라, 구글 캘린더 등과 같은 다양한 외부 애플리케이션에서 제공하는 기능들을 우리의 서비스에서도 사용할 수 있도록 해줍니다. 2. OAuth의 구성요소Resource Owner : 웹 서비스를 이용하려는 유저, 구글 네이버 등 플랫폼에서 리소스를 소유하고 있는 사용자Authorizaition Server : Resource Owner를 인증하고 우리..

1. 개요객체는 객체 그래프로 연관된 객체를 탐색하게 됩니다. 하지만 객체가 데이터베이스에 저장되어 있으므로 연관된 자유롭게 객체를 탐색하기가 어렵습니다. 이를 해결하기 위해 JPA 구현체는 프록시 기술을 사용합니다. 이 기술을 통해 연관된 객체를 처음부터 데이터베이스에서 조회하는 대신 실제 사용 시점에 조회할 수 있습니다. 또한, 함께 사용하는 객체들은 조인을 통해 함께 조회하는 것이 효과적인데 JPA는 이를 위해 즉시로딩과 지연 로딩이라는 두 가지 로딩 전략을 지원합니다. 그렇다면 지금부터 프록시, 지연로딩, 즉시로딩이 무엇인지 알아보도록 하겠습니다. 2. 프록시란?프록시란 ' 대신하다' 라는 의미를 가지고 있습니다. 그렇다면 JPA의 프록시 기술은 무엇일까요?프록시는 지연 로딩의 경우 사용하게 됩니..