no image
[Network] World Wide Web와 인터넷, HTTP의 역사
1989년 CERN 연구소에서 팀 버너스리가 발명한 인터넷상 정보시스템: WWW World Wide Web은 인터넷상에서 정보를 링크를 통해 효율적으로 접근할 수 있는 인터넷 상의 정보시스템이며, 팀 버너스리가 CERN 연구소에서 1989년 발명했고, WWW, W3라고 줄여 부른다. CERN은 유럽 입자물리 연구소로, 유럽을 기반으로 한 입자물리학 연구소이며, 가장 큰 실험 장치인 입자가속기 길이는 27km이다. 웹 발명자인 팀 버너스리는 1955년 6월 8일에 태어나 1976년에 옥스포드 학위를 받은 후, 2차례로 CERN에서 근무한 인물이다. 웹에 필요한 프로토콜중 하나인 HTTP와 웹 발명의 연결은 차후에 발명된 것이라 직접적인 관련은 없으나, 웹 발명과 함께 발전했다는 공통점이 있다. CERN에서..
2024.02.09
no image
[Network] 네트워크와 인터넷부터 ISP까지
IP, 공유기 IP주소는 인터넷에 연결되기 위해 인터넷 상의 주소. IP주소 할당이 필요하며, 모뎀과 홈 라우터로 이루어짐. 인터넷에 연결하기 위해서는 IP 주소 할당이 필요하다. 인터넷 케이블에 모뎀 연결 후, 공유기를 통해 여러 기기들이 인터넷에 연결된다. 공유기 (home router)는 다수의 기기들이 인터넷을 사용할 수 있도록 해주는 장치로, 한 IP주소에서 다수의 기기들이 인터넷을 사용이 가능해진다. 각 기기는 공유기를 통해서 서로 네트워크 통신이 가능해지며, 일부 기기는 유선망으로 연결, 일부 기기는 와이파이를 통해 무선 연결이 가능하다. 우리는 스마트 TV, 스마트폰, 프린터, 컴퓨터 등을 공유기를 통해 연결하여 '네트워크'를 형성함 네트워크 통신을 통해 스마트 TV로 저장된 영화를 불러올..
2024.02.06
no image
[Database] functional dependency(함수 종속) 이란?
데이터베이스 설계를 위한 functional dependency (함수 종속) 개관 functional dependency란, 테이블에 있는 어트리뷰트 집합 사이의 제약을 의미하며, 이를 통해 데이터베이스 설계의 기본이 된다. 집합 X와 Y를 나눈 후, X의 값이 같으면 Y의 값도 같다는 걸 알 수 있으며, 이 경우 X가 Y를 함수적으로 결정한다. 이 경우 functional dependency(FD)라 부르며 Symbol로는 X -> Y와 같이 표현할 수 있다. 테이블의 스키마를 보고 FD를 파악할 수 있지만, 테이블의 State를 보고 FD를 파악하면 안 된다. 위 테이블에서, 집합 X를 {Student_ID}, 집합 Y를 {Student_Name, Stream}라 했을때 집합 X인 Student_I..
2024.02.06
no image
[Database] Transaction
Transaction Transaction 은 여러 SQL문들을 논리적 단위로 묶어 하나의 작업 단위로 처리하는 것이다. Transaction 내의 SQL문 중 일부만 성공한 경우에도 DB에 반영되지 않고 모두 성공해야만 DB에 반영된다. 예를 들어, J가 H에게 20만원을 이체할 때, 계좌 변동은 J의 계좌에서 20만원이 제거되고, H의 계좌에 20만원이 추가되어 최종적으로 J는 80만원, H는 220만원이 된다. 이러한 계좌 변동 내용은 SQL 문으로 표현할 때 Balance 테이블을 업데이트하여 잔액을 반영하는 방식으로 처리한다. 하나의 Transaction 내에서 SQL문이 실패하면 이전 상태로 되돌린다. 따라서 중복작업을 방지할 수 있으며 데이터 일관성을 유지할 수 있다. 아래는 Transact..
2024.02.04
no image
[Database] 데이터베이스의 기본 개념 (DB, DBMS, Schema)
️데이터베이스와 DBMS에 대한 기본 개념 이해데이터베이스는 전자적으로 저장되고 사용되는 관련있는 데이터의 집합으로, 예를 들면 소셜네트워크 서비스에서 생성되는 데이터들을 말한다.데이터베이스는 관련있는 데이터들을 조직화된 집합으로 묶어야 한다.검색 및 사용의 효율성을 위해 데이터베이스는 잘 조직화되어야 하며, 중복된 데이터와 데이터의 불일치를 방지할 수 있다.DBMS는 사용자에게 데이터베이스를 정의, 생성 및 관리할 수 있는 기능을 제공하는 소프트웨어 시스템이다.DBMS의 대표적인 종류에는 Postgre SQL, MySQL, Oracle, SQL Server 등이 있다.DBMS, metadata, 데이터베이스 시스템 DBMS는 사용자가 데이터베이스를 정의하고 만들고 관리하는 소프트웨어 시스템이다.meta..
2024.02.04
no image
유튜브 영상과 논문을 요약해주는 AI, Lilys AI (블로그 글도 써줌 ㄷㄷ;)
Lilys AI https://lilys.ai/home 유용한 AI 사이트를 발견해서 작성합니다. Lilys AI인데, 유튜브 영상, PDF를 분석하여 요악 노트를 작성해주거나, 블로그로 작성해주는 기능도 수행합니다. 저는 아래 '쉬운코딩' 채널의 동영상 하나를 넣어보겠습니다. https://www.youtube.com/watch?v=aL0XXc1yGPs&list=PLcXyemr8ZeoREWGhhZi5FZs6cvymjIBVe&index=1 아래와 같이 요약을 해주는데요 ! 동영상의 소리를 분석하여 타임스탬프 별 요악 노트, 스크립트, 블로그 글, 심지어 동영상 내용의 관한 대화까지 가능합니다. 어 잠깐 영상 캡처는 저작권의 이슈가 있지 않나..? https://www.a-ha.io/questions/47..
2024.02.04
[String] [한양대 HCPC 2023] X marks the Spot Java 풀이 ( + 시간 초과 해결)
https://softeer.ai/practice/7703 Softeer - 현대자동차그룹 SW인재확보플랫폼 softeer.ai 문제 풀이법 'X' 또는 'x'의 위치는 유일하므로 for 문 순회하면서 문자를 찾음(charAt() 사용), 찾으면 break Character.toUpperCase()를 사용하여 소문자를 대문자 변경 시간 초과 해결 처음엔 answer 라는 스트링에 + 연산으로 문자들 하나씩 이어 붙이고, System.out.println()으로 출력을 했는데 3초 이상의 시간이 걸리길래.. BufferedWriter를 사용했더니 0.xxx 초 대로 빨라졌다. 코드 import java.io.*; import java.util.*; public class Main { public stati..
2024.02.01
[Array] Softeer(소프티어) level 3 우물 안 개구리 Java 풀이
https://softeer.ai/practice/6289 Softeer - 현대자동차그룹 SW인재확보플랫폼 softeer.ai 문제 풀이법 무게들을 저장하는 int 배열과, 사람 수 크기의 boolean 배열 생성(그리고 모두 true로 초기화) A > B면 boolean 배열에 B 인덱스를 false A == B면 boolean 배열에 A, B 인덱스를 false A < B면 boolean 배열에 A 인덱스를 false 즉, 한 번이라도 친구들끼리 무게에서 지거나 비겼으면 false로 바꿈 마지막으로 boolean 배열에 true의 개수를 리턴 코드 import java.io.*; import java.util.*; public class Main { public static void main(Str..
2024.01.31
팀 버너스리, 이미지 출처: https://lh3.googleusercontent.com/ci/AE9Axz9nyaIVnTPphSbM-re5mM2cwLqI0fAT_L7DGfm_MNkuFpS4AvoNcwk23Kre-8ss0mlBUetkXxs=s1200

