코딩 테스트

Day 3 문자열 처리와 2차원 배열 강의

서윤-정 2024. 12. 22. 21:16

 

 

 

 

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