
Java에서 문자열에서 특정 위치의 문자 하나를 꺼내올 때 사용하는 메서드
String s = "hello";
char c = s.charAt(1); // 'e
값이 항상 순서대로 있어야 함
값을 추가 할때만다 적절한 셀에 넣어 배열의 값을 정렬된 상태로 유지함
정렬된 배열에 삽입을 때는 항상 실제 삽입 전에 검색을 먼저 수행해서 삽입할 위치를 정해야함
삽입에 있어 정렬된 배열이 배열보다 덜 효율적임 그러나 정렬된 배열은 검색 연산에 있어 강함
[17,3,75,202,80]이라는 배열이 있다는 가정에 일반 배열에서는 22를 찾기 위해서는 끝까지 다 검색해야함
그러나 정렬된 배열에서는 [3,17,75,80,202] 75에 도달하면 22가 없다는 걸 알기 때문에 검색을 종료함
하지만 이는 선형 검색 알고리즘일 경우의 차이이고 이진검색이라는 알고리즘을 사용시는 훨씬 빠르다
1~100사이의 숫자 맞추기를 한다고 가정했을때 가운데 값을 골라 높은지 낮은지 확인후 절반을 제거함
그걸 반복해서 원하는 숫자를 찾는 알고리즘
1~100사이의 숫자 맞추기를 한다고 가정했을때 가운데 값을 골라 높은지 낮은지 확인후 절반을 제거함
그걸 반복해서 원하는 숫자를 찾는 알고리즘
각 요소가 데이터 + 다음 노드의 주소를 가지고 있는 구조
메모리가 비연속적이고 , 크기가 유동적임
삽입과 삭제가 빠르나 인덱스 접근이 느리고 구현이 복잡함
Transmission Control Protocol
연결을지향하고 신뢰성을 보장한다 순서대로 도착함
데이터 유실없으나재전송해야함속도느림
웹(HTTP),이메일(SMTP),파일정송(FTP)등에서 사용
TCP통신을 시작할때 신뢰성있는 연결을 만들기위해
클라이언트와 서버가 3번의 메세지를 주고받는 과정
클라이언트 -> 서버 SYN(연결요청)
서버-> 클라이언트 SYN+ACK (연결 요청 +수신확인)
클라이언트 -> 서버 ACK (수신확인)
연결 완료
TCP연결을 종료할때 클라이언트와 서버가 4번 메세지를 주고받는 과정
클라이언트 -> 서버 FIN (나가는 신호)
서버 ->클라이언트 ACK (수신확인)
서버 -> 클라이언트 FIN (나가는 신호)
클라이언트 -> 서버 ACK(수신확인)
연결 종료
User Datagram Protocol
비연결을지향하고 신뢰성이 없음 순서가 섞일 수 있음
데이터 유실이 일어날 수 있으나 속도가 빠름
스트리밍, 게임, 실시간 채팅, DNS 등에서 사용
| 메서드 | 설명 | 예시 | 결과 |
|---|---|---|---|
IntStream.range(a, b) | a부터 b-1까지 정수 스트림 생성 | IntStream.range(1, 5) | 1, 2, 3, 4 |
IntStream.rangeClosed(a, b) | a부터 b까지 정수 스트림 생성 | IntStream.rangeClosed(1, 5) | 1, 2, 3, 4, 5 |
Stream.of(val1, val2, ...) | 주어진 값들로 스트림 생성 | Stream.of("A", "B", "C") | "A", "B", "C" |
Arrays.stream(arr) | 배열을 스트림으로 변환 | Arrays.stream(new int[]{1, 2, 3}) | 1, 2, 3 |
IntStream을 일반 Stream로 변환
이유: 리스트로 collect하려면 Integer 객체형이 필요하기 때문
.collect(Collectors.toList()) 남은 인덱스를 리스트로 수집
| 항목 | 기본형 (primitive) | 객체형 (wrapper/object) |
|---|---|---|
| 예시 | int, double, char | Integer, Double, Character |
| 저장 방식 | 값 자체 저장 | 참조(reference) 저장 |
| null 가능 여부 | ❌ 불가능 | ✅ 가능 (null 저장 가능) |
| 메모리 위치 | 스택(Stack) | 힙(Heap) |
| Stream 사용 | ❌ 직접 못 씀 (Stream은 객체 기반) | ✅ 사용 가능 (Stream<Integer>) |
| 컬렉션 저장 | ❌ 불가 (ex. List<int> X) | ✅ 가능 (ex. List<Integer>) |
알파벳으로만 이루어진 단어를 입력받아, 그 길이를 출력하는 프로그램을 작성하시오.
첫째 줄에 영어 소문자와 대문자로만 이루어진 단어가 주어진다. 단어의 길이는 최대 100이다.
첫째 줄에 입력으로 주어진 단어의 길이를 출력한다.
pulljima
8
package string;
import java.util.Scanner;
public class BOJ_2743_WordLength {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
System.out.println(str.length());
}
}
String.length() 메서드의 기본 사용법 숙지
문자열을 입력받고 길이를 반환하는 아주 기본적인 I/O 연습 문제
Java에서는 Scanner.next()로 공백 없는 단어를 받는 기본 구조를 이해시키는 목적
문자열을 입력으로 주면 문자열의 첫 글자와 마지막 글자를 출력하는 프로그램을 작성하시오.
입력의 첫 줄에는 테스트 케이스의 개수 T(1 ≤ T ≤ 10)가 주어진다. 각 테스트 케이스는 한 줄에 하나의 문자열이 주어진다. 문자열은 알파벳 A~Z 대문자로 이루어지며 알파벳 사이에 공백은 없으며 문자열의 길이는 1000보다 작다.
각 테스트 케이스에 대해서 주어진 문자열의 첫 글자와 마지막 글자를 연속하여 출력한다.
3
ACDKJFOWIEGHE
O
AB
AE
OO
AB
package string;
import java.util.Scanner;
public class BOJ_9086_FirstLastChar {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int t = sc.nextInt();
for(int i = 0; i < t; i++){
String str = sc.next();
System.out.println(str.charAt(0)+""+str.charAt(str.length()-1));
}
}
}
String.charAt(index) 사용법 숙지
반복문 속에서 문자열의 특정 인덱스에 접근하는 기본 로직 훈련
문자열 길이가 1인 경우에도 잘 동작하도록 예외 상황을 고려하도록 유도
알파벳 소문자, 대문자, 숫자 0-9중 하나가 주어졌을 때, 주어진 글자의 아스키 코드값을 출력하는 프로그램을 작성하시오.
알파벳 소문자, 대문자, 숫자 0-9 중 하나가 첫째 줄에 주어진다.
입력으로 주어진 글자의 아스키 코드 값을 출력한다.
A
65
C
67
0
48
9
57
a
97
z
122
package string;
import java.util.Scanner;
public class BOJ_11654_AsciiCode {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
char ch = sc.next().charAt(0);
System.out.println((int)ch);
}
}
char 타입과 int 타입의 관계 이해
문자 → 아스키 코드(정수) 변환에 대한 이해 ((int) 문자)
Java에서 문자를 입력받을 때 Scanner.next().charAt(0)의 패턴 학습
| 항목 | String | char |
|---|---|---|
| 자료형 | String (문자열) | char (문자 하나) |
| 메모리 구조 | 객체 (heap 저장) | 기본형 (stack 저장) |
| 저장하는 값 | 여러 문자 ("hello") | 문자 1개 ('h') |
| 입력 방법 | sc.next() 또는 sc.nextLine() | sc.next().charAt(0) |
| 문자열 길이 | str.length() | 항상 1 (단일 문자) |
| 아스키 코드 출력 | System.out.println((int) str.charAt(0)) | System.out.println((int) ch) |
알고리즘의 효율성을 쉽게 분류하고 이해할 수 있는 표기법
시간 단위가 아닌 알고리즘에 필요한 단계 수만을 고려함으로써 일관성을 유지함
빅 오 1 또는 차수 1이라고 불림 데이터 크기에 상관없이 알고리즘에 필요한 단계 수가 일정하다는 의미
배열 끝의 삽입, 삭제 가 있음 어떤 크기의 배열이든 두 연산에는 한 단계만 필요함으로 효율성을 O(1)이라고 할 수 있음
N개의 원소가 있을때 선형 검색은 최대 N단계까지 걸릴 수 있음 그럴때 빅오 표기법은 O(N)으로 표기함
배열 내에 N개의 원소가 있을 때 알고리즘을 끝내는데 N개의 단계가 필요함을 표현하는 빅 오의 방법
빅오는 알고리즘에 얼마나 많은 단계가 필요한지를 알고리즘이 처리할 데이터 원소 수에 따라 설명함
그럼 데이터가 증가할 수록 단계 수는 어떻게 변하는가?
O(N)은 데이터의 원소 수만금 단계가 필요함 그래프로 하면 대각선을 그림 이를 선형 시간이라고도 부름
O(i)는 배열이 얼마나 커지든 단계 수는 같음 그래프로 하면 수평선을 그림 이를 상수 시간이라고 부름
예를 들어 알고리즘이 100단계가 걸리는 O(1)과 O(N)이 있을경우 원소가 100개일때는 동일한 단계가 걸리나
원소라 100개를 넘어면 O(N)은 더 많은 단계가 걸린다 위와같이 O(N)은 O(1)보다 덜 효울적이다
선향 검색은 항상 O(N)안 아니다 최선의 시나리오의 경우 O(1) 최악의 시나리오의 경우 O(N)이다
하지막 빅오에서 별도로 명시하지 않는한 최악의 시나리오를 의미한다
이진검색은 O(1)에 속하지도 않으며 O(N)에도 속하지 않는다 이 사이에 있다 빅오는 이를 O(logN) 오 로그 N이라고 부린다
이러한 유형은 알고리즘을 로그시간의 시간 복잡도라고 함 데이터가 두 배로 증가할때 마다 한단계씩 늘어남
O(1)보단 덜 효율적이 지만 O(N)보단 효율적임
후입선출(LIFO)나중에 넣는게 먼저 나오는 구조
웹브라우저 방문 기록 은 스택구조가 사용됨
push(item) 스택에 아이템 추가
pop() 스택에서 가장 위 아이템 꺼냄
peek() 제거 없이 가장 위 아이템 확인
isEmpty() 스택이 비었는지 확인
import java.util.Stack;
Stack<String> stack = new Stack<>();
stack.push("A");
stack.push("B");
System.out.println(stack.pop()); // B
System.out.println(stack.peek()); // A
선입선출(FIFO)먼저 넣는게 먼저 나오는 구조
네트워크 패킷 처리구조에 주요 사용
offer(item) 큐에 아이템 추가
poll() 큐에서 앞 아이템 꺼냄
peek() 제거 없이 앞 아이템 확인
isEmpty() 큐 비어 있는지 확인
java에선 LinkedList또는 ArrayDeque를 사용함
import java.util.Queue;
import java.util.LinkedList;
Queue<String> queue = new LinkedList<>();
queue.offer("A");
queue.offer("B");
System.out.println(queue.poll()); // A
System.out.println(queue.peek()); // B
인터넷을 식별하는 고유 주소
하나의 IP에 여러 프로그램을 구분
80 HTTP
443 HTTPS
22 SSH
3306 MySQL
8080 개발용 웹서버
Stream안에 요소들을 오름차순 또는 지정한 기준대로 정렬하는 중간 연산자
예시(기본형 정렬)
List<Integer> nums = Arrays.asList(5, 3, 8, 1);
List<Integer> sorted = nums.stream()
.sorted()
.collect(Collectors.toList());
System.out.println(sorted); // [1, 3, 5, 8]
List<Todo> sortedTodos = todos.stream()
.sorted(Comparator.comparing(Todo::getDueDate))
.collect(Collectors.toList());
.sorted() 오름차순 정렬 (기본 기준)
.sorted(Comparator.reverseOrder()) 내림차순
.sorted(Comparator.comparing(객체::필드)) 특정 필드 기준 정렬
스트림의 요소들을 특정 기준(키)으로 그룹화해서 Map<기준, List<요소>> 형식으로 묶어줌
그룹화된 각 항목의 개수를 셈 (기본적으로 .size()와 비슷한 역할을 대신함)
리스트 비어있을땐 할일없습니다 출력
잇을땐 대소문자 구분 없이 카테고리별로 모은후 그걸 카운팅해서 출력
public void printCategoryState(){
if(todos.isEmpty()){
System.out.println("할 일이 없습니다");
}else{
Map<String, Long> stats = todos.stream()
.collect(Collectors.groupingBy(
Todo::getCategory,
Collectors.counting()
));
System.out.println("카테고리별 통계.");
stats.forEach((category, count) ->
System.out.println("-"+category + ": " + count+"개"));
}
}
정석은 없다지만 따로 커리큘럼을 두고 공부를하고있지않아서 그런가
엄청 기초적인 문자열에 대한 문제가 나왔는데 문자열 문법을 많이 몰라서
많이 배웠다
빅오 표기법이라는 흥미로운것도 배웠다 100개의 단계를 거치는것도 O(1)이다
라는게 좀 신기하기도 했고 log가 나오는거도 역시 공학인가~ 싶기도 햇다
java에서 Stream체이싱을 사용해서 카테고리별 통계 메소드를 만들었는데
이젠 Stream체이싱을 쓸 수 있을거같아서 내일부터는 APi로 넘어가 볼 예정이다
좀 더 열심히 해야할거같다.. 너무 놀아...