www.acmicpc.net/problem/8393

 

8393번: 합

n이 주어졌을 때, 1부터 n까지 합을 구하는 프로그램을 작성하시오.

www.acmicpc.net

문제

n이 주어졌을 때, 1부터 n까지 합을 구하는 프로그램을 작성하시오.

입력

첫째 줄에 n (1 ≤ n ≤ 10,000)이 주어진다.

출력

1부터 n까지 합을 출력한다.

예제 입력 1

3

예제 출력 1

6

 

 

 

 

 

풀이 .

import java.util.*;
import java.io.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        int n = Integer.parseInt(br.readLine());

        int sum = 0;
        for(int i = 1; i <= n; i++) {
            sum += i;
        }
        bw.write(String.valueOf(sum));

        br.close();
        bw.flush();
        bw.close();
    }
}

'알고리즘 문제 > 백준 온라인 저지' 카테고리의 다른 글

[BOJ] 2438 - 별 찍기 - 1 JAVA  (0) 2021.01.09
[BOJ] 10818 - 최소, 최대 JAVA  (0) 2021.01.09
[BOJ] 1924 - 2007년 JAVA  (0) 2021.01.09
[BOJ] 2739 - 구구단 JAVA  (0) 2021.01.08
[BOJ] 2742 - 기찍 N JAVA  (0) 2021.01.08

www.acmicpc.net/problem/1924

 

1924번: 2007년

첫째 줄에 빈 칸을 사이에 두고 x(1 ≤ x ≤ 12)와 y(1 ≤ y ≤ 31)이 주어진다. 참고로 2007년에는 1, 3, 5, 7, 8, 10, 12월은 31일까지, 4, 6, 9, 11월은 30일까지, 2월은 28일까지 있다.

www.acmicpc.net

문제

오늘은 2007년 1월 1일 월요일이다. 그렇다면 2007년 x월 y일은 무슨 요일일까? 이를 알아내는 프로그램을 작성하시오.

입력

첫째 줄에 빈 칸을 사이에 두고 x(1 ≤ x ≤ 12)와 y(1 ≤ y ≤ 31)이 주어진다. 참고로 2007년에는 1, 3, 5, 7, 8, 10, 12월은 31일까지, 4, 6, 9, 11월은 30일까지, 2월은 28일까지 있다.

출력

첫째 줄에 x월 y일이 무슨 요일인지에 따라 SUN, MON, TUE, WED, THU, FRI, SAT중 하나를 출력한다.

예제 입력 1

1 1

예제 출력 1

MON

예제 입력 2

3 14

예제 출력 2 

WED

예제 입력 3

9 2

예제 출력 3

SUN

예제 입력 4

12 25

예제 출력 4

TUE

 

 

 

 

풀이 .

import java.util.*;
import java.io.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int x = Integer.parseInt(st.nextToken());
        int y = Integer.parseInt(st.nextToken());

        int[] months = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
        String[] days = {"SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"};

        int sum = 0;
        for(int i = 0; i < x - 1; i++) {
            sum += months[i];
        }
        sum += y;
        bw.write(days[sum % days.length]);

        br.close();
        bw.flush();
        bw.close();
    }
}

1월 1일 부터 오늘까지 며칠이나 지났는지 일 수를 계산 (오늘까지 포함하여)

 

총 일 수로 나머지 연산을 하여 요일을 구한다. 

'알고리즘 문제 > 백준 온라인 저지' 카테고리의 다른 글

[BOJ] 10818 - 최소, 최대 JAVA  (0) 2021.01.09
[BOJ] 8393 - 합 JAVA  (0) 2021.01.09
[BOJ] 2739 - 구구단 JAVA  (0) 2021.01.08
[BOJ] 2742 - 기찍 N JAVA  (0) 2021.01.08
[BOJ] 2741 - N 찍기 JAVA  (0) 2021.01.08

 

versioning

 

Working tree : 파일을 수정하는 곳 (버전으로 만들어지기 전 단계) 

-> 일단 어떤 수정이든 실행하면 Working tree에 올라감

 

Staging area : 버전으로 만들 파일의 모음 

-> Working tree에 있는 파일 중 버전관리를 하고픈 것을 (git add를 통해) Staging area로 이동

 

