Node.js

  • --node.js란--구글의 V8이라는 JS 엔진으로 만들어져 있고 싱글 스레드가 기반이다. / 논 블로킹
  • Tomcat, JBoss 등과 같은 일반적 웹서버는 멀티 스레드가 기반이다.
  • JS를 활용하여 고성능의 비동기 IO을 지원하는 네트워크 어플리케이션 개발 플랫폼
  • --논 블로킹 IO--호출된 함수에서 I/O 작업 등을 요청 했을 경우 처리여부와 관계없이 바로 다음 작업이 가능하다.
  • 직접 제어할 수 없는 작업이 완료되기 전에 제어권을 넘겨주는 경우
  • --Node.js 구조--바인딩 (socket, http, etc)
    사진 출처 - https://sjh836.tistory.com/149
  • V8 Engine / libuv (이벤트 루프, 논 블로킹 모델은 전부 여기서)
  • 내장 라이브러리
  • --Node.js--protocol://host(domain):port/path?query string 형식
  • query string을 바꿔서 전달하면 페이지를 동적으로 가져올 수 있다.
  • ${} 사용가능

접근 제어자

Public - 모든 패키지에서 접근이 가능하다.

Private - 자신을 포함한 패키지에서만 접근이 가능하다, 정의된 해당 클래스에서만 접근이 가능하도록 접근 범위를 제한한다.

protected - 클래스가 정의되어 있는 해당 패키지 내 그리고 해당 클래스를 상속받은 외부 패키지의 클래스에서 접근이 가능하다.

오버라이딩 vs 오버로딩

오버라이딩 : 상위 클래스의 메소드를 재정의 하는 것

오버로딩 : 같은 클래스 내에서 동일한 메소드 이름을 가지지만 매게변수 타입, 갯수가 다르게 구현할 수 있는 것

MVC1 vs MVC2

MVC1 : Jsp가 controller, view의 가능을 모두 담당한다.

MVC2 : 웹 브라우저 요청을 컨트롤러에서 처리하고 요청 로직을 모델로 보내서 결과를 view가 응답한다.

RDBMS vs NoSQL

RDBMS : 릴레이션을 통해 데이터를 저장하여 데이터 구조를 보장하고 중복을 피한다.

NoSQL : 자유로운 형태의 데이터를 저장한다. 수평적 확장, 분산처리지원

equals() vs ==

equals()는 대상의 내용 자체를 비교

== 은 주소값을 비교

String vs StringBuilder, StringBuffer

String : 불변

StringBuilder : 가변 타입 / Thread-safe X

StringBuffer : 가변 타입 / Thread-safe O / 멀티 스레드 환경

Thread-safe : 어떠한 동작이 여러 스레드로부터 동시에 이루어져도 프로그램 실행에 문제없음

Spring MVC 동작원리

1. 클라이언트의 요청을 DistpatcjerServler에 전달

2. 요청한 url에 맞는 controller 검색하여 HandlerMapping에 전달

3. HandlerMapping에서 해당 controller에 처리 요청

4. controller에서 처리 결과를 HandlerAdapter에서 ModelAndView 객체로 변환하여 DispatcherServlet에 전달

5. DispatcherServlet에서 전달받은 ModelAndView 객체를 이용하여 매핑되는 View를 검색

6. viewResolver에서 처리 결과를 view에 전달

7. 처리결과가 포함된 view를 DispatcherServlet에 전달

8. DispatcherServlet에서 최종 응답 결과를 클라이언트에게 출력

사진 출처 - https://gngsn.tistory.com/83

숫자 카드 게임

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

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine().trim(), " ");

        int N = 0, M = 0;
        N = Integer.parseInt(st.nextToken());
        M = Integer.parseInt(st.nextToken());
        
        String str = "";
        
        char[][] chararray = new char[N][M];
        
        for(int i = 0; i < N; i++){
            str = br.readLine();
            str = str.replace(" ", "");
            for(int j = 0; j < str.length(); j++){
                chararray[i][j] = str.charAt(j);
            }
        }
        
        
        char min = chararray[N-1][0];

        for(int i = 0; i < M; i++){
            if(min > chararray[N-1][i]){
                min = chararray[N-1][i];
            }
        }
        
        System.out.println(min);
    }
}

 성공

 
