배열
배열(Array)은 프로그래밍에서 데이터를 저장하고 조작하는 가장 기본적인 자료구조이다. 배열은 모든 요소가 순차적으로 배열되는 선형 데이터 구조이다. 배열은 연속적 메모리에 동일 데이터 유형 요소들로 구성된다.
파이썬에서의 배열
파이썬에서 배열과 가장 유사한 자료형은 리스트(List)이다. C언어와 다르게 파이썬에서의 배열은 가변적인 크기를 가지고 동일 데이터 유형 요소 뿐만 아니라 다양한 유형의 데이터 요소들을 저장할 수 있습니다. 파이썬이 알고리즘 풀기에 제일 편한 언어인게 이런 편의성 때문이 아닐까요
파이썬에서는 두가지 방법으로 배열 구현이 가능합니다.
1. 리스트(List): 다양한 요소들을 포함할 수 있는 배열이며 가변적인 크기를 가질 수 있습니다. 일반적으로 많이 사용합니다.
# 리스트 생성
number_list = [1,2,3,4,5]
number_list.append(6) # 마지막 인덱스에 요소 추가
print(number_list) # [1,2,3,4,5,6]
number_list.remove(4) # 인덱스 4의 요소를 제거
print(number_list) # [1,2,3,4,6]
# 리스트의 길이를 출력
print(len(number_list)) # 5
# 인덱스 2의 요소를 출력
print(number_list[2]) # 3
# 슬라이싱
# 인덱스 3 이전까지 출력
print(number_list[:3]) # [1,2,3]
# 인덱스 1부터 3이전까지 출력
print(number_list[1:3]) # [2,3]
# 인덱스 1부터 끝까지 출력
print(number_list[1:]) # [2,3,5,6]
# 리스트에 요소 존재 여부 확인
print(4 in number_list) # False
# 리스트 정렬
number_list.sort(reverse=True)
print(number_list) # [6,5,3,2,1]
number_list.sort()
print(number_list) # [1,2,3,5,6]
# 리스트의 요소를 역순으로 변경
number_list.reverse() # [6,5,3,2,1]
# 리스트의 얕은 복사본 반환
number_list_copy = number_list.copy() # [6,5,3,2,1]
# 리스트의 마지막 인덱스에 값 삽입
number_list.append(100) # [6,5,3,2,1,100]
# 인덱스에 값 삽입
number_list.insert(1, 1.6) # [6,1.6,3,2,1,100]
# 첫 번째로 나타나는 값 제거
number_list.remove(1.6) # [6,3,2,1,100]
# 인덱스에 해당하는 요소 제거 후 반환
number_list.pop(2) # [6,3,1,100]
2. array 모듈: 배열 모듈을 사용해서 정적인 배열을 사용할 수 있습니다.
import array
# 배열 생성
# 정수형 배열 생성
int_array = array.array('i', [1,2,3,4,5])
# 실수형 배열 생성
double_array = array.array('d', [1.0, 2.0, 3.0, 4.0, 5.0])
print(int_array) # array('i', [1, 2, 3, 4, 5])
print(double_array) # array('d', [1.0, 2.0, 3.0, 4.0, 5.0])
# 마지막 인덱스에 6추가
int_array.append(6)
print(int_array) # array('i', [1, 2, 3, 4, 5, 6])
# 인덱스가 아닌 값 3 제거하기
int_array.remove(3)
print(int_array) # array('i', [1, 2, 4, 5, 6])
array 모듈을 쓰면서 몇 가지 신기한 점이 있었다.
1. 파이썬의 list는 remove(n) 함수가 n인덱스에 해당하는 값을 삭제하는 반면, array 모듈은 인덱스가 아닌 값을 삭제합니다.
2. 문자열 타입의 배열을 생성할 수 없습니다. 당연히 되는 줄 알고 array.array('s', ['dog', 'cat', 'cow'])로 배열을 만들려고 했는데 에러가 나네요. 타입코드를 b, B, u, h, H, i, I, l, L, g, Q, f, d만 사용이 가능하다고 합니다.
자바에서의 배열
자바에서도 마찬가지로 두 가지 방법으로 배열 구현이 가능합니다. 다만 자바에서의 배열은 파이썬의 list처럼 여러 타입의 데이터를 하나의 배열에 담을 수는 없습니다.
1. []를 사용한 배열 선언: 생성시 크기가 정해지는 정적 크기의 배열입니다. 또한 동일 타입만 담을 수 있다는 특징이 있습니다.
// 배열 생성
Integer[] numbers = {1,2,3,4,5};
String[] strings = {"abc", "def"};
// 배열 길이
System.out.println(numbers.length); // 5
// 배열 요소에 인덱스로 접근
System.out.println(numbers[2]); // 3
// 인덱스로 배열 요소 변경
numbers[2] = 100;
System.out.println(numbers[2]); // 100
// 배열 요소 반복
for(int num : numbers) {
System.out.println(num + " ");
}
// 배열 정렬
Arrays.sort(numbers); // [1, 2, 4, 5, 100]
Arrays.sort(numbers, Collections.reverseOrder()); // [100, 5, 4, 2, 1]
System.out.println(Arrays.toString(numbers));
2. ArrayList: 가변 크기인 배열을 생성합니다. 같은 타입만 담을 수 있다는 점은 같습니다.
ArrayList<Integer> numbers = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));
// 값 추가
numbers.add(6); // [1, 2, 3, 4, 5, 6]
System.out.println("numbers = " + numbers);
// 해당 인덱스에 값 추가
numbers.add(2, 100); // [1, 2, 100, 3, 4, 5, 6]
System.out.println("numbers = " + numbers);
// 해당 값 삭제
numbers.remove(Integer.valueOf(100)); // [1, 2, 3, 4, 5, 6]
System.out.println("numbers = " + numbers);
// 인덱스의 값 삭제
numbers.remove(4); // [1, 2, 3, 4, 6], 삭제된 요소: 5
System.out.println("numbers = " + numbers);
// 정렬
Collections.sort(numbers, Collections.reverseOrder());
System.out.println("numbers = " + numbers); // numbers = [6, 4, 3, 2, 1]
Collections.sort(numbers);
System.out.println("numbers = " + numbers); // numbers = [1, 2, 3, 4, 6]
// 크기
System.out.println(numbers.size()); // 5
문자열
문자열은 연속 메모리 위치에 저장되고 널 문자 '\0'라는 특수문자로 끝나는 연속된 char 데이터의 집합이다. 문자열은 배열과 마찬가지로 순서가 지정된 문자 시퀀스로 각 문자인 char 데이터는 문자열에서 고유한 위치를 지닙니다. 그렇기 때문에 인덱스를 사용하여 개별 문자에 액세스 하는 것이 가능합니다.
파이썬에서의 문자열
파이썬에서의 문자열은 불변(immutable)한 시퀀스 데이터입니다. 문자열을 큰 따옴표(""), 문자를 작은 따옴표('')로 구분하는 자바와 달리, 파이썬에서는 문자열 정의 시에 큰 따옴표, 작은 따옴표 구분 없이 사용이 가능합니다.
# 문자열 생성
text = "Hello, World!"
# 문자열 길이
print(len(text)) # 13
# 문자열 요소 접근
print(text[1]) # e
# 문자열 슬라이싱
print(text[:5]) # Hello
print(text[5:]) # , World!
print(text[1:5]) # ello
# 문자열 연결
text = text + " How are you?"
print(text) # Hello, World! How are you?
# 문자열 포함 여부 확인
print("World" in text) # True
# 문자열 대소문자 변환
print(text.upper()) # HELLO, WORLD! HOW ARE YOU?
print(text.lower()) # hello, world! how are you?
# 첫 문자를 대문자로 변환
print(text.capitalize()) # Hello, world! how are you?
# 각 단어의 첫 글자를 대문자로 변환
print(text.title()) # Hello, World! How Are You?
# 문자열의 대소문자 반전
print(text.swapcase())
# 문자열 분할
print(text.split(",")) # ["Hello", "World! How are you?"]
# 문자열 검색
print(text.find('o')) # 첫 번째 인덱스를 반환
print(text.rfind('o')) # 마지막 인덱스를 반환
# 문자열 변수에 저장
name = "Kevin"
age = 26
print(f"내 이름은 {name}이다. 나이는 {age}이다.")
자바에서의 문자열
자바에서의 문자열도 마찬가지로 불변(immutable)이며 String 클래스의 인스턴스로 표현됩니다.
// 문자열 선언
String text = "Hello, World!";
// 대소문자로 변환
System.out.println(text.toUpperCase());
System.out.println(text.toLowerCase());
// 문자열 인덱스 찾기
System.out.println(text.indexOf('o'));
System.out.println(text.lastIndexOf('o'));
// 부분 문자열 존재 여부 확인
System.out.println(text.contains("ell"));
// 문자열 길이
System.out.println(text.length());
// 문자열 교체
text = text.replace("Hello", " Bye");
System.out.println(text); // Bye, World!
// 양쪽끝의 문자열 공백 삭제
text = text.trim();
System.out.println(text.trim()); // Bye, World!
// 문자열 내부에 변수 삽입해서 포멧팅
String name = "Kevin";
int age = 26;
System.out.println(String.format("Name: %s, Age: %d", name, age)); // Name: Kevin, Age: 26
// 문자열 결합
String[] words = {"Hello", "World"};
System.out.println(String.join(", ", words)); // "Hello, World"
References
https://www.geeksforgeeks.org/what-is-array/
What is Array? - GeeksforGeeks
A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.
www.geeksforgeeks.org
https://www.geeksforgeeks.org/what-is-string/
What is String - Definition & Meaning - GeeksforGeeks
A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.
www.geeksforgeeks.org
'자료구조 및 알고리즘' 카테고리의 다른 글
[자료구조/알고리즘 이론] 다이나믹 프로그래밍(Dynamic Programming, DP) (3) | 2024.07.20 |
---|---|
[자료구조/알고리즘 이론] 위상 정렬(Topological Sorting) (0) | 2024.07.18 |
[자료구조/알고리즘 이론] MST(최소 신장 트리), Kruskal's/Prim's Algorithm (0) | 2024.07.17 |
[자료구조/알고리즘 이론] 복잡도 (0) | 2024.07.06 |
[자료구조/알고리즘 이론] 반복문과 재귀 (0) | 2024.07.05 |