Repository : (git commit을 통해) 만들어진 버전

 

git init "디렉토리 경로" : 해당 경로를 리퍼지토리로 하여 버전관리 하라(initialize repository) -> git repository 생성(=.git)

(git init . : 현재 디렉토리를 리퍼지토리로)

 

git status : 상태 확인 (Working tree 상태)

 

git add 파일명 : 버전 관리를 위해 해당 파일을 Staging area에 올려라

git add 디렉토리명 : 해당 디렉토리 밑의 모든 파일을 add

(git add . 도 가능)

 

git commit : 커밋 실행(현재 Staging area의 상태를 가지고 버전 생성) (에디터 뜨면 거기서 동작 수행)

git commit -m "커밋 메세지" : 에디터 생략하고 해당 메세지로 바로 커밋

git commit -a : git add를 -a 옵션으로 주어 한 번에 처리할 수 있다

(단, 최초 한 번은 git add 로 untracked 상태를 벗어나야 -a 로 한 번에 처리 가능해짐. untracked일 때는 -a 안 먹힘)

git commit -amend : 커밋 메세지 수정

 

 

git log : 로그 확인

git log --stat : 버전 별로 좀 더 상세하게 로그 확인

git log -p : 버전 별로 삭제, 추가된 부분에 대한 로그 확인

git log --graph : 브랜치 관계를 그림으로 보여줌

git log --oneline : 각 버전을 한 줄로 간단하게 표시함

 

git diff : 최신 버전과 워킹 트리에 올라간 파일의 차이점을 보여줌

 

git reset --hard : 워킹트리의 내용을 지우고 파일을 최신 버전의 상태로 바꿈

git reset --hard 커밋ID : 워킹트리 내용도 지우고 해당 커밋 버전으로 리셋하겠다.
(해당 커밋이 마스터가 된다. 헤딩도 된다.) 

 

git checkout 커밋ID : 해당 커밋 버전의 브랜치에 헤드를 둔다

git checkout master : 마스터로 되돌아감

 

git revert 커밋ID : 해당 커밋에 대한 내용을 바로 이전 버전으로 되돌림

(R4는 유지한 채로 Revert R4를 만든다. 이때 Revert R4의 내용은 R4의 바로 전 버전인 R3과 완전히 동일)

(한참 전의 버전으로 돌아가고 싶다면 역순을 지켜서 revert를 실행해야 한다는데 무슨 말인지 이해 못함)

(당위성은 이해했는데 정확히 어떻게 revert를 해야하는지 모르겠음)

 

 

git config --global core.autocrlf true

 

 

 

 

 

 

branch, conflict

 

git branch : 생성된 브랜치들 모두 확인

(결과창에서는 head가 있는 브랜치에 *이 달려있게 된다)

git branch 브랜치명 : 해당 브랜치명으로 브랜치 생성

 

 

브랜치 생성 후 git log 하면 브랜치들까지 함께 확인 가능

 

여기서 "git check 브랜치명"을 통해 특정 브랜치에 헤드를 두고 해당 브랜치 수정 가능

 

git merge 브랜치명 : 현재 헤딩된 브랜치에 해당 브랜치의 내용을 병합함

(마스터에 헤딩된 상태에서 merge를 실행하면 병합된 새 브랜치가 마스터가 된다. 마스터가 아닌 브랜치에 헤딩된 상태에서 merge하면 새로운 브랜치가 생겨날 뿐 마스터는 그대로 유지된다.)

 

 

'기타' 카테고리의 다른 글

POSIX CLI  (0) 2021.01.09
Scanner, BufferedReader 입력  (0) 2021.01.08
인텔리제이 주요 단축키 모음  (0) 2020.12.27

pwd : 현재 디렉토리 확인

 

cd : 디렉토리 변경

cd / : 최상위 디렉토리로 이동

cd ~ : 홈 디렉토리(처음 열었을때 나오는 위치)로 이동

cd .. : 현재 디렉토리의 상위 디렉토리로 이동

 

ls : 현재 위치에 있는 파일 목록 확인

ls -l : 파일 자세히 확인 (수정날짜 등 여러 가지 정보들)

ls -a : 숨김파일가지 모두 확인