시간 제한메모리 제한제출정답맞힌 사람정답 비율
2 초 128 MB 8597 2813 2369 34.195%

문제

8*8크기의 체스판에 왕이 하나 있다. 킹의 현재 위치가 주어진다. 체스판에서 말의 위치는 다음과 같이 주어진다. 알파벳 하나와 숫자 하나로 이루어져 있는데, 알파벳은 열을 상징하고, 숫자는 행을 상징한다. 열은 가장 왼쪽 열이 A이고, 가장 오른쪽 열이 H까지 이고, 행은 가장 아래가 1이고 가장 위가 8이다. 예를 들어, 왼쪽 아래 코너는 A1이고, 그 오른쪽 칸은 B1이다.

킹은 다음과 같이 움직일 수 있다.

  • R : 한 칸 오른쪽으로
  • L : 한 칸 왼쪽으로
  • B : 한 칸 아래로
  • T : 한 칸 위로
  • RT : 오른쪽 위 대각선으로
  • LT : 왼쪽 위 대각선으로
  • RB : 오른쪽 아래 대각선으로
  • LB : 왼쪽 아래 대각선으로

체스판에는 돌이 하나 있는데, 돌과 같은 곳으로 이동할 때는, 돌을 킹이 움직인 방향과 같은 방향으로 한 칸 이동시킨다. 아래 그림을 참고하자.

입력으로 킹이 어떻게 움직여야 하는지 주어진다. 입력으로 주어진 대로 움직여서 킹이나 돌이 체스판 밖으로 나갈 경우에는 그 이동은 건너 뛰고 다음 이동을 한다.

킹과 돌의 마지막 위치를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 킹의 위치, 돌의 위치, 움직이는 횟수 N이 주어진다. 둘째 줄부터 N개의 줄에는 킹이 어떻게 움직여야 하는지 주어진다. N은 50보다 작거나 같은 자연수이고, 움직이는 정보는 위에 쓰여 있는 8가지 중 하나이다.

출력

첫째 줄에 킹의 마지막 위치, 둘째 줄에 돌의 마지막 위치를 출력한다.

예제 입력 1 복사

A1 A2 5
B
L
LB
RB
LT

예제 출력 1 복사

A1
A2

예제 입력 2 복사

A1 H8 1
T

예제 출력 2 복사

A2
H8

예제 입력 3 복사

A1 A2 1
T

예제 출력 3 복사

A2
A3

예제 입력 4 복사

A1 A2 2
T
R

예제 출력 4 복사

B2
A3

예제 입력 5 복사

A8 B7 18
RB
RB
RB
RB
RB
RB
RB
RB
RB
RB
RB
RB
RB
RB
RB
RB
RB
RB

예제 출력 5 복사

G2
H1

예제 입력 6 복사

C1 B1 3
L
T
LB

예제 출력 6 복사

B2
A1

정답

