인터넷 프로토콜(Internet Protocol)의 약자로, 인터넷이 통하는 네트워크에서 어떤 정보를 수신하고 송신하는 통신에 대한 규약을 의미함
IP는 OSI의 Layer 3(Network Layer)와 Internet Protocol Suite의 Layer 3(Internet Layer)에 위치하는 프로토콜
정리
쉽게 말해, 택배를 보낼 때, 받는 사람과 보내는 사람의 주소를 적어서 보낸다. 이때의 받는 사람이 주소를 확인하여 본인에게 온 택배가 맞는지의 작업이라고 생각하시면 됩니다.
공인IP주소
공인IP란 실제 다른 컴퓨터와 통신할 때 쓰는 IP주소이며 IPv4에서는 '1.0.0.0' ~ '223.255.255.255' 까지가 여기에 해당됨.
쉽게 말해, 고유한(유일한) IP 주소 ( 검색창에 내 ip 주소를 검색하면 나오는 IP)
그럼 어디에 쓰일까요?
공인IP를 알고 있다고 해서 통신이 가능한 것은 아닙니다. 공인IP 주소를 사용하는 경우에는 특정 포트를 열어주어 외부에서 접근이 가능하게 하여 사용한답니다.
사설IP주소
사설IP란 와이파이, 학교 공용 컴퓨터 등을 보면 192.168.XXX.XXX 처럼 아이피가 거의 사설 아이피인것을 확인 할 수 있습니다. 그 외에도 공유기를 사용하는 가정용 컴퓨터에서도 심심치 않게 볼 수 있음.
그럼 어디에 쓰일까요?
공인IP 처럼 사설IP를 통신할 외부 컴퓨터에 알려줘도 접근이 불가능합니다. 예를 들어) 개똥이의 친구 A는 같은 건물의 회사에 다니고 친구 B는 다른 건물의 회사에 다닙니다. 친구 A는 개똥이에게 사설IP를 알려주면 같은 사설망을 사용하고 있어 접속을 할 수 있지만, 친구 B는 접속할 수 없습니다. 일상 생활로 비유를 들면, 집에 공유기 하나에 3개의 랜선이 연결되어.. 3개의 컴퓨터가 있다면 같은 사설망에 있어 192.168.XXX.XXX라는 주소를 알려주면 접근이 가능합니다. 하지만 옆집에 사는 친구가 접근하려면 공인 IP를 알려줘야 사용이 가능합니다.
localhost
localhost란 컴퓨터 네트워크에서 사용하는 루프백 주소로, 자신의 컴퓨터를 의미한다. 즉, 컴퓨터의 네트워크 기능을 시험하기 위해 '가상으로 인터넷망에 연결되어 있는 것처럼 할당하는 인터넷 주소'
개발을 진행하면서 CRUD만 작성을 하다보니깐 에러를 처리하는 부분이 마음에 들지 않아서!! 특히, catch부분에 ctrl + c , ctrl + v 로 500에러만 나타내주기 보다는 각각의 상황에 맞춰 에러를 핸들링 해주고 싶었습니다. 구글링을 통해서 best practice를 찾아보고 적용하면서 부족한 부분이 무엇인지에 대해서도 알 수 있었습니다. next()의 동작과 app.js의 플로우와 app.use를 세밀하게 더 살펴볼 수 있었고 제 코드에 적용할 수 있었던 기회였습니다!
id_list.map을 통해 userList를 key,value로 만들어 줍니다. => userList 는 신고당한 사람들이 key로 value에는 신고를 한 사람들을 저장해줍니다.
report.map 을 통해 report로 부터 받은 string을 split 하여 가공 가능한 자료로 바꾸어 줍니다. => user_id,report_id 로 신고한 사람과 신고 당한 사람을 각각 분류
"한 유저를 여러번 신고할 수도 있지만, 동인한 유저에 대한 신고 횟수는 1회로 처리됩니다." 의 조건을 해결 => userList[신고당한 사람]이 신고한 사람이랑 같지 않게 조건식을 만들어 줍니다.
userList(신고 당한 사람)의 length 가 k의 값과 같거나 클 때 -> 해당 userList[key]에 해당하는 value는 object 형식이기 때문에 for문이나 map을 사용하여 id_list.indexOf()를 이용해 answer인덱스에 해당하는 값을 더해줍니다.
코드
function solution(id_list, report, k) {
const answer = new Array(id_list.length).fill(0);
let userList = [];
id_list.map((value)=>{
userList[value]= [];
})
report.map(value=>{
const [user_id,report_id]=value.split(' ');
if(!userList[report_id].includes(user_id))userList[report_id].push(user_id);
})
for(const key in userList){
if(userList[key].length>=k){
userList[key].map(v=>{
answer[id_list.indexOf(v)]++;
})
}
}
return answer;
}