1989년 CERN 연구소에서 팀 버너스리가 발명한 인터넷상 정보시스템: WWW

  • World Wide Web은 인터넷상에서 정보를 링크를 통해 효율적으로 접근할 수 있는 인터넷 상의 정보시스템이며, 팀 버너스리가 CERN 연구소에서 1989년 발명했고, WWW, W3라고 줄여 부른다.
  • CERN은 유럽 입자물리 연구소로, 유럽을 기반으로 한 입자물리학 연구소이며, 가장 큰 실험 장치인 입자가속기 길이는 27km이다.
  • 웹 발명자인 팀 버너스리는 1955년 6월 8일에 태어나 1976년에 옥스포드 학위를 받은 후, 2차례로 CERN에서 근무한 인물이다.
  • 웹에 필요한 프로토콜중 하나인 HTTP와 웹 발명의 연결은 차후에 발명된 것이라 직접적인 관련은 없으나, 웹 발명과 함께 발전했다는 공통점이 있다.

CERN에서 발명된 World Wide Web의 특징과 시스템

  • CERN은 분산 연구 환경을 가지며, 유럽 12개국이 참여하는 연구소이다.
  • CERN은 합의에 의해 자율적인 협업 문화를 가진 연구소이다.
  • CERN 내에서 각 연구자는 자신이 익숙한 시스템을 사용하여 연구를 진행한다.
  • CERN 연구소 내에는 다양한 시스템이 존재하며, 계층 구조의 시스템이 흔히 사용된다.
  • 트리 구조로 정보를 저장하는 시스템인 유닉스 파일 시스템과 다른 시스템들이 사용되었다.

CERN 연구소에서 사용하는 계층 구조 시스템은 정보 접근에 있어 비효율적이었다.

이해를 돕기 위한 트리 구조 예시, 이미지 출처: https://media.geeksforgeeks.org/wp-content/uploads/111-11.png
  • 위와 같은 계층 구조 시스템은 정보를 찾을 때 루트 디렉토리에서부터 하나씩 찾아나가는 구조로, 정보에 대한 연관성을 제약한다.
  • 따라서, 저장 방식에서 연관성을 기반으로 하는 정보 접근이 중요하며, 이에 대한 연구를 진행하고 있었다.
  • 좋은 구조는 연관성 기반의 접근을 가능하게 하는 구조이다. 
    (e.g. 이 프로젝트와 관련된 실험은? 관련있는 연구자는?)

CERN의 링크 기반 프로그램 개발의 시작

이해를 돕기 위한 링크 기반 구조 이미지, 이미지 출처:&nbsp;https://cms.boardmix.com/images/articles/network-structure.png
  • 하이퍼 텍스트 개념은 이미 당시에 있었지만, CERN은 모르고 있었음. (하이퍼 텍스트란, 참조를 통해 독자가 한 문서에서 다른 문서로 즉시 접근할 수 있는 텍스트)
  • CERN은 Enquire라는 링크 기반 프로그램을 개발하여 편리하게 정보를 관리했다
  • 프로그램은 문서 간 링크로 정보 표현, 타입에 따라 연결되는 관계 설정했다.
  • 또한 CERN은 RPC 프로그램 개발을 통해 네트워크를 통한 로직 실행 경험을 쌓았다.
  • 이 경험이 나중에 월드 와이드 웹 개발에 중요한 역할을 했다.

시스템 구조에 불편함을 느낀 팀 버너스 리의 Enquire 프로그램 사용 경험

  • 팀 버너스 리는 CERN에 속해있는 부서에서 계층적인 시스템의 불편함을 느끼고, 옛날에 사용한 Enquire 프로그램을 활용하기로 결정한다.
  • 다만, 새로운 부서에서는 다른 시스템을 사용하고 있어 Enquire를 그 시스템에 맞춰 버전 업해야 했다.
  • Enquire는 개인 편의를 위한 소프트웨어로, 다른 동료들도 사용할만큼 친절한 것은 아니었으나, 일부 동료는 이 프로그램을 가져다 사용했다.
  • 하지만 팀 버너스 리는 Enquire로는 부족하다고 느껴, 다양한 시스템에 맞는 버전을 개발해야 했고, 다른 시스템과의 문서 연결이 되지 않는 단점도 있었다.
  • CERN 내에서 다양한 부서들이 정보 접근의 어려움과 비효율성을 겪는 상황을 공유하고, 이 문제를 해결하고자 한다.