package project;

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

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        StringBuffer sb = new StringBuffer();
        
        String move_input = "";
        int cnt = 0;
        
        char[] king_pos, stone_pos, next_king, next_stone;
        
        // 킹 포지션
        king_pos = st.nextToken().toCharArray();
        // 돌 포지션
        stone_pos = st.nextToken().toCharArray();
        // 몇 번 옮기는지 입력
        cnt = Integer.parseInt(st.nextToken());
        
        for(int i = 0; i < cnt; i++){
            move_input = br.readLine();
            next_king = move(move_input, king_pos);
            if(Range(next_king)){ // 킹이 범위 안에 있네
                if(next_king[0] == stone_pos[0] && next_king[1] == stone_pos[1]){ // 옮긴 킹의 위치하고 돌의 위치가 같네?
                    next_stone = move(move_input, stone_pos);
                    if(Range(next_stone)){ // 킹도 범위 안이고 좌표가 같으나 돌이 움직일 수 있으면 둘다 바꾼다.
                        king_pos = next_king;
                        stone_pos = next_stone;
                    }else{ // 돌이 움직일 수 없으면
                        continue;
                    }
                }else{ // 안곂치네? 고럼 움직여야지
                    king_pos = next_king;
                }
                
            }else{ // 킹이 범위에 없네? 그럼 무시
                continue;
            }
        }
        
        for(int i = 0; i < king_pos.length; i++){
            sb.append(king_pos[i]);
        }sb.append(" ");
        for(int i = 0; i < stone_pos.length; i++){
            sb.append(stone_pos[i]);
        }
        
        System.out.print(sb);
    }
    
    // 범위 넘어가는지 여부
    public static Boolean Range(char[] range){
        if(range[0]<'A' || range[0]>'H' || range[1]<'1' || range[1]>'8')
            return false;
        else
            return true;
    }
        
    public static char[] move(String mv, char[] pos){
        char[] result = pos.clone();
        // char로 된 'A', 'B' 는 아스키 코드로 인식되어 ++ --가 가능하다
        switch(mv){
            case "R":
                result[0]++;
                break;
            case "L":
                result[0]--;
                break;
            case "B":
                result[1]--;
                break;
            case "T":
                result[1]++;
                break;
            case "RT":
                result[0]++;    result[1]++;
                break;
            case "LT":
                result[0]--;    result[1]++;
                break;
            case "RB":
                result[0]++;    result[1]--;
                break;
            case "LB":
                result[0]--;    result[1]--;
        }
        return result;
    }
}

'코딩테스트 준비 > 백준' 카테고리의 다른 글

2884번 - 알람시계  (0) 2022.03.20
2490번 - 윷놀이  (0) 2022.03.20
10798번 - 세로읽기  (0) 2022.03.20
2752번 문제 - 백준(bronze4)  (0) 2022.03.17
1964번 문제 - 백준(bronze4)  (0) 2022.02.15

알람 시계 성공다국어

한국어   
시간 제한메모리 제한제출정답맞힌 사람정답 비율
1 초 128 MB 239069 89719 76437 38.381%

문제

상근이는 매일 아침 알람을 듣고 일어난다. 알람을 듣고 바로 일어나면 다행이겠지만, 항상 조금만 더 자려는 마음 때문에 매일 학교를 지각하고 있다.

상근이는 모든 방법을 동원해보았지만, 조금만 더 자려는 마음은 그 어떤 것도 없앨 수가 없었다.

이런 상근이를 불쌍하게 보던, 창영이는 자신이 사용하는 방법을 추천해 주었다.

바로 "45분 일찍 알람 설정하기"이다.

이 방법은 단순하다. 원래 설정되어 있는 알람을 45분 앞서는 시간으로 바꾸는 것이다. 어차피 알람 소리를 들으면, 알람을 끄고 조금 더 잘 것이기 때문이다. 이 방법을 사용하면, 매일 아침 더 잤다는 기분을 느낄 수 있고, 학교도 지각하지 않게 된다.

현재 상근이가 설정한 알람 시각이 주어졌을 때, 창영이의 방법을 사용한다면, 이를 언제로 고쳐야 하는지 구하는 프로그램을 작성하시오.

입력

첫째 줄에 두 정수 H와 M이 주어진다. (0 ≤ H ≤ 23, 0 ≤ M ≤ 59) 그리고 이것은 현재 상근이가 설정한 놓은 알람 시간 H시 M분을 의미한다.

입력 시간은 24시간 표현을 사용한다. 24시간 표현에서 하루의 시작은 0:0(자정)이고, 끝은 23:59(다음날 자정 1분 전)이다. 시간을 나타낼 때, 불필요한 0은 사용하지 않는다.