(-la, -al 로 두 옵션 동시에 사용 가능)

 

명령어 + --help : 해당 명령어에 대한 상세 설명

 

touch 파일명.확장자명 : 빈 파일 생성

touch .파일명.확장자명 : 숨김 모드로 빈 파일 생성

 

mkdir 디렉토리명 : 디렉토리 생성

 

mv 현재파일명 경로/새로운파일명 : 현재 디렉토리에서 "현재파일명" 파일을 다음 경로의 위치에 "새로운파일명"으로 이름을 바꿔서 옮긴다

("mv 파일명1 파일명2" 로 파일명만 바꾸기도 가능)

 

rm 파일명 : 파일 삭제 (디폴트로는 디렉토리는 삭제 불가)

rm -r 디렉토리명 : 디렉토리 삭제 가능 옵션

 

nano : 텍스트 에디터 열기

nano 파일명.txt : 해당 파일 편집 열기

cat 파일명.txt : 해당 파일 내용 출력

 

 

'기타' 카테고리의 다른 글

GIT CLI  (0) 2021.01.09
Scanner, BufferedReader 입력  (0) 2021.01.08
인텔리제이 주요 단축키 모음  (0) 2020.12.27

AppConfig 내에서 같은 클래스의 객체를 필요로 하는 메서드가 여러 개 있을 수 있다.

 

memberService(), orderService() 내부에서 MemberRepository 의 객체를 필요로 하여 memberRepository() 를 호출한다면? 

-> memberRepository() 는 두 번 호출되어 MemberRepository 의 객체는 두 번 생성될 것이다.

하지만 로그를 찍어보면 memberRepository() 는 딱 한 번만 호출되어 싱글톤이 유지되는 것을 알 수 있다.

 

스프링 컨테이너는 어떻게 이를 가능하게 하는가? 

 

->

 

스프링 컨테이너는 @Configuration 이 달린 클래스를 상속받는 클래스를 따로 만들어낸다.

(이 경우는 AppConfig@@@CGLIB)

 

이 자식클래스 내부에서 기존 AppConfig의 메서드들을 오버라이딩 한다.

오버라이딩 된 메서드의 대략적인 "예상" 로직은 아래와 같다.

@Override
@Bean 
public MemberRepository memberRepository() { 
    
    if (memoryMemberRepository가 이미 스프링 컨테이너에 등록되어 있으면?) { 
        return 스프링 컨테이너에서 찾아서 반환; 
    } else { //스프링 컨테이너에 없으면 
        기존 로직을 호출해서 MemoryMemberRepository를 생성하고 스프링 컨테이너에 등록 
        return 반환 
    }
}

이런 식으로 싱글톤을 보장한다.

 

이때 AppConfig를 상속받은 AppConfig@@@CGLIB는 AppConfig의 자식 클래스이기 때문에 AppConfig 타입으로 조회가 가능하다.

 

 

 

만약 @Configuration 없이 @Bean만 사용한다면?

 

@Bean에 의해 스프링 컨테이너에 빈 등록이 되긴 하지만 싱글톤 패턴은 @Configuration에 의해서 보장받는 것이기 때문에 여러 개의 객체가 생성된다.

(심지어 의존관계에 따라 Bean 등록이 되지 않는 것들도 있다.)

 

 

 

 

 

출처 : www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8/dashboard

기존에 스프링 없이 작성한 DI 컨테이너 AppConfig를 사용하면 사용자의 요청이 들어올 때마다 객체들을 하나씩 계속해서 생성한다.

 

사용자의 요청이 매우 많은 웹 애플리케이션에서 이같은 구조는 비효율적이다.

 

이를 해결하기 위해 싱글톤 디자인패턴을 활용한다.

 

싱글톤 패턴 : 클래스의 인스턴스가 딱 1개만 생성되는 것을 보장하는 디자인 패턴이다.

객체 인스턴스를 2개 이상 생성하지 못하도록 막아야 한다

public class SingletonService {

    // 하나만 존재하도록 하기 위해 static으로 선언
    private static final SingletonService instance = new SingletonService();

    // 객체의 외부 생성을 막기 위해 생성자 private 설정
    private SingletonService() {}