Enquire로는 맞지 않아, CERN의 연구 상황을 고려한 통합 정보 시스템 필요

  • Enquire의 현재 상황에서는 맞지 않아 "새로운 시스템"을 필요하게 된다.
  • 이에, 하이퍼 텍스트(Hypertext) 시스템 개발 필요성을 인식하게 되었고, 다른 그림과 영상 등 여러 정보가 하이퍼미디어로 연결될 수 있도록 개발하고자 한다.
  • CERN 연구 상황을 고려한 통합 정보 시스템 필요성까지 인식하게 되었다.
  • 12개국에서 참여한 연구소이기 때문에, 네트워크를 통해 원격 접근할 수 있는 시스템을 고려하였다.
이미지 출처: https://assets.editorial.aetnd.com/uploads/2016/08/the-worlds-first-web-sites-featured-photo.jpg

하이퍼텍스트(Hypertext) 기반 시스템, 분산된 하이퍼 텍스트 시스템 'World Wide Web'의 출현

  • CERN 에서는 원격 접근이 가능하고, 다양한 시스템에서 동일한 정보에 접근 가능해야 하며, 중앙 통제 또는 조정 없이도 연결이 가능해야 했다.
  • 이에 대한 해결책으로 하이퍼텍스트 기반 시스템 개발이 제안되며, 통합된 정보 시스템의 필요성을 느꼈다.
  • 이로 인해, 분산되어 있는 데이터 접근 문제를 찾은 끝에, 분산된 하이퍼 텍스트 시스템 'World Wide Web'이 개발되었다.
  • 'World Wide Web'의 제안서는 1989년 3월에 제출되었다.

클라이언트 서버 모델의 적합성과 하이퍼텍스트 서버의 필요성

  • 하이퍼텍스트 시스템을 구현하기 위해 클라이언트-서버 모델이 적합하다고 판단했다.
  • 이는 네트워크에서 정보를 저장하는 소프트웨어와 보여주는 소프트웨어 간 구분을 위해 고안되었다.
  • 글로벌 CERN 스타일과 같이 자율성이 보장되는 업무에서도 각자의 필요에 맞게 연구를 할 수 있도록 클라이언트 서버 모델이 적합하다고 생각했다.
  • 또한 기존 데이터에도 접근 가능하도록 하이퍼텍스트 서버를 만들어 제공할 필요성이 있다고 설명되었다.

초기 클라이언트와 서버 간의 통신에 대한 모호함

  • 제안서에서 이 인터페이스가 어떻게 동작하는지, 데이터를 주고 받는 방식에 대한 구체적인 설명이 부족하다.
  • 서로 다른 시스템에 있는 정보들을 연결할 때, 링크가 어떻게 동작할 것인지에 대한정의도 모호하다.
  • 상사의 코멘트 역시 '흥미진진하지만 모호하다'는 반응을 보여주며, 이에 대한 경영진의 회신은 없었다.

팀 버너스 리, 인터넷과 하이퍼 텍스트를 결합한 프로토콜 개발 아이디어 제안

  • 1988~89년, TCP/IP를 이용해 인터넷이 CERN에 연결됨.
  • 인터넷의 장점으로 분산된 하이퍼 텍스트 시스템을 개발하는 것이 가능하다는 생각을 하게 됨.
  • 클라이언트-서버 아키텍처를 구체화시키며 프로토콜을 정의하기 시작하고, 유럽 하이퍼텍스트 관련 커뮤니티에도 소개함.
  • 하지만 지원을 받지 못하자 팀 버너스 리가 포기하지 않고 아이디어를 구체화해, 1990년 11월 더 구체화된 제안서를 작성함.
  • 이것이 HTTP, HTML, URL 등으로 연결되면서 World Wide Web의 탄생을 이끈 프로토콜의 시작이었다.

1989년, 'World Wide Web' 개념 제안서의 구체화된 내용

  • 개념 제안서에서 'World Wide Web'이라는 용어가 등장하지 않았음. 그러나 웹은 인터넷과 결합한 분산된 하이퍼텍스트 시스템이며, 글로벌 네트워크로 정보를 링크 기반으로 연결할 수 있는 것을 목적으로 함.
  • 제안서에서는 하이퍼텍스트 페이지를 받아오고, 그 안에서 다른 링크를 클릭하면 새로운 하이퍼텍스트 페이지가 나타나는 하이퍼텍스트 링크에 대해 설명하고 있다.
  • 클라이언트 서버 아키텍처에 대한 구체적인 설명도 포함되어 있음.
  • 초기에는 'World Wide Web Map' 등의 명칭을 사용하다가, 이후 'World Wide Web'으로 불리게 됨.

월드 와이드 웹의 구조와 개발 과정

  • 웹은 클라이언트와 서버 간의 상호작용을 통해 동작한다.
  • 클라이언트에서는 브라우저를 통해 서버에 요청을 보내고, 서버는 요청에 따라 하이퍼텍스트 페이지를 보내준다.
  • 페이지에서 링크를 클릭하면, 해당 스트링을 분석해 어떤 서버로 요청을 보내야 하는지 알 수 있다.
  • 월드 와이드 웹의 프로토타입은 1990년 12월에 완성되었으며, 이를 통해 웹 브라우저, 웹 서버, 웹사이트 등이 개발되었다.
  • 최초의 브라우저 : WorldWideWeb
  • 최초의 서버: CERN httpd
  • 최초의 웹사이트: http://info.cern.ch

팀 버너스리는 HTTP, HTML, URL 등을 개발하는 등 최초의 웹 시스템을 구축함.

  • HyperText가 어떻게 구성되어야 하는지 정의하는 HTML(hypertext markup language) 개발
  • HTML 문서을 전달하기 위한 프로토콜을 위해 HTTP(hypertext transfer protocol)를 개발
  • 또한, 유니버셜 도큐먼트 ID(UDI, 오늘날의 URL)를 개발하여 링크가 어디로 가야하는지를 특정하는데 사용되었다.

월드 와이드 웹이 발표

  • 1990년 12월, 월드와이드 웹 프로토타입 생성 후 지속적으로 발전시키는 과정을 거치면서 이제 실물이 눈에 잡히니까 사람들이 관심을 갖게 되고, 1991년에는 처음으로 외부에 공개함.
  • 웹이 성장하면서 이제는 CERN과 함께 협업하는 기관들 위주로 사용이 시작됨.
  • 그리고 1993년 4월 30일, 월드와이드 웹 무료 공개를 발표. 소스 코드 라이선스도 무료로 공개
  • 이것을 트리거로 웹이 폭발적으로 확산되고, 1994년에는 이미 많은 곳에서 웹을 사용
  • http 프로토콜도 계속 성장하면서 현재까지 이어진다.