출력

첫째 줄에 상근이가 창영이의 방법을 사용할 때, 설정해야 하는 알람 시간을 출력한다. (입력과 같은 형태로 출력하면 된다.)

예제 입력 1 복사

10 10

예제 출력 1 복사

9 25

예제 입력 2 복사

0 30

예제 출력 2 복사

23 45

예제 입력 3 복사

23 40

예제 출력 3 복사

22 55

정답

package project;

import java.util.Scanner;

public class Main {

    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        
        int hour = sc.nextInt();
        int min  = sc.nextInt();
        
        if(min < 45){
            hour--;
            min = (60 + min) - 45;
            if(hour < 0){
                hour = 23;
            }
            System.out.print(hour+" "+min);
        }
        else{
            System.out.print(hour+" "+(min-45));
        }
    }
}

'코딩테스트 준비 > 백준' 카테고리의 다른 글

1063번 - 킹  (0) 2022.03.21
2490번 - 윷놀이  (0) 2022.03.20
10798번 - 세로읽기  (0) 2022.03.20
2752번 문제 - 백준(bronze4)  (0) 2022.03.17
1964번 문제 - 백준(bronze4)  (0) 2022.02.15

윷놀이 성공

 
시간 제한메모리 제한제출정답맞힌 사람정답 비율
1 초 128 MB 26640 15351 13470 57.973%

문제

우리나라 고유의 윷놀이는 네 개의 윷짝을 던져서 배(0)와 등(1)이 나오는 숫자를 세어 도, 개, 걸, 윷, 모를 결정한다. 네 개 윷짝을 던져서 나온 각 윷짝의 배 혹은 등 정보가 주어질 때 도(배 한 개, 등 세 개), 개(배 두 개, 등 두 개), 걸(배 세 개, 등 한 개), 윷(배 네 개), 모(등 네 개) 중 어떤 것인지를 결정하는 프로그램을 작성하라.

입력

첫째 줄부터 셋째 줄까지 각 줄에 각각 한 번 던진 윷짝들의 상태를 나타내는 네 개의 정수(0 또는 1)가 빈칸을 사이에 두고 주어진다.

출력

첫째 줄부터 셋째 줄까지 한 줄에 하나씩 결과를 도는 A, 개는 B, 걸은 C, 윷은 D, 모는 E로 출력한다.

예제 입력 1 복사

0 1 0 1
1 1 1 0
0 0 1 1

예제 출력 1 복사

B
A
B

정답

package project;

import java.util.Scanner;

public class Main {

    public static void main(String[] args){
        //TODO Auto-generated method stub
		char[][] answer = new char[3][4];
        //BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        Scanner sc = new Scanner(System.in);
        int cnt = 0;
        
		for(int i = 0; i < answer.length; i++){            
            String str = sc.nextLine().trim();
            str = str.replace(" ","");
		    for(int j = 0; j < str.length(); j++){
		        answer[i][j] = str.charAt(j);
		    }
		}
        
        for(int i = 0; i < 3; i++){
            for(int j = 0; j < 4; j++){
                if(answer[i][j] == '1'){
                    cnt += 1;
                }
            }
            switch(cnt){
                case 0:
                    System.out.println("D");
                    break;
                case 1:
                    System.out.println("C");
                    break;
                case 2:
                    System.out.println("B");
                    break;
                case 3:
                    System.out.println("A");
                    break;
                case 4:
                    System.out.println("E");
                    break;
            }
            cnt = 0;
        }
    }
}

'코딩테스트 준비 > 백준' 카테고리의 다른 글

1063번 - 킹  (0) 2022.03.21
2884번 - 알람시계  (0) 2022.03.20
10798번 - 세로읽기  (0) 2022.03.20
2752번 문제 - 백준(bronze4)  (0) 2022.03.17
1964번 문제 - 백준(bronze4)  (0) 2022.02.15

+ Recent posts