입력받은 문자열에 a,b가 인덱스 4차이로 존재하는지 여부를 리턴하시오.
public class StringCheck {
public boolean ABCheck(String str) {
boolean A = (str.length() == 5 && str.charAt(0) == 'a' && str.charAt(str.length() - 1) == 'b');
boolean B = (str.length() == 5 && str.charAt(0) == 'b' && str.charAt(str.length() - 1) == 'a');
if (A || B) return true;
else if (str.length()==0) return false;
else{
int aIndex = str.indexOf('a');
int bIndex = str.indexOf('b');
if(aIndex!=-1 && bIndex!=-1) { // a,b둘 다 존재할 경우
if(Math.abs(aIndex-bIndex)==4) return true;
else{
for(int i=0; i<=str.length()-5; i++){
String str2 = str.substring(i,i+5);
boolean AA = (str2.charAt(0) == 'a' && str2.charAt(4) == 'b');
boolean BB = (str2.charAt(0) == 'b' && str2.charAt(4) == 'a');
if(AA||BB) return true;
}
}
}
}
return false;
}
}
//입력
aMAJ7sBrO4CyysuoHFrgGTX
//출력
false
str.indexOf('b')
의 값이 -1이 나와서 false가 출력 됐다.
indexof는 대소문자를 구분해서 발생한 문제다. .toLowerCase()
를 이용해 간단하게 해결 가능
package CodeStatesAlgorithms;
public class StringCheck {
public boolean ABCheck(String str) {
boolean A = (str.length() == 5 && str.charAt(0) == 'a' && str.charAt(str.length() - 1) == 'b');
boolean B = (str.length() == 5 && str.charAt(0) == 'b' && str.charAt(str.length() - 1) == 'a');
if (A || B) return true;
else if (str.length()==0) return false;
else{
int aIndex = str.toLowerCase().indexOf('a');
int bIndex = str.toLowerCase().indexOf('b');
if(aIndex!=-1 && bIndex!=-1) { // a,b둘 다 존재할 경우
if(Math.abs(aIndex-bIndex)==4) return true;
else{
for(int i=0; i<=str.length()-5; i++){
String str2 = str.substring(i,i+5).toLowerCase();
boolean AA = (str2.charAt(0) == 'a' && str2.charAt(4) == 'b');
boolean BB = (str2.charAt(0) == 'b' && str2.charAt(4) == 'a');
if(AA||BB) return true;
}
}
}
}
return false;
}
}
모든 테스트케이스 통과.
시간복잡도를 고려해 반복문을 최대한 사용하지 않기 위해 위와 같이 작성했지만 코드 가독성이 너무 떨어지는 것 같다.
위코드와 같이 입력받는 문자열을 자른 다음에 비교할 것 없이 범위 선택만 해도 아래와 같이 충분히 간단하게 검사가 가능하다.
public boolean ABCheck(String str) {
if(str.length() == 0) {
return false;
}
str = str.toLowerCase();
for(int i = 4; i < str.length(); i++) {
if((str.charAt(i) == 'a' && str.charAt(i - 4) == 'b') || (str.charAt(i) == 'b' && str.charAt(i - 4) == 'a')) {
return true;
}
}
return false;
}
네트워크끼리 연결하는 네트워크
네트워크를 확장하는 방식
인터네트워킹 장점
인터넷에 연결된 컴퓨터들이 서로 소통하기 위한 공통된 약속
TCP(Transmission Control Protocol)
IP(Internet Protocol)
TCP/IP 4계층 모델 | 주요 프로토콜 | 역할 | |
---|---|---|---|
4층 | 응용 계층 | HTTPS, DNS, FTP 등 | 애플리케이션에 맞춰서 통신함 |
3층 | 전송계층 | TCP, UDP 등 | IP와 apk을 중개해 데이터를 전달 |
2층 | 인터넷 계층 | IP, ICMP, ARP, RARP | 네트워크 주소를 기반으로 데이터 전송 |
1층 | 네터워크 접근 계층 | Ethernet, wifi, 등 | 컴퓨터를 물리적으로 네트워크에 연결해서 기기 간에 전송이 가능하게 함 |
주로 IPv4(IP version 4)를 사용
더 많은 양( 2^(128)개)의 주소를 사용할 수 있는 IPv6(IP version 6)도 있음.
각 네트워크 기기에 제조사가 할당하는 고유 시리얼
MAC 주소를 IP 주소와 조합해야만 네트워크를 통한 통신이 가능
(이더넷에서는 네트워크상의 송수신 상대를 특정하고자 MAC 주소를 사용하고, TCP/IP 에서는 IP address를 사용하기 때문)
같은 LAN에 속한 기기들 중 어떤 기기가 통신을 하는지 구분하는 용도라고 생각하면 될 것 같다.
원본 데이터를 작게 나눠 여러 회선을 공용해 통신을 주고 받는 방법
IPv4 기준 OOO.OOO.OOO.OOO
형식
(.
으로 구분된 각 000
이 10진수로 표기되지만 실체는 8자리 2진수다)
(cf. 000
하나를 옥텟이라 부름, IPv4는 4개의 옥텟으로 구성)
IP 주소는 네트워크부와 호스트부로 나뉜다.
서브넷 마스크 = IPv4 주소에서 네트워크부가 어디까지인지 나타내는 것
- 호스트부가 0으로 만 이루어진 것은 네트워크 주소로 그 네트워크를 의미
- 호스트부가 1로만 이루어진 것은 브로드캐스트 주소로 ARP 와 같은 기능을 사용하기 위해 사용
시작(0) 과 끝(255)를 제외한 254개의 주소만이 할당가능한 IP주소다.
이런 한계를 극복하기 위해 TCP,UDP사용
TCP/IP 4계층 모델 | 주요 프로토콜 | 역할 | |
---|---|---|---|
4층 | 응용 계층 | HTTPS, DNS, FTP 등 | 애플리케이션에 맞춰서 통신함 |
3층 | 전송계층 | TCP, UDP 등 | IP와 apk을 중개해 데이터를 전달 |
2층 | 인터넷 계층 | IP, ICMP, ARP, RARP | 네트워크 주소를 기반으로 데이터 전송 |
1층 | 네터워크 접근 계층 | Ethernet, wifi, 등 | 컴퓨터를 물리적으로 네트워크에 연결해서 기기 간에 전송이 가능하게 함 |
TCP와 UDP는 TCP/IP 4계층 모델 기준 IP 프로토콜의 계층인 인터넷 계층과 apk가 동작하는 응용 계층 사이계층에서 동작한다.
(IP와 apk를 중개하는 역할을 함.)
TCP와 UDP 모두 중개하는 역할을 하지만 아래와 같은 특징이 있다.
Transmission control protocol | User datagram protocol | |
---|---|---|
서비스 타입 | 연결 지향적 프로토콜 | 데이타크램 지향적 프로토콜 |
신뢰성 | 데이터 전송 표적 기기까지의 전송을 보장한다. | 표적 기기까지의 전송이 보장되지 않는다. |
순서 보장 | 전송하는 패킷들이 순서가 보장된다. | 패킷 순서 보장이 안된다. (apk 레이어에서 관리하면 순서 보장 가능) |
속도 | UDP에 비해 느림 | TCP에 비해 단순해서 더 빠름 |
TCP와UDP의 특징, 차이점이 더 궁금하면 링크 참조
양 끝단의(end to end) 기기의 신뢰성 있는 데이터 통신을 위해, TCP 방식이 연결을 설정하는 방식
연결방법
TCP 처럼 가상의 회선을 설정해 신뢰성을 보장하면 좋지만
설정단계에서 발생하는 지연 때문에 통화,게임 등의 상황에서 싱크를 맞추기 어려운 문제점이 있어 UDP를 사용한다.
대상 IP 기기의 특정 어플리케이션(connection endpoint)을 특정하는 번호
IP프로토콜만 가지고는 한 IP에서 여러 애플리케이션이 동작할 때 특정 애플리케이션을 특정해 통신할 수 없다.
TCP, UDP 둘 다 포트번호 사용
이미 사용중인 PORT는 중복해서 사용할 수 없다.
PORT번호는 0~ 65,535 까지 사용 가능
서버가 제공되는 환경에 존재하는 파일의 위치를 나타내는 주소
크롬에 file://localhost/C:\Users/username\Desktop\
이 url을 입력하면 아래와 같이 내 파일의 위치가 열린다.
웹사이트의 주소를 IP주소로 작성하면 기억하고 사용하기 어렵기 때문에 IP주소 대신 domain name을 주로 사용한다.
(cf. DNS를 통해 ip주소를 domain name으로 바꿈)
도메인 종류는 아래 두 종류로 나뉜다.
호스트의 도메인 이름을 IP 주소로 변환하거나 반대의 경우를 수행하는 데이터베이스 시스템
(cf.보통 통신사에서 제공해주는 시스템)
웹(WEB) = 인터넷에서 제공되는 하이퍼텍스트 시스템
하이퍼텍스트 = 문서안에 다른 문서의 위치정보 등을 포함하여 문서 간의 정보를 서로 연관 지어 참조 할 수 있는 문서
웹에서 주로 사용하는 클라이언트-서버 구조
데이터베이스가 추가되면 3티어 아키텍쳐라 부름.
클라이언트-서버 간의 연결에 대한 설명 방법
website = 정적 페이지들의 집합체
웹 애플리케이션 = 정보 검색 등 상호작용이 가능한 웹
(요즘 만들어지는 대부분의 사이트 = 웹 어플리케이션)
웹 애플리케이션은 아래 4가지 요소를 고려해야 한다.
Web Application Three Tier Architecture
Cookie 와 Session
서버가 데이터를 렌더링 해서 브라우저로 전송하는 방식
ex) 블로그, 기사,뉴스 페이지
클라이언트에서 Javascript가 페이지를 렌더링하는 방식
ex) 숙박 예약, 항공권 예약 사이트
일반적으로 SSR의 반대라 할 수 있음
서버에서 웹 페이지의 골격(단일 페이지)과 JavaScript 파일을 클라이언트(웹 브라우저)에 보냄
함께 온 JavaScript파일이 완전히 렌더링 된 페이지로 바꿈
데이터베이스에 있는 데이터가 필요할 경우 API를 이용해 데이터를 가져옴
다른경로로 이동시 브라우저가 다시 렌더링