인터넷과 월드와이드웹, 그리고 HTTP 프로토콜의 개념과 관계

  • 인터넷은 글로벌한 네트워크이며, 월드와이드 웹은 이를 효율적으로 사용하기 위한 인터넷 상 전 지구적 정보 시스템이다.
  • 월드와이드 웹은 소프트웨어에 가깝고, HTTP 프로토콜은 웹을 토대로 만들어진 프로토콜로 하이퍼 텍스트나 미디어 정보를 전달하는데 사용된다.
  • HTTP 프로토콜은 지금은 API를 이용해 json 데이터를 반환하는 용도로도 사용되나, 기본적으로는 하이퍼 텍스트나 미디어 데이터를 전달하기 위한 것이다.

참고 자료

https://youtu.be/1JjUYaoxJ9Y?si=k37-xnkR7AoCoJH6

 

이미지 출처:&nbsp;https://media.geeksforgeeks.org/wp-content/uploads/20230406152358/CN-(1).jpg

IP, 공유기

  • IP주소는 인터넷에 연결되기 위해 인터넷 상의 주소.
  • IP주소 할당이 필요하며, 모뎀과 홈 라우터로 이루어짐.
  • 인터넷에 연결하기 위해서는 IP 주소 할당이 필요하다.
  • 인터넷 케이블에 모뎀 연결 후, 공유기를 통해 여러 기기들이 인터넷에 연결된다.
  • 공유기 (home router)는 다수의 기기들이 인터넷을 사용할 수 있도록 해주는 장치로, 한 IP주소에서 다수의 기기들이 인터넷을 사용이 가능해진다.
  • 각 기기는 공유기를 통해서 서로 네트워크 통신이 가능해지며, 일부 기기는 유선망으로 연결, 일부 기기는 와이파이를 통해 무선 연결이 가능하다.

우리는 스마트 TV, 스마트폰, 프린터, 컴퓨터 등을 공유기를 통해 연결하여 '네트워크'를 형성함

  • 네트워크 통신을 통해 스마트 TV로 저장된 영화를 불러올 수 있으며, 스마트폰에 저장된 영상도 스마트 TV에서 볼 수 있다.
  • 프린터를 네트워크에 연결하여 컴퓨터나 스마트폰에 저장된 문서를 출력할 수 있다.
  • 스위치( = Hub)를 사용하여 인터넷에 연결할 컴퓨터를 추가로 설치한 경우, 스위치와 공유기를 랜선으로 연결하고 컴퓨터들을 스위치에 연결하여 네트워크를 확장할 수 있다.

네트워크와 'Local Area Network(LAN)'의 개념

  • 네트워크란, 컴퓨터나 기타 기기들이 리소스를 공유하거나 데이터를 주고받기 위해 유선 또는 무선으로 연결되는 것
  • 네트워크는 집, 학교, 회사, 데이터 센터 등에서 구축 가능. 제한된 범위 내에서 컴퓨터와 기기를 연결하여 데이터와 리소스를 공유하는 'Local Area Network(LAN)'으로 줄여서 'LAN'이라고 함.
  • 'Local Area Network(LAN)'은 'Ethernet'과 'Wireless LAN(와이파이)' 이렇게 두 가지 기술로 구성됨.
  • 'Ethernet'은 유선 통신을, 'Wireless LAN(와이파이)'은 무선 통신을 담당하는 기술.
  • 'WIFI'는 Local Area Network 에서 무선 통신을 담당하는 기술의 이름.

네트워크 종류: LAN, WAN

  • 네트워크에는 Local Area Network(LAN)와 Wide Area Network(WAN)가 있다.
  • WAN은 여러 LAN이나 다른 종류의 네트워크들을 하나로 묶어서 멀리 떨어진 기기들도 통신이 가능하도록 만든 네트워크이다.
    예를 들어, 은행의 ATM, wireless WAN(4G, 5G), Internet.

인터넷이란?

  • 인터넷은 네트워크들의 네트워크로, 전 세계를 커버하는 가장 큰 WAN이다.
  • 인터넷에 연결하기 위해서는 Internet Service Provider(ISP)가 필요하며, KT, SK브로드밴드, LG유플러스 같은 기업이 이를 제공한다.
  • ISP를 통해 다른 컴퓨터와의 통신이 가능하다.

ISP 네트워크 구성과 계층화

  • 인터넷 바디와 코어 부분은 각각의 ISP들이 관리하는 네트워크로 연결되어 있다.
  • 따라서 가입한 ISP가 다르더라도, 여러 ISP들 끼리 통신을 하여 목적지로 연결된다.
  • 각 ISP에는 Tier 라는 역할과 규모에 따라 등급이 매겨져 있다.
이미지 출처:&nbsp;https://www.researchgate.net/figure/Multi-level-inter-ISP-system-infrastructure_fig1_349654998
Tier 1 
  • Tier 1 네트워크는 국제적인 범위를 가지며, 모든 네트워크에 접근 가능하다.
  • 인터넷 백본으로서 중추 역할을 하며, 인터넷의 모든 네트워크가 연결될 수 있도록 한다.
  • Tier 1 ISP는 사용자나 기업에게 직접 인터넷 서비스를 제공하지 않고, 인터넷을 커버하기 위한 핵심 역할을 한다.
  • Tier 1 네트워크 간에 데이터를 주고 받을 때는 트래픽 전송 비용을 지불하지 않는다.
Tier 2
  • Tier 2는 국가 혹은 넓은 지역을 커버하는 네트워크(KT, sk브로드밴드, LG 유플러스 등)를 보유하고 있다.
  • Tier1 없이 Tier2 네트워크끼리 서로 연결되어 데이터를 주고 받을 수 있으며, 거대한 Tier1 ISP를 통해 데이터를 전송해야 하는 경우가 있다.
  • Tier2는 Tier 1의 비용을 내고 이에 연결되어 전 세계적으로 연결된 인터넷 전체와 연결되는 역할을 한다. 망중립성과 관련된 이슈가 된 적도 있다.
Tier 3 
  • Tier 3는 작은 지역을 대상으로 인터넷 연결 서비스를 제공한다.
  • 일부엔 자체 네트워크가 없으며, 상위 ISP로부터 인터넷 트래픽을 구매한 후, 일반 사용자나 기업에게 인터넷 서비스를 제공한다.
  • 라우터를 이용해 서로 다른 ISP의 가입자가 인터넷 연결되며, 이 라우터는 목적하는 네트워크에 데이터를 보낸다.
  • 미국과 같이 넓은 지역에서는 Tier 3 ISP가 많이 존재한다.

