멋사/TIL

230713 13주 4일차 TIL. 카드 합체 놀이 boj 15903, WebSocket

yeooniyeoon 2023. 7. 13. 16:05
728x90
SMALL

카드 합체 놀이 boj 15903

https://www.acmicpc.net/problem/15903

 

15903번: 카드 합체 놀이

첫 번째 줄에 카드의 개수를 나타내는 수 n(2 ≤ n ≤ 1,000)과 카드 합체를 몇 번 하는지를 나타내는 수 m(0 ≤ m ≤ 15×n)이 주어진다. 두 번째 줄에 맨 처음 카드의 상태를 나타내는 n개의 자연수 a1,

www.acmicpc.net

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.PriorityQueue;
import java.util.StringTokenizer;

public class Main {
    public long solution() throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer infoToken = new StringTokenizer(reader.readLine());
        int cardCount = Integer.parseInt(infoToken.nextToken());
        int actions = Integer.parseInt(infoToken.nextToken());

        StringTokenizer cardToken = new StringTokenizer(reader.readLine());
        PriorityQueue<Long> smallestCards = new PriorityQueue<>();
        for (int i = 0; i < cardCount; i++) {
            smallestCards.offer(Long.parseLong(cardToken.nextToken()));
        }

        for (int i = 0; i < actions; i++) {
            long first = smallestCards.poll();
            long second = smallestCards.poll();
            smallestCards.offer(first + second);
            smallestCards.offer(first + second);
        }
        long answer = 0;
        while (!smallestCards.isEmpty()) {
            answer += smallestCards.poll();
        }
        return answer;
    }

    public static void main(String[] args) throws IOException {
        System.out.println(new Main().solution());
    }
}

가장 작은 수 2개를 선택하여 합하기.

우선순위 큐에 모든 수를 넣은 후 가장 작은 수 2개를 뽑은 뒤

이 둘을 더한 후 그 값을 다시 각각 더해준다.

 

 

 

WebSocket

클라이언트와 서버간의 TCP 연결을 길게 유지하고,

양방향으로 데이터를 전송할 수 있도록 해주는 통신 규약의 일종.

 

HTTP의 경우 클라이언트의 요청이 없으면 서버에서 데이터를 전달할 방법이 없음.

WebSocket은 서버에서 클라이언트에 데이터를 보낼 수 있다는 점에서 채팅, 알림 등의 기능을 제공하는데 활용됨.

 

클라이언트와 서버가 WebSocket 연결을 구성하는 과정

1. 클라이언트가 서버에게 WebSocket 통신을 사용하겠다는 의도를 Http Header Upgrade에 담아 전송함.

2. 서버가 클라이언트에게 WebSocket 지원여부에 따라 Switching Protocols를 의미하는 101 응답을 전송.

 

이후 서버와 클라이언트는 성공적으로 WebSocket 통신을 활용해 데이터를 주고받을 수 있게 되는데

이렇게 통신 규약을 바꾸는 과정을 Protocol Handshake라고 함.

 

Spring Boot로 WebSocket을 사용하려면 spring-boot-starter-websocket 의존성을 추가하면 된다.

 

public class SimpleChatHandler extends TextWebSocketHandler {
	private final List<WebSocketSession> sessions = new ArrayList<>();
}

WebSocket 요청을 받았을 때 행동할 방식 정의 시 WebSocketHandler 인터페이스를 구현하여 정의하는데

WebSocket 통신으로 문자 데이터만 받을 때에는 TextWebSocketHandler라를 구현체를 활용할 수 있다.

 

서버에 접속한 사용자를 관리하기 위한 리스트로 session 필드를 만들어주었다.

WebSocketSession WebSocket 통신을 진행하는 사용자를 나타낸다.

 

@Override
public void afterConnectionEstablished(
	WebSocketSession session
) throws Exception {
	sessions.add(session);
    log.info("{} connected, total sessions: {}", session, sessions.size());
}

afterConnectionEstablished 메소드는 클라이언트가 연결될 때 호출되며

연결된 클라이언트를 나타내는 session을 전달받아 sessions 리스트에 추가한다.

 

 

@Override
protected void handleTextMessage(
	WebSocketSession session,
    TextMessage message
) throws Exception {
	String payload = message.getPayload();
    log.info("received: {}", payload);
    for (WebSocketSession connected: sessions) {
    	connected.sendMessage(message);
    }
}

handleTextMessage는 클라이언트가 메세지 전송 시 실행되는 메소드로

메세지를 보낸 클라이언트가 WebSocketSession에, 전달한 데이터가 TextMessage에 담기게 된다.

getPayload()를 통해 전달된 데이터의 텍스트를 저장하고,

현재 서버에 접속해있는 모든 사용자에게 message를 전송한다.

 

 

@Override
public void afterConnectionClosed(
	WebSocketSession session,
    CloseStatus status
) throws Exception {
	log.info(session.getId());
    log.info("Connection with {} closed", session);
    sessions.remove(session);
}

afterConnectionClosed는 WebSocket 연결 종료 시 호출되는 메소드로

sessions에서 연결이 종료된 session을 삭제한다.

 

 

public class WebSocketConfig implements WebSocketConfigurer {
	private final SimpleChatHandler simpleChatHandler;
    
    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
    	registry.addHandler(simpleChatHandler, "ws/chat").setAllowedOrigins("*");
    }
}

위에서 구현한 SimpleChatHanlder를 WebSocket에 사용하기 위한 설정을 해야 한다.

WebSocketConfigurer 인터페이스를 구현해 WebSocketHandlerRegistry에

simpleChatHandler를 등록한다..

 

 

 

 

 

 

728x90
반응형
SMALL