    // 이 클래스의 인스턴스가 필요하다면 getInstance()를 통해서만 접근할 수 있다
    public static SingletonService getInstance() {
        return instance;
    }
}

 

그럼 이제 AppConfig에서 객체를 생성하는 모든 함수들에 getInstance() 를 적용시켜 주면 된다.

 

하지만 싱글톤 패턴에도 여러 가지 단점이 존재한다.

 

1. 싱글톤 패턴 구현을 위한 추가 코드들 작성해야함

2. AppConfig 없이 싱글톤만 사용할 경우 클라이언트가 서버 객체의 구체 클래스에 의존하게 되어 OCP, DIP가 위반된다. (SingletonService.getInstance() -> static 메서드를 사용하기 위해 어쩔 수 없이 구체 클래스에 의존하게 된다)

3. 객체 내부 속성을 변경하거나 초기화하기 어렵다.

4. 유연성이 떨어진다

 

등등..

 

 

 

스프링 컨테이너를 사용하면 싱글톤 패턴의 장점은 모두 챙기면서 단점은 모두 피할 수 있게 된다.

 

 

 

(싱글톤 패턴 사용 시 주의점)

모든 사용자들의 요청을 하나의 빈이 수행하기 때문에 아래와 같은 사항들을 주의해야 한다.

1. stateless로 설계해야 한다.

2. 가급적 읽기만 가능해야 한다.

3. 스프링 빈의 필드에 공유 값을 설정하면 장애가 발생할 수 있다.

 

 

 

 

출처 : www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8/dashboard

www.acmicpc.net/problem/2739

 

2739번: 구구단

N을 입력받은 뒤, 구구단 N단을 출력하는 프로그램을 작성하시오. 출력 형식에 맞춰서 출력하면 된다.

www.acmicpc.net

문제

N을 입력받은 뒤, 구구단 N단을 출력하는 프로그램을 작성하시오. 출력 형식에 맞춰서 출력하면 된다.

입력

첫째 줄에 N이 주어진다. N은 1보다 크거나 같고, 9보다 작거나 같다.

출력

출력형식과 같게 N*1부터 N*9까지 출력한다.

예제 입력 1

2

예제 출력 1

2 * 1 = 2

2 * 2 = 4

2 * 3 = 6

2 * 4 = 8

2 * 5 = 10

2 * 6 = 12

2 * 7 = 14

2 * 8 = 16

2 * 9 = 18

 

 

 

풀이 .

import java.util.*;
import java.io.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringBuilder sb = new StringBuilder();

        int N = Integer.parseInt(br.readLine());
        for(int i = 1; i <= 9; i++) {
            sb.append(N + " * " + i + " = " + (N*i)).append("\n");
        }
        bw.write(sb.toString());

        br.close();
        bw.flush();
        bw.close();
    }
}

'알고리즘 문제 > 백준 온라인 저지' 카테고리의 다른 글

[BOJ] 8393 - 합 JAVA  (0) 2021.01.09
[BOJ] 1924 - 2007년 JAVA  (0) 2021.01.09
[BOJ] 2742 - 기찍 N JAVA  (0) 2021.01.08
[BOJ] 2741 - N 찍기 JAVA  (0) 2021.01.08
[BOJ] 11721 - 열 개씩 끊어 출력하기 JAVA  (0) 2021.01.08

www.acmicpc.net/problem/2742

 

2742번: 기찍 N

자연수 N이 주어졌을 때, N부터 1까지 한 줄에 하나씩 출력하는 프로그램을 작성하시오.

www.acmicpc.net

문제

자연수 N이 주어졌을 때, N부터 1까지 한 줄에 하나씩 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 100,000보다 작거나 같은 자연수 N이 주어진다.

출력

첫째 줄부터 N번째 줄 까지 차례대로 출력한다.

예제 입력 1

5

예제 출력 1

5

4

3

2

1

 

 

 

풀이 .

import java.io.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringBuilder sb = new StringBuilder();

        int T = Integer.parseInt(br.readLine());
        for(int i = T; i >= 1; i--) {
            sb.append(i).append("\n");
        }
        bw.write(sb.toString());

        br.close();
        bw.flush();
        bw.close();
    }
}

 

+ Recent posts