라우터의 역할 및 데이터 이동 과정

  • 데이터를 보낼 때, 데이터는 회사가 가입한 ISP에 있던 라우터를 거친 후 다른 네트워크로 오고, 다시 라우터를 통해 전송된다.
  • 라우터는 데이터가 가고자 하는 목적지 IP 주소를 보고, 연결된 다른 네트워크로 목적지 IP 주소를 찾아 이동시킨다.
  • 라우터는 데이터를 받고 목적지로 데이터를 전송하는 장치이다.
  • 인터넷은 ISP 라우터를 거쳐, 데이터가 여러 네트워크를 지나 최종 목적지 서버로 도달한다.
  • 예를 들어, 내 컴퓨터에서 어떤 서버로 데이터를 보내고 싶다면
    내가 가입한 ISP의 라우터로 데이터를 보내고 -> 내부적으로 또 다른 ISP 라우터에 네트워크로 전달하고 -> 최종적으로 서버에 도차감.
  • 즉 여러 라우터를 지나고, 여러 ISP들이 관리하는 네트워크를 통과하게 된다.

컴퓨터 네트워크에서 사용되는 몇 가지 용어 정리

  • 네트워크를 이루는 각기 다른 장치들을 '노드'라고 부른다. 이때 컴퓨터, 공유기, 스위치, 모뎀, 라우터 등 모든 장치를 포함한다.
  • 노드 중에서 네트워크의 끝에 있는 도달 노드를 '엔드 시스템'이나 '호스트'라고 부르며, 엔드 시스템은 일반 사용자들이 사용할 수 있는 애플리케이션을 호스트한다.
  • 라우터나 스위치와 같은 노드들은 네트워크 자체를 구축하기 위해 사용되는 반면, 엔드 시스템은 일반 사용자들에게 네트워크에 기반한 서비스를 제공하기 위해 사용된다.
  • 클라이언트는 다른 호스트의 데이터나 리소스를 요청하는 호스트를 의미하며, 유튜브 영상 등의 데이터를 요청할 때 사용된다.
  • 서버는 다른 호스트에게 데이터나 리소스를 제공하는 역할을 한다.
  • 서버와 클라이언트는 요청과 응답으로 상호작용하며, 이를 이용하여 데이터를 주고받는 엔드 시스템으로 이루어져 있다.

참고 자료

https://youtu.be/oFKYzp6gGfc?si=eyEYsn3Kj-aqpePt

 

데이터베이스 설계를 위한 functional dependency (함수 종속) 개관

  • functional dependency란, 테이블에 있는 어트리뷰트 집합 사이의 제약을 의미하며, 이를 통해 데이터베이스 설계의 기본이 된다.
  • 집합 X와 Y를 나눈 후, X의 값이 같으면 Y의 값도 같다는 걸 알 수 있으며, 이 경우 X가 Y를 함수적으로 결정한다.
  • 이 경우 functional dependency(FD)라 부르며 Symbol로는 X -> Y와 같이 표현할 수 있다.
  • 테이블의 스키마를 보고 FD를 파악할 수 있지만, 테이블의 State를 보고 FD를 파악하면 안 된다.
이미지 출처:&nbsp;https://medium.com/techprodezza/functional-dependency-in-dbms-1708f5cd79ab

위 테이블에서, 집합 X를 {Student_ID}, 집합 Y를 {Student_Name, Stream}라 했을때 집합 X인 Student_ID가 같으면 집합 Y의 값들도 모두 같다 (위에선 Student_ID가 1일 때). 이를 "X가 Y를 함수적으로 결정한다" 또는 "Y가 X에 함수적으로 의존한다"라고 표현한다. 그리고 이러한 관계를 functional dependency(FD)라고 부른다.

함수 종속성을 파악하기 위해서는 테이블의 스키마로부터 의미적으로 관계와 결합을 이해해야 한다.

  • 테이블에서 일부 데이터 관찰로 함수 종속성이 있다고 판단하면 안되며, 각 속성에 대한 의미적 관계를 파악해야 한다.
  • 예를 들어, 이름을 저장하는 name과 그 사람의 생일인 birth_date에 대해 일대일로 매칭되더라도, 이름이 생일을 결정할 수 없으며 동명이인이 있을 가능성이 있으므로 함수 종속성이 없으며, 따라서 가능한 모든 데이터를 파악해야 한다.
  • 함수 종속성을 파악하기 위해서는 서로 다른 속성 간의 관계를 의미적으로 이해해야 하며, 모든 데이터를 파악한 후에 판단해야 한다.

데이터베이스에서 기능 종속성과 관련한 예시들

  • 회사의 정책이 임직원이 한 부서에만 속해야 한다면, 그 부서에 속한 사람이 결정을 적용할 수 있다.
  • 하지만 회사의 정책이 임직원이 여러 부서에 속할 수 있다면, 그 경우에는 임직원이 결정을 적용하지 못한다.
  • 부서 DB에서 FD을 설명하는데, 이것은 의미적 이해가 중요하다.
  • 자료 구축시, 어트리뷰트가 관계적으로 어떤 의미를 지니는지에 따라서 기능 종속성이 달라질 수 있다.
  • 어트리뷰트가 함께 있을 때, 그 어트리뷰트를 통해 정보를 결정할 수 있다.

Functional Dependency(FD)의 5가지 예시와 특징

  • Functional Dependency는 여러 액트리뷰트가 함께 있을 때만 정보를 특정할 수 있는 것이다.
  • Functional Dependency의 예시로는 위치기반 SNS가 있다. 이 경우 사용자의 아이디, 방문 위치, 방문 날짜가 같은 집합에 속해야만 댓글, 사진 URL 등을 특정할 수 있다.
  • Functional Dependency가 존재하더라도 그 역이 항상 참일 수 없다.
    예를 들어, Employee ID가 있을 때 Employee의 name을 결정할 수 있지만, Employee name에 따라 Employee ID를 결정할 수는 없다.
  • 경우에 따라서는 애트리뷰트의 공집합으로 Functional Dependency를 표현할 수 있다. 예를 들어, 특정 액트리뷰트가 없는 경우 Y 집합을 결정하는데, 이는 항상 단 하나의 값을 갖는다.
  • Functional Dependency는 특정 액트리뷰트에 따라 값이 변하는 것이 아니라 항상 동일한 값을 가지는 경우에도 표현 가능하다.

