1.UDP는 패킷 내부에 port 번호를 가지고 있기 때문에
목적지에 도착했을 경우 확인 후 데이터를 전달할 수 있으며
checksum이라는 데이터 합계 값을 통해 오류를 확인할 수 있다.
하지만 데이터의 오류가 발견되었다고 해도 재전송요청등을 자체적으로는 하지 않는다.

TCP 또한 port 번호와 checksum이 TCP헤더에 존재하고 있으며
DATA PAYLOAD또한 포함하고 있다.

TCP는 순서를 가지고 데이터를 전달하고 있으며 자체적 에러 검증도 할 수 있기 때문에
순서가 잘못된 패킷을 삭제하고 재전송요청을 할 수 있으며
자체적으로 도착시간에 따른 패킷 전송 경로 조정 기능 또한 가지고 있다.


2.도메인은 트리 구조로 관리되고 있는데
최상위 도메인에는 .org, .kr, .net, .com, .edu 등이 있으며
중간 위치에는 xxx.com, yyy.com, zzz.com 등 우리가 일반적으로 아는 주소가 들어간다.
마지막으로 서브도메인은 aaa.xxx.com, bbb.xxx.com 등 주소 앞자리에 들어가게 된다.

중간 위치의 도메인만 3억개가 넘어가기 때문에(2017년 기준)
여러 DNS서버로 분산되어 관리된다.


3.숫자로 이루어진 비밀번호의 보안을 위해서 3회의 오류시 시간 지연을 두는 등의 방법이 있지만
해당 방법은 수만대 이상을 동원할 경우 해당 시간동안 몇개이상이 계속 풀릴 수 있기 때문에
좋은 방식은 아니다.

숫자만 사용하는 것 보다 문자열이 추가될 경우 
필요한 연산의 숫자가 기하급수적으로 늘어나기 때문에
암호에는 문자, 특수문자, 대문자 등을 포함시키는 편이 좋으며
지문, 홍체, 기기, 접속위치등의 방법 또한 각각의 장단점이 존재한다.

이런 문제들을 막기 위해 적은 비용으로 고효율의 보안을 유지할 수 있는 방법은 
바로 "다중 요소 인증"인데 간단한 인증 방식의 혼합을 통해 달성할 수 있다.

누군가 우리집 컴퓨터에서 내 정보를 빼려고 시도할 수 있고(사촌동생..?)
누군가 해킹을 통해 내 계정의 비밀번호를 알 수 있지만 
두 가지를 동시에 만족하기는 쉬운 일이 아니다.

비밀번호 + 접속지역 제한, 비밀번호 + 접속기기 제한,
비밀번호 + 핸드폰 인증 등이 대중적으로 이용되고 있으며
이런 방식을 통해 접속을 관리할 경우 
누군가 비밀번호를 탈취하더라도 계정의 안전을 유지할 수 있게 된다.





(1).백준 5525번 IOIOI는 특정 문자열이 몇번 들어있는지를 찾는 문제였다.
다만 일정의 규칙을 가지고 1초의 시간제한 안에 100만개 미만의 글자를 조회해야 하기 때문에
예전에는 서브태스크 제한조건 중 1만개 미만의 조건만 통과했던 문제였다.

최적화에 대해 잘 모를 때 시도하고 틀린 문제

이전에는 정규식, 교체, split 등 간단한 방식으로 진행했지만
이번에는 조금 더 규칙을 확인해 다음 글자에 OI가 들어갈 경우
체크를 하지 않고 넘어가게 하는 간단한 조건 추가를 통해 해결할 수 있었다.

passCheck라는 이전 문자열이 규칙에 맞는 경우
추가적으로 들어가야 할 문자열만 확인하는 방식으로 연산을 줄였기 때문에
반복되는 문자열을 효율적으로 확인할 수 있었고
추가로 체크해야 하는 길이만큼의 확인을 두개의 문자열을 통해 해결하고
i++를 통해 기존 i++와 중복되어 i+=2로 다음 문자열의 확인도 통과했다.
또한 다음 문자열이 정상적이지 않은 경우 passCheck를 false로 바꿔준 다음
다음 문자열부터 다시 체크하는 방식으로 진행했다.

하단의 주석들은 예전에 시도했다가 시간초과가 났던 기록들이다.

const input = `1
13
OOIOIOIOIIOII`.toString().trim().split('\n')

const str = input[2]
let count = 0
let passCheck = false
let target = `I${"OI".repeat(Number(input[0]))}`

for(let i = 0 ; i <= str.length-target.length ; i++){
    if(passCheck || str.slice(i,i+target.length) === target){
        console.log(passCheck, str.slice(i,i+target.length))
        count++
        if(str[i+target.length] === "O" && str[i+target.length+1] === "I"){
            passCheck = true
            i++
        }
        else{
            passCheck = false
        }
    }
}

console.log(count)



// const input = `2
// 13
// OOIOIOIOIIOII`.toString().trim().split('\n')
// let a = Number(input[0])
// let b = Number(input[1])
// let c = input[2]
// let str = 'I'
// let result = 0

// for(let i = 0 ; i < a ; i++){
//     str += 'OI'
// }

// for(let i = 0 ; i < c.length ; i++){
//     if(c.indexOf(str,i) !== -1){
//         console.log(c.indexOf(str))
//         if(c.indexOf(str,i) > i){
//             i = c.indexOf(str,i)
//             result += 1
//         }
//         else{
//             result += 1
//         }
//     }
// }
// console.log(result)
//--------------------------------------
// const input = `2
// 13
// OOIOIOIOIIOII`.toString().trim().split('\n')
// let a = Number(input[0])
// let b = Number(input[1])
// let c = input[2]
// let str = 'I'
// let result = 0

// for(let i = 0 ; i < a ; i++){
//     str += 'OI'
// }

// for(let i = 0 ; i < c.length ; i++){
//     if(c.indexOf(str,i) !== -1){
//         console.log(str,i)
//         if(c.indexOf(str,i) > i){
//             i = c.indexOf(str,i)
//             result += 1
//         }
//         else{
//             result += 1
//         }
//     }
// }
// console.log(result)
//---------------------------------------
// const input = `1
// 13
// OOIOIOIOIIOII`.toString().trim().split('\n')
// let a = Number(input[0])
// let target = input[2]
// let str = 'I'
// for(let i = 0 ; i < a ; i++){
//     str += 'OI'
// }
// let regExp = new RegExp(str, 'g');

// // let variableWord = 'a';
// // let pattern2 = new RegExp(variableWord);
// //console.log(text.replace(/pattern/g, '___'))

// // console.log(target.match(regExp).length)


// let target2 = 'aaaaaa'
// let regExp2 = /aa/g
// console.log(target2.match(regExp2))

//-------------------------------------------------
// const input = require('fs').readFileSync('/dev/stdin').toString().trim().split('\n')
// const input = `2
// 13
// OOIOIOIOIIOII`.toString().trim().split('\n')
// let a = Number(input[0])
// let target = input[2]
// let str = 'I'
// let count = 0
// for(let i = 0 ; i < a ; i++){
//     str += 'OI'
// }
// let str2 = str.slice(2)
// while(target.replace(str,str2) !== target){
//     target = target.replace(str,str2)
//     count++
// }
// console.log(count)

'회고' 카테고리의 다른 글

[취업준비일지] - 136  (0) 2023.03.05
[취업준비일지] - 135  (0) 2023.03.04
[취업준비일지] - 133  (0) 2023.03.02
[취업준비일지] - 132  (0) 2023.03.01
[취업준비일지] - 131  (0) 2023.02.28

+ Recent posts