1. 문자열(String) 기본
1-1. 문자열(String) 기본
- 자바에서 문자열은 String 클래스로 관리된다.
- 문자열은 불변(Immutable): 수정 불가. 새로운 값을 만들면 새로운 객체가 생성된다.
1-2. 문자열 선언과 초기화
String str1 = "Hello"; // 리터럴 방식
String str2 = new String("World"); // 객체 방식
* 리터럴 방식: 문자열 상수(Pool)에서 관리. 메모리 효율적.
* 객체 방식: 항상 새로운 객체 생성. 잘 사용하지 않음.
1-3. 주요 메소드
메소드 | 설명 | 예제(String str="Hello";) |
length( ) | 문자열 길이 반환 | str.length() -> 5 |
charAt(index) | 특정 인덱스의 문자 반환 | str.charAt -> 'e' |
substring(start, end) | 부분 문자열 반환 | str.substring(1, 4) -> "ell" |
indexOf(char) | 문자/문자열의 첫번째 위치 반환 | str.indexOf('e') -> 1 |
lastIndexOf(char) | 문자/문자열의 마지막 위치 반환 | str.lastIndexOf('1') -> 3 |
toUpperCase( ) | 대문자로 변환 | str.toUpperCase() -> "HELLO" |
toLowerCase( ) | 소문자로 변환 | str.toLowerCase() -> "hello" |
equals(str) | 문자열 비교(대소문자 구분) | str.equals("Hello") -> true |
equalsIgnoreCase(str) | 문장려 비교(대소문자 무시) | str.equalsIgnoreCase("hello") -> true |
split(delimiter) | 특정 구분자로 문자열 나누기 | "A, B, C" .split(",") -> ["A", "B", "C"] |
trim( ) | 문자열 양쪽 공백 제거 | " Hello " .trim() -> "Hello" |
1-4. 문자열 반복문 처리
- 문자열을 문자 배열처럼 반복문으로 처리할 수 있다.
(예제: 문자열 문자 하나씩 출력)
public class Main {
public static void main(String[] args) {
String str = "Hello";
for (int i = 0; i < str.length(); i++) {
System.out.println(str.charAt(i));
}
}
}
1-5. 문자열 뒤집기
- 문자열을 뒤집으려면 "StringBuilder"를 사용한다.
public class Main {
public static void main(String[] args) {
String str = "Hello";
String reversed = new StringBuilder(str).reverse().toString();
System.out.println(reversed); // 출력: "olleH"
}
}
1-6. 문자열 비교
(1) == 사용 (객체 주소 비교)
String str1 = "Hello";
String str2 = "Hello";
System.out.println(str1 == str2); // 출력: true (리터럴로 생성)
(2) equals( ) 사용 (문자열 값 비교)
String str3 = new String("Hello");
System.out.println(str1.equals(str3)); // 출력: true
** 실습 문제: 문자열
* 문제 1: 단어 뒤집기
- 설명: 입력받은 문자열을 뒤집에서 출력하세요.
(입력)
Hello
(출력)
olleH
(코드)
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("문자열 입력: ");
String str = sc.nextLine();
String reversed = new StringBuilder(str).reverse().toString();
System.out.println("뒤집은 문자열: " + reversed);
}
}
* 문제 2: 문자 개수 세기
- 설명: 문자열에서 특정 문자가 몇 번 등장했는지 세세요.
(입력)
Hello
l
(출력)
2
(코드)
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("문자열 입력: ");
String str = sc.nextLine();
System.out.print("찾을 문자 입력: ");
char target = sc.next().charAt(0);
int count = 0;
for (int i = 0; i < str.length(); i++) {
if (str.charAt(i) == target) {
count++;
}
}
System.out.println("문자 " + target + "의 개수: " + count);
}
}
2. 2차원 배열
2-1. 선언과 초기화
(1) 선언
int[][] arr = new int[3][4]; // 3행 4열 배열 선언
(2) 초기화
int[][] arr = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
2-2. 2차원 배열 순회
- 2차원 배열은 중첩 반복문으로 순회한다.
(예제)
public class Main {
public static void main(String[] args) {
int[][] arr = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
for (int i = 0; i < arr.length; i++) { // 행
for (int j = 0; j < arr[i].length; j++) { // 열
System.out.print(arr[i][j] + " ");
}
System.out.println();
}
}
}
(출력)
1 2 3
4 5 6
7 8 9
2-3. 2차원 배열 활용 문제
* 문제 1: 행렬 덧셈
- 설명: 두 개의 행렬을 입력받아 덧셈 결과를 출력하세요.
(입력)
2 2
1 2
3 4
5 6
7 8
(출력)
6 8
10 12
(코드)
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int rows = sc.nextInt();
int cols = sc.nextInt();
int[][] matrix1 = new int[rows][cols];
int[][] matrix2 = new int[rows][cols];
System.out.println("첫 번째 행렬 입력:");
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
matrix1[i][j] = sc.nextInt();
}
}
System.out.println("두 번째 행렬 입력:");
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
matrix2[i][j] = sc.nextInt();
}
}
System.out.println("행렬 덧셈 결과:");
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
System.out.print((matrix1[i][j] + matrix2[i][j]) + " ");
}
System.out.println();
}
}
}
* 문제 2: 대각선 합
- 설명: 주어진 2차원 배열의 주대각선(왼쪽 위 -> 오른쪽 아래) 합을 구하세요.
(입력)
3
1 2 3
4 5 6
7 8 9
(출력)
15
(코드)
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[][] arr = new int[n][n];
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
arr[i][j] = sc.nextInt();
}
}
int sum = 0;
for (int i = 0; i < n; i++) {
sum += arr[i][i];
}
System.out.println("대각선 합: " + sum);
}
}
== 추가 문제
* 문제 1: 회문(팰린드롬) 검사
- 주어진 문자열이 회문인지 확인하세요.
회문은 앞에서 읽으나 뒤에서 읽으나 같은 문자열을 의미한다.
(입력)
level
(출력)
true
(코드)
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("문자열 입력: ");
String str = sc.nextLine();
String reversed = new StringBuilder(str).reverse().toString();
System.out.println(str.equals(reversed));
}
}
* 문제 2: 대소문자 변환
- 문자열의 대문자를 소문자로, 소문자를 대문자로 변환하세요.
(입력)
HelloWorld
(출력)
hELLOwORLD
(코드)
import java.util.Scanner;
public class Main
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("문자열 입력: ");
String str = sc.nextLine();
StringBuilder result = new StringBuilder();
for (char c : str.toCharArray()) {
if (Character.isUpperCase(c)) {
result.append(Character.toLowerCase(c));
} else if (Character.isLowerCase(c)) {
result.append(Character.toUpperCase(c));
} else {
result.append(c);
}
}
System.out.println("변환된 문자열: " + result);
}
}
* 문제 3: 단어 개수 세기
- 문장에서 단어의 개수를 세세요. 단어는 공백으로 구분됩니다.
(입력)
The quick brown fox
(출력)
4
(코드)
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("문장 입력: ");
String str = sc.nextLine();
String[] words = str.trim().split("\\s+");
System.out.println("단어 개수: " + words.length);
}
}
* 문제 4: 가장 많이 등장한 문자
- 문자열에서 가장 많이 등장한 문자를 출력하세요.
(입력)
banana
(출력)
a
(코드)
import java.util.HashMap;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("문자열 입력: ");
String str = sc.nextLine();
HashMap<Character, Integer> frequency = new HashMap<>();
for (char c : str.toCharArray()) {
frequency.put(c, frequency.getOrDefault(c, 0) + 1);
}
char maxChar = ' ';
int maxCount = 0;
for (char c : frequency.keySet()) {
if (frequency.get(c) > maxCount) {
maxCount = frequency.get(c);
maxChar = c;
}
}
System.out.println("가장 많이 등장한 문자: " + maxChar);
}
}
= 2차원 배열 문제
* 문제 1: 2차원 배열 전치
- 주어진 2차원 배열의 전치를 출력하세요. 전치란 행과 열을 교환하는 것입니다.
(입력)
3
1 2 3
4 5 6
7 8 9
(출력)
1 4 7
2 5 8
3 6 9
(코드)
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[][] matrix = new int[n][n];
System.out.println("행렬 입력:");
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
matrix[i][j] = sc.nextInt();
}
}
System.out.println("전치 행렬:");
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
System.out.print(matrix[j][i] + " ");
}
System.out.println();
}
}
}
* 문제 2: 테두리 요소 합 구하기
- 2차원 배열에서 테두리에 위치한 요소의 합을 구하세요.
(입력)
4
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
(출력)
54
(코드)
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[][] matrix = new int[n][n];
System.out.println("행렬 입력:");
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
matrix[i][j] = sc.nextInt();
}
}
int sum = 0;
// 위쪽 행, 아래쪽 행
for (int j = 0; j < n; j++) {
sum += matrix[0][j] + matrix[n - 1][j];
}
// 왼쪽 열, 오른쪽 열 (이미 더한 코너 값 제외)
for (int i = 1; i < n - 1; i++) {
sum += matrix[i][0] + matrix[i][n - 1];
}
System.out.println("테두리 요소 합: " + sum);
}
}
* 문제 3: 달팽이 배열 생성
- n x n 크기의 배열을 달팽이 모양으로 숫자를 채워 출력하세요.
(입력)
4
(출력)
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
(코드)
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[][] matrix = new int[n][n];
int num = 1;
int top = 0, bottom = n - 1, left = 0, right = n - 1;
while (num <= n * n) {
for (int i = left; i <= right; i++) matrix[top][i] = num++;
top++;
for (int i = top; i <= bottom; i++) matrix[i][right] = num++;
right--;
for (int i = right; i >= left; i--) matrix[bottom][i] = num++;
bottom--;
for (int i = bottom; i >= top; i--) matrix[i][left] = num++;
left++;
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
System.out.print(matrix[i][j] + " ");
}
System.out.println();
}
}
}
* 문제 4: 2차원 배열의 최대값 위치
- 2차원 배열에서 최대값과 그 위치(행, 열)를 출력하세요.
(입력)
3
1 2 3
4 5 6
7 8 9
(출력)
최대값: 9
위치: (2, 2)
(코드)
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[][] matrix = new int[n][n];
System.out.println("행렬 입력:");
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
matrix[i][j] = sc.nextInt();
}
}
int maxVal = Integer.MIN_VALUE;
int maxRow = -1, maxCol = -1;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (matrix[i][j] > maxVal) {
maxVal = matrix[i][j];
maxRow = i;
maxCol = j;
}
}
}
System.out.println("최대값: " + maxVal);
System.out.println("위치: (" + maxRow + ", " + maxCol + ")");
}
}
'코딩 테스트' 카테고리의 다른 글
Day 2 함수와 배열 (2) | 2024.12.20 |
---|---|
Day 1 자바 기본 문법 학습 (0) | 2024.12.19 |