Trivial Functional Dependency

  • 정규화에서 Second normal 폼에서 다루는 Functional dependency의 종류 중 하나인 Trivial functional dependency가 있음.
  • Trivial functional dependency는 y가 x의 부분집합일 때, x가 y를 결정하는 function을 dependency로 갖는 경우를 말함.
  • 예를 들어, 에트리뷰트 {a,b,c} 로 이루어진 집합이 {a,c}를 결정하게 되면, 이때 이 functional dependency는 Trivial functional dependency를 갖는다.
  • Trivial functional dependency는 왼쪽이 오른쪽의 부분집합이며, 동일한 경우도 포함된다.

Non-trivial functional dependency

  • Non-trivial functional dependency는 왼쪽이 오른쪽의 부분집합이 아닌 경우다.
  • 예를 들어, {a, b, c} -> {b, c, d}의 경우 d는 왼쪽의 부분집합이 아니므로 Non-trivial 이다.

Partial functional dependency

  • Partial Functional Dependency는 왼쪽의 proper subset이 오른쪽을 결정 짓는 경우다.
  • 여기서 Proper Subset은 집합에서 최소한 하나의 attribute를 제거한 집합을 의미한다.
    예를 들어, A= {a, b, c}에 대해 B = {a, b, c}라는 집합은 제거된 요소가 없으므로 B는 A의 Proper subset이 아니다.
  • Partial functional dependency의 예시로, Employee ID와 Employee name이 일치하는 경우 같은 birth_date을 지닌다는 정보를 얻게 된다. 그리고 Employee ID만으로도 생일을 결정지을 수 있다. 따라서, {Employee_ID, Employee_name} 집합에서 name을 제거하더라도 {birth_date}를 특정지을 수 있으므로 이는 Partial functional dependency이다.

Full functional dependency

  • 함수적 디펜던시가 전부 결정적인 경우, 즉 프로퍼티 전부가 값을 결정하면 full functional dependency라고 한다.
  • 예를 들어, {student ID, class ID} -> {grade} 일 때, student ID 또는 class ID만으로는 grade을 고유하게 결정할 수 없다.
    따라서 둘 다 같은 집합에 속해야만 grade의 집합을 결정할 수 있으므로 full fucntioanl dependency이다.
  • Full functional dependent의 반대로, 특정 프로퍼티 서브셋을 제거해도 여전히 종속성이 유효하다면 partial functional dependency라고 한다.
  • 이 functional dependence 개념은 데이터베이스 정규화에서 사용된다.

참고 자료

https://youtu.be/fw8hvolebLw?si=NXNgxlEgNi9L-ePy

https://medium.com/techprodezza/functional-dependency-in-dbms-1708f5cd79ab

 

Functional Dependency in DBMS

What is your identity now?

medium.com

 

Transaction

  • Transaction 은 여러 SQL문들을 논리적 단위로 묶어 하나의 작업 단위로 처리하는 것이다.
  • Transaction 내의 SQL문 중 일부만 성공한 경우에도 DB에 반영되지 않고 모두 성공해야만 DB에 반영된다.
  • 예를 들어, J가 H에게 20만원을 이체할 때, 계좌 변동은 J의 계좌에서 20만원이 제거되고, H의 계좌에 20만원이 추가되어 최종적으로 J는 80만원, H는 220만원이 된다.
  • 이러한 계좌 변동 내용은 SQL 문으로 표현할 때 Balance 테이블을 업데이트하여 잔액을 반영하는 방식으로 처리한다.
  • 하나의 Transaction 내에서 SQL문이 실패하면 이전 상태로 되돌린다. 따라서 중복작업을 방지할 수 있으며 데이터 일관성을 유지할 수 있다.
  • 아래는 Transaction이 처리되는 과정이다.
이미지 출처:&nbsp;https://media.geeksforgeeks.org/wp-content/uploads/20230915172115/Transaction-in-dbms.png

Commit

  • 지금까지 작업한 내용을 DB에 영구적으로 저장하는 것
  • Transaction을 종료한다.

RollBack

  • 지금까지 작업들을 모두 취소하고 Transaction 이전 상태로 되돌리는 것
  • Transaction을 종료한다.

AutoCommit

  • 각각의 SQL문을 자동으로 Transaction 처리 해주는 개념
  • MySQL에서는 AutoCommit이 활성화되어 있으며, 다른 DBMS에서도 대부분 이 기능을 제공한다.
  • 활성화 되어있지 않다면 START TRANSACTION; 을 입력하고 COMMIT; 해야함.
  • 현재 AutoCommit이 활성화 되어 있는지 확인하는 쿼리문을 작성해 이를 통해 AutoCommit이 켜져있음을 확인함.
  • AutoCommit이 켜져있는 상태에서 Insert 문을 실행시키면 자동으로 Commit이 되도록 설정되어 있음.
  • AutoCommit을 비활성화 시키면 수행한 작업에 대한 Commit이 자동으로 이루어지지 않기 때문에, 나중에 직접 Commit을 수행해야 함을 알게됨.
  • 이를 통해 MySQL에서 AutoCommit의 동작 원리와 가능성에 대해 학습할 수 있음.
  • 트랜잭션을 실행하면 AutoCommit이 비활성화되며 RollBack이나 Commit 명령어로 따로 처리해야 커밋이 됨.
  • 트랜잭션 실행 이전의 AutoCommit 상태는 트랜잭션이 종료되면 다시 복원됨.
  • 테이블 업데이트 시 트랜잭션 수행 전에 이미 활성화된 AutoCommit은 트랜잭션이 끝나도 비활성화 상태로 유지됨.
  • MySQL은 기본적으로 AutoCommit이 활성화된 상태로 시작하지만, Oracle은 AutoCommit이 비활성화된 상태로 시작하므로,
    각 RDBMS의 문서를 확인하여 AutoCommit 설정이 어떻게 되어 있는지 확인하는 것이 중요

참고 자료

https://www.youtube.com/watch?v=sLJ8ypeHGlM&list=PLcXyemr8ZeoREWGhhZi5FZs6cvymjIBVe&index=14

 

