[쉽게 배우는 데이터 통신과 네트워크] Chapter 6 - 데이터 링크 계층
·
Network
프로토콜의 기초 데이터 링크 계층에서 호스트끼리 통신하기 위해서는 점대점으로 연결되어야 한다. 기본적으로 데이터 링크 계층의 연결은 점대점 연결이지만 예외적으로 멀티 드롭 방식을 구현할 수 있다. 두 호스트 간 물리적인 전송 오류를 감지하고 복구하는 것이 데이터 링크 계층의 역할이며, 재전송 기법을 사용한다. 재전송 기법은 긍정 응답 프레임, 부정 응답 프레임, 타임아웃, 순서 번호 등의 기능을 수행한다. 프레임의 종류 정보 프레임 정보 프레임은 상위 계층이 전송을 요구한 데이터를 수신 호스트에 전송하는 용도로 사용하며 I 프레임으로 표기한다. 정보 프레임에는 데이터, 프레임 순서 번호, 송수신 호스트의 주소 정보, 오류 검출 코드 등을 포함한다. 수신 호스트는 프레임 순서 번호로 각 프레임을 구별할 수..
[쉽게 배우는 데이터 통신과 네트워크] Chapter 5 - MAC 계층
·
Network
MAC 계층 IEEE 802 시리즈 WAN 환경과는 다르게 LAN 환경에서는 데이터 링크 계층이 다르다. 이러한 차이를 IEEE 802 시리즈에서 다루고 있다. 데이터 링크 계층의 상위 부분인 LLC 계층은 LAN 종류의 큰 영향을 받지 않아 802.2 단일 표준안을 사용하지만 하위 부분인 MAC 계층은 LAN에 따라 다양하여 각각의 표준안이 정의되어 있다. MAC과 LLC 계층 LAN 환경에서는 OSI 7계층 모델에서 정의한 데이터 링크 계층의 기본 기능은 LLC에서 다루고, 물리적 특징과 연결 방식은 MAC 계층에서 처리한다. MAC 계층 MAC 계층은 전송 선로의 물리적인 특성을 반영하기 때문에 LAN 종류에 따라서 특성이 구분된다. 전송 방식, 호스트의 연결 구조, 유무선 환경 등의 차이점을 MA..
(Java) 프로그래머스 - 리코쳇 로봇
·
코딩 테스트
BFS + 조건이 붙은 문제였다. 문제를 읽고 예전에 했던 게임이 생각나서 재미있게 풀었다. 로직 먼저 board를 순회하며 아직 계산되지 않은 노드를 INF로 초기화 하고, 시작 지점과 도착 지점의 좌표를 저장한다. 시작지점에서 BFS 탐색을 시작하는데, 다른 점은 우선순위 큐를 사용한다는 것이다. 우선순위 큐를 이용하면 상하좌우 중 지금까지 가장 적은 방문 횟수를 가진 노드를 먼저 방문하게 되기 때문이다. 상하좌우를 선택하였다면, D를 만나거나 배열에 끝에 다다를때까지 계속 같은 방향으로 진행한다. 그리고 도착한 노드에 횟수를 더해주고 계속 탐색하면 된다. 최종 코드 import java.util.*; class Solution { static int[] dRow = {1, -1, 0, 0}; sta..
(Java) 프로그래머스 - 디펜스 게임
·
코딩 테스트
입력값이 매우 큰 편이었기 때문에 O(n) 이내에 끝내야겠다는 생각을 했다. 처음에는 내림차순으로 정렬을 하고 k를 우선적으로 사용하고, 나머지는 n을 사용하는 로직을 생각했다가 잘못된 로직이라는 것을 깨닫고 우선순위 큐를 이용하여 풀었다. 어떻게 생각하냐에 따라 엄청 간단한 문제일 수도 있지만, 내가 배배 꼬아서 생각했던지 풀이에 오랜 시간이 걸렸다. 로직 먼저 enemy 배열을 순회하며 n을 빼주고 우선순위 큐에 삽입한다. 만약 n이 음수로 내려간다면, 지금까지 지나왔던 라운드에 가장 큰 값이 우선순위 큐에 첫 번째 값으로 들어 있으니 그 값을 빼서 다시 n에 더해준다. 이렇게 하면 지나온 라운드 중 가장 큰 값에만 무적권을 쓰게 된 것과 같다. 더 이상 쓸 수 있는 무적권이 없다면 순회를 종료하면 ..
(Java) 프로그래머스 - 광물 캐기
·
코딩 테스트
문제를 읽고 입력값이 크지 않아 완전탐색을 생각했었다. 백트래킹을 이용하면 어찌어찌 구현할 수 있겠다고 생각했지만, 그리 끌리지는 않았다. 주어진 순서대로 탐색을 해야 하고 가중치가 있기 때문에 그리디로 해결할 수 있다고 생각하여 도전한 결과 풀이에 성공했다. 로직 곡괭이가 없거나, 더 캘 광물이 없다면 종료해야 하므로 매 순회마다 종료 조건을 설정했다. 하나의 곡괭이는 5번을 사용할 수 있으므로 미네랄 배열을 5개씩 그룹을 만들어 탐색한다. 하나의 그룹을 각각 다이아몬드 곡괭이, 철 곡괭이, 돌 곡괭이로 채굴했을 때의 피로도를 객체로 만들어 list에 넣는다. list안의 객체를 돌 곡괭이를 사용했을 때의 피로도를 기준으로 내림차순 정렬하고 가장먼저 다이아몬드 곡괭이부터 사용하고, 철 곡괭이를, 돌 곡..
(Java) 프로그래머스 - 미로 탈출
·
코딩 테스트
오랜만에 푸는 BFS 문제였다. 기본적인 BFS 문제에서 약간 더 생각을 해야했는데, 로직을 생각하는데 그리 오래 걸리지는 않았다. 로직 먼저, 탈출을 하기 위해서는 레버까지 가야한다. 그렇기 때문에 레버까지 BFS를 통해 최단거리 탐색을 진행한다. 레버에 도착하고 다시 한번 탈출지점까지 BFS 탐색을 하는데, 여기서 중요한것은 왔던길을 다시 갈 수도 있다는 것이다. 따라서 방문 배열을 초기화 하고 BFS 탐색을 진행해야 한다. 탈출 조건이 (시작지점에서 레버에 도달 && 레버에서 탈출지점까지 도달) 이므로 둘중 하나라도 만족하지 못하면 -1을 리턴해야 한다. 최종 코드 import java.util.*; class Solution { static int[] dRow = {-1, 1, 0, 0}; sta..
(Java) 프로그래머스 - 테이블 해시 함수
·
코딩 테스트
문제에 각 단계에 맞게 계산하는 쉬운 문제였다. 오랜만에 Comparator를 사용하는 것과 비트 연산이 나와서 재밌었다. 다만 문제 설명이 친절하지는 않아서 예시를 보며 풀었다. 로직 문제 각 단계에 맞게 로직을 작성하면 된다. 1. Comparator를 사용하여 문제에 제시된 대로 정렬하면 된다. 2. 배열을 순회하며 값을 찾아 list에 넣는다. 주의해야 할 것은 각 컬럼의 값이 0부터가 아니라 1부터이고 주어진 타입은 배열이기 때문에 col, row_begin, row_end 값을 보정해야 한다. 3. list를 순회하며 answer에 XOR 연산을 진행한다. 최종 코드 import java.util.*; class Solution { public int solution(int[][] data, ..
(Java) 프로그래머스 - 마법의 엘리베이터
·
코딩 테스트
처음에는 DP 문제라고 생각하고 풀었는데, 잘못된 접근이었다. 다음으로 storey를 String 배열로 바꾸어서도 풀어보았는데, 자리수가 늘어나는 예외를 처리하지 못했다. 마지막으로 storey를 나눠가는 방식으로 겨우 풀이에 성공했다. 로직 storey가 0이 될때까지 while을 돌린다. 매 roof 마다 가장 끝자리인 num과 num의 앞자리인 nextNum만 확인하면 된다. 왜냐하면 roof에 끝에서 10씩 나누어 주기 때문이다. num이 5보다 크면 현재 층수에서 올라가는것이 빠르고, num이 5보다 작으면 현재 층수에서 내려가는게 빠르다. num이 5라면 num의 앞자리 숫자를 확인해야 한다. 앞자리 숫자가 4보다 크면 올라가는게 빠르고, 작으면 내려가는게 빠르기 때문이다. 최종 코드 imp..
(Java) 프로그래머스 - 호텔 대실
·
코딩 테스트
문제를 보자마자 누적합을 이용하면 쉽게 풀수 있을것이라고 생각했다. 다만, 누적합을 어떻게 구현해야 하는지 잘 생각이 나지 않아 LocalTime 클래스를 이용해서 풀어보았으나, 테스트 케이스 통과를 하지 못하였다. 그래서 누적합에 대해 검색했고, 쉽게 풀 수 있었다. 로직 2차원 배열 book_time을 순회하며 방 입실 시간과, 퇴실 시간을 구한다. 퇴실 시간에 청소시간을 고려하여 10분을 더해주면 된다. arr 배열에 모든 입실시간과 퇴실시간을 더해주고, 누적합을 구하며 최댓값을 찾으면 된다. 최종 코드 import java.util.*; class Solution { public int solution(String[][] book_time) { int answer = 0; int[] arr = n..