️데이터베이스와 DBMS에 대한 기본 개념 이해

  • 데이터베이스는 전자적으로 저장되고 사용되는 관련있는 데이터의 집합으로, 예를 들면 소셜네트워크 서비스에서 생성되는 데이터들을 말한다.
  • 데이터베이스는 관련있는 데이터들을 조직화된 집합으로 묶어야 한다.
  • 검색 및 사용의 효율성을 위해 데이터베이스는 잘 조직화되어야 하며, 중복된 데이터와 데이터의 불일치를 방지할 수 있다.
  • DBMS는 사용자에게 데이터베이스를 정의, 생성 및 관리할 수 있는 기능을 제공하는 소프트웨어 시스템이다.
  • DBMS의 대표적인 종류에는 Postgre SQL, MySQL, Oracle, SQL Server 등이 있다.

DBMS, metadata, 데이터베이스 시스템 

  • DBMS는 사용자가 데이터베이스를 정의하고 만들고 관리하는 소프트웨어 시스템이다.
  • metadata는 데이터베이스 내 추가적인 데이터를 의미하며, 데이터를 설명하기 위한 데이터로 구성된다.
  • metadata는 데이터 유형, 구조, 제약 조건, 보안, 저장, 인덱스, 사용자 그룹 등등이 있다.
  • metadata 또한 DBMS를 통해 저장/관리된다.
  • 데이터베이스 시스템은 데이터베이스, DBMS, 연관된 어플리케이션을 포함한 데이터 관리 시스템으로, 문맥에 따라 데이터베이스 또는 데이터베이스 시스템으로 불리울 수 있다.
이미지 출처: https://jgtonys.github.io/public/img/school/database/1.PNG
  • 데이터베이스 시스템은 사용자와 프로그래머로 구성되며, 데이터베이스의 조회 및 수정을 위한 퀄리티(조건)가 필요하다.
  • 프로그램이 퀄리티를 전달하면, 데이터베이스 매니지먼트 시스템이 분석하고 처리하며, 요청된 데이터의 부가적인 정보 및 데이터 자체를 통해 필요한 데이터를 찾아 반환해준다.

Data Models

  • 데이터 모델이란 데이터베이스의 구조를 추상화하여 표현하는 수단이며, 모델링으로 이해할 수 있다. 데이터 모델에는 여러 종류가 있으며, 데이터베이스의 추상화 수준과 구조화 방식에 따라 다르다.
  • 데이터 모델에는 카테고리별로 Conceptual, Logical, Physical 종류가 있으며, DB구조는 데이터의 타입과 다른 데이터들과의 관계, 그리고 데이터들의 제약에 대한 개념을 포함한다.
  • Conceptual: 일반 사용자들이 쉽게 이해할 수 있는 개념들로 이뤄진 모델
    EX) entity-relationship model -> 책과 학생의 관계
  • Logical: 컴퓨터에 저장될 때 구조와 크게 다르지 않게 DB를 구조화, 디테일 하게 DB를 구조화하는 개념들을 제공
    (어느정도 추상화는 되어있음)
    EX) relational data model -> Student 테이블 
    주요 데이터베이스 관리 시스템인 Oracle, MySQL, MS SQL은 모두 Relational 데이터 모델을 기반으로 하며, PostgreSQL은 Object Relational Data 모델을 기반으로 한다.
  • Physical:실제로 컴퓨터에 저장되는 데이터의 포맷, 데이터의 순서, 인덱스 등을 모델링 하는 방법을 제공합니다.

Database Schema

  • 데이터베이스 스키마는 데이터 모델을 기반으로 데이터베이스의 구조를 모델링하여 기술한 것으로, 전체 데이터베이스의 구조를 이해하는 데 도움이 된다.
  • 스키마는 데이터베이스 설계 시 주로 정해지고 이후에는 자주 바뀌지 않는다.
  • Relational 데이터 모델에서 스키마는 릴레이션에 포함된 속성이나 애트리뷰트들을 통해 데이터베이스의 구조를 모델링한다.

Database State, Three-Schema Architecture

  • 데이터베이스 State는 데이터베이스에 있는 특정 시점의 데이터를 말하며, 데이터는 시간이 지남에 따라 변경될 수 있다.
  • 3스키마 아키텍처는 물리적인 데이터베이스 구조의 변경에도 유저 어플리케이션에 영향을 주지 않고 DB를 관리하는 아키텍처다.
  • 3스키마 아키텍처에는 External 스키마, Conceptual 스키마, Internal 스키마가 있다.
  • 3스키마 아키텍처는 안정적인 데이터베이스 시스템 운영을 위해 독립된 레벨을 유지하며 상위 레벨에 변화를 전파하지 않는다.
  • 예를 들어, Internal 스키마가 바껴도 Conecptual 스키마가 바뀔 필요가 없음
  • Conceptual Schema가 바뀌어도 External 스키마가 바뀔 필요가 없음 (근데 이건 좀 어려움)
  • 오늘날은 따르긴 하지만 명시적으로 나누진 않음, 데이터가 존재하는 곳은 Internal Level.
이미지 출처: https://static.javatpoint.com/dbms/images/dbms-three-schema-architecture.png

Internal Schema, External Schema

  • Internal 스키마는 물리적인 저장장치와 데이터의 실제 저장 구조를 표현하는 스키마다.
  • External 스키마는 사용자가 보는 스키마로, 사용자 뷰 또는 External 뷰로도 불린다.
  • External 스키마는 특정 유저들이 필요로 하는 데이터만 표현하고, 그 외에 필요 없는 데이터는 숨기는 특징이 있다.
  • 이 External 스키마는 Logical 데이터 모델을 통해 표현된다.
  • 하지만 Internal 스키마에서는 각 유저의 데이터 니즈에 맞추어 중복된 데이터를 갖는 여러 스키마가 생기고, 이로 인해 관리가 어려워지고 데이터 불일치가 발생할 수 있다.

Conceptual Schema

  • Conceptual 스키마는 논리적인 데이터베이스 구조를 표현하는 방법.
  • Conceptual 스키마는 데이터베이스 전체 구조를 기술하며, 물리적인 저장 구조는 숨기고 논리적 구조에 초점을 맞춘다.
  • 엔티티, 데이터 타입, 릴레이션쉽과 제약사항을 통해 데이터베이스 구조를 표현한다.
  • Conceptual 스키마는 로지컬 데이터 모델을 통해 표현된다.
  • 3스키마 아키텍처는 안정적인 데이터베이스 시스템 운영을 위해 독립된 레벨을 유지하며 상위 레벨에 변화를 전파하지 않는다.

스키마 언어와 데이터베이스 언어의 종류와 기능

  • 스키마 언어: 인터널, 컨셉츄얼, 익스터널 스키마 각각의 맵핑을 변경하여 안정적인 운영 가능.
  • 데이터베이스 언어: DDL(DTD), SDL, VDL, DML 등으로 컨셉츄얼, 인터널, 익스터널 스키마를 정의 및 활용.
  • DDL(Data Definition Language): Conceptual 스키마 정의에 주로 사용, 추가적으로 Internal 스키마 설정도 가능.
  • SDL(Storage Definition Language): Internal 스키마 정의 언어로, 대부분의 릴레이셔널 DBMS에서 대체되어 파라미터 사용.
  • VDL(View Definition Language): External 스키마 정의 언어, 하지만 대부분의 DBMS에서 DDL이 VDL의 역할까지 커버한다.
  • DML(Data Manipulation Lagnugae): 실제 데이터 활용을 위한 언어로 데이터 추가, 삭제, 수정, 검색 등의 기능을 제공.
  • 오늘날의 DBMS는 DML, VDL, DDL이 따로 존재하기 보다는 통합된 언어로 존재한다.(e.g. SQL)

참고 자료

https://www.youtube.com/playlist?list=PLcXyemr8ZeoREWGhhZi5FZs6cvymjIBVe

Lilys AI 

https://lilys.ai/home

유용한 AI 사이트를 발견해서 작성합니다.

Lilys AI인데, 유튜브 영상, PDF를 분석하여 요악 노트를 작성해주거나, 블로그로 작성해주는 기능도 수행합니다.

 

2024.2.4 기준 현재 지원되는 파일 포맷

 

저는 아래 '쉬운코딩' 채널의 동영상 하나를 넣어보겠습니다.

https://www.youtube.com/watch?v=aL0XXc1yGPs&list=PLcXyemr8ZeoREWGhhZi5FZs6cvymjIBVe&index=1

 

아래와 같이 요약을 해주는데요 !

 

 

동영상의 소리를 분석하여 타임스탬프 별 요악 노트, 스크립트, 블로그 글, 심지어 동영상 내용의 관한 대화까지 가능합니다.

어 잠깐 영상 캡처는 저작권의 이슈가 있지 않나..?

https://www.a-ha.io/questions/47d1a55ad7a46442a803525dc41e75d5

 

인터넷 커뮤니티에 유튜브 내용 캡쳐가 저작권 위반 소지가 있나요?

대형인터넷 커뮤니티에 유튜브 내용을 간추려서 캡쳐해 올린것이 저작권 위반으로 법률적 문제가 있는지 궁금합니다.게시자의 수익성은 당연히 없구요. 하지만 사이트 운영자는 광고노출등으

www.a-ha.io

위 글 외에도 쭉 찾아보면 저작권법 위반의 위험을 무시할 수 없을 것 같습니다. 

유튜브 캡처 화면을 사용하는 블로그 글 작성 기능은 지양하는 것으로...

https://softeer.ai/practice/7703

 

Softeer - 현대자동차그룹 SW인재확보플랫폼

 

softeer.ai

문제 풀이법

  1. 'X' 또는 'x'의 위치는 유일하므로 for 문 순회하면서 문자를 찾음(charAt() 사용), 찾으면 break
  2. Character.toUpperCase()를 사용하여 소문자를 대문자 변경

시간 초과 해결

처음엔 answer 라는 스트링에 + 연산으로 문자들 하나씩 이어 붙이고, System.out.println()으로 출력을 했는데

3초 이상의 시간이 걸리길래..

BufferedWriter를 사용했더니 0.xxx 초 대로 빨라졌다.

 

코드

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

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st = new StringTokenizer(in.readLine());
        
        int numOfCase = Integer.parseInt(st.nextToken());
        for (int i = 0; i < numOfCase; i++) {
            st = new StringTokenizer(in.readLine());
            String text1 = st.nextToken();
            String text2 = st.nextToken();
            for (int j = 0; j < text1.length(); j++) {
                if (text1.charAt(j) == 'X' || text1.charAt(j) == 'x') {
                    bw.write(Character.toUpperCase(text2.charAt(j)));   
                    break;
                }
            }
        }
        bw.flush();
    }
}

https://softeer.ai/practice/6289

 

Softeer - 현대자동차그룹 SW인재확보플랫폼

 

softeer.ai

문제 풀이법

  1. 무게들을 저장하는 int 배열과, 사람 수 크기의 boolean 배열 생성(그리고 모두 true로 초기화)
  2. A > B면 boolean 배열에 B 인덱스를 false
    A == B면 boolean 배열에 A, B 인덱스를 false 
    A < B면 boolean 배열에 A 인덱스를 false
    즉, 한 번이라도 친구들끼리 무게에서 지거나 비겼으면 false로 바꿈
  3. 마지막으로 boolean 배열에 true의 개수를 리턴

코드

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

public class Main {

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

        int numOfWeight = Integer.parseInt(st.nextToken());
        int numOfFriend = Integer.parseInt(st.nextToken());

        int[] arrOfWeight = new int[numOfWeight + 1];
        boolean[] isBest = new boolean[numOfWeight + 1];

        st = new StringTokenizer(in.readLine());
        for (int i = 1; i <= numOfWeight; i++) {
            arrOfWeight[i] = Integer.parseInt(st.nextToken());
            isBest[i] = true;
        }

        for (int j = 1; j <= numOfFriend; j++) {
            st = new StringTokenizer(in.readLine());
            int A = Integer.parseInt(st.nextToken());
            int B = Integer.parseInt(st.nextToken());
            if (arrOfWeight[A] < arrOfWeight[B]) {
                isBest[A] = false;
            } else if (arrOfWeight[A] == arrOfWeight[B]) {
                isBest[A] = false;
                isBest[B] = false;
            } else if (arrOfWeight[A] > arrOfWeight[B]) {
                isBest[B] = false;
            }
        }

        int answer = 0;
        for (boolean best : isBest) {
            if (best) {
               answer++; 
            }
        }
        System.out.println(answer);
    }
}