[Java] 기초 - 문자열, 배열 실습문제 모음집

이지연·2025년 12월 11일

Java 참조자료형 중 문자열, 배열을 연습하기 위한 기본 예제 정리


1. 문자열(String) 관련 실습

1-1. 정규표현식으로 문자 필터링

문자열에서 한글, 영어, 공백 등을 제거해라

String str = "01abC123  한글123";

System.out.println(str.replaceAll("[가-힣]", ""));    // 한글 제거
System.out.println(str.replaceAll("[a-z]", ""));      // 소문자 제거
System.out.println(str.replaceAll("[A-Z]", ""));      // 대문자 제거
System.out.println(str.replaceAll("[A-Za-z]", ""));   // 알파벳 전체 제거
System.out.println(str.replaceAll("\\s+", ""));       // 공백 제거
  • [가-힣] : 한글 문자 범위 매칭
  • [A-Za-z] : 영문자 전체
  • \\s+ : 하나 이상의 공백 문자(스페이스, 탭 등)

1-2. 전화번호 · 이메일 검증 (정규식)

콘솔에서 입력받은 값을 각 형식에 맞는지 검증해라

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

// 전화번호 검증: 010-XXXX-XXXX
System.out.println("전화번호를 입력하시오. 형식 : 010-XXXX-XXXX");
String number = br.readLine();
boolean numCheck = number.matches("^\\d{3}-\\d{4}-\\d{4}$");
if (numCheck) {
    System.out.println("올바르게 입력되었습니다.");
} else {
    System.out.println("전화번호 형식이 올바르지 않습니다.");
}

// 이메일 검증: 영문숫자@영문숫자.com
System.out.println("이메일주소를 입력하시오. 형식 : 영문숫자@영문숫자.com");
String email = br.readLine();
boolean emailCheck = Pattern.matches("^[a-z0-9]+@[a-z]+.com$", email);
if (emailCheck) {
    System.out.println("올바르게 입력되었습니다.");
} else {
    System.out.println("이메일 형식이 올바르지 않습니다.");
}
  • ^\\d{3}-\\d{4}-\\d{4}$ : 숫자3-숫자4-숫자4 형식만 허용
  • ^[a-z0-9]+@[a-z]+.com$ : 아주 단순화된 이메일 패턴이라, 실제 서비스에서는 더 넓은 패턴을 쓰는 게 일반적임

1-3. 공백 개수 세기

공백이 몇 개 있는지 출력해라

String blankString = "hello     world    java";
int blankTotal = 0;

for (int i = 0; i < blankString.length(); i++) {
    if (blankString.substring(i, i + 1).isBlank()) {
        blankTotal++;
    }
}
System.out.println(blankTotal); // 9
  • isBlank() 는 공백 문자인지 여부를 확인할 때 편리

1-4. StringBuilder로 문자열 뒤집기

문자열을 뒤집어서 출력해라

반복문과 reverse() 메서드 두 방식 모두 연습해보면 좋음.

String s = "hello";

// (1) 반복문 사용
StringBuilder sb1 = new StringBuilder();
for (int i = s.length() - 1; i >= 0; i--) {
    sb1.append(s.charAt(i));
}
System.out.println(sb1); // olleh

// (2) reverse() 사용
StringBuilder sb2 = new StringBuilder(s);
sb2.reverse();
System.out.println(sb2); // olleh
  • StringBuilder.reverse() 는 내부 문자 배열을 거꾸로 뒤집는 유틸 메서드라 구현할 필요 없이 바로 사용 가능

2. 배열(Array) 관련 실습

2-1. 총합과 평균 구하기

85, 65, 90으로 int 배열을 선언하고, 총합과 평균을 구하시오

int[] testArr = new int[]{85, 65, 90};
int sum = 0;

for (int score : testArr) {
    sum += score;
}
double avg = (double) sum / testArr.length;

System.out.println("총 합 : " + sum);
System.out.println("평균 : " + avg);
  • 향상된 for문으로 배열을 도는 가장 기본적인 패턴 연습용 예제

2-2. 최대값, 최소값 구하기

배열의 최대값, 최소값을 구하라

int[] arr = {10, 20, 30, 12, 8, 17};

int max = Integer.MIN_VALUE;
int min = Integer.MAX_VALUE;

for (int num : arr) {
    if (max < num) {
        max = num;
    }
    if (min > num) {
        min = num;
    }
}

System.out.println("최대값 : " + max);
System.out.println("최소값 : " + min);
  • 시작값을 MIN_VALUE / MAX_VALUE 로 두는 패턴은 코딩테스트에서도 자주 쓰임

2-3. 자리 바꾸기

0번 인덱스와 1번 인덱스의 값을 자리를 바꿔서 출력해라

int[] arr = {20, 10, 30};
int temp = arr[0];

arr[0] = arr[1];
arr[1] = temp;
// 결과: {10, 20, 30}
  • 두 값의 자리를 바꿀 때 임시 변수 하나 가 필수라는 패턴을 눈에 익히면 좋음

2-4. 배열 뒤집기

배열을 뒤집어서 출력해라

int[] arr = {10, 20, 30, 40, 50};
int[] newArr = new int[arr.length];

int idx = 0;
for (int i = arr.length - 1; i >= 0; i--) {
    newArr[idx] = arr[i];
    idx++;
}

System.out.println(Arrays.toString(newArr)); // [50, 40, 30, 20, 10]
  • 인덱스를 뒤에서부터 줄여가면서 새로운 배열 앞에서부터 채우는 전형적인 "역순 복사" 패턴

2-5. 두 숫자 조합 생성

모두 각기 다른 숫자의 배열에서 만들어질 수 있는 두 숫자의 조합을 출력하시오

int[] combArr = {10, 20, 30, 40, 50};
for (int i = 0; i < combArr.length; i++) {
    for (int j = i + 1; j < combArr.length; j++) {
        System.out.println("(" + combArr[i] + ", " + combArr[j] + ")");
    }
}
  • j = i + 1로 시작해 자기 자신과의 조합, 순서 중복 제거
  • 프로그래머스 "두 개 뽑아서 더하기" 문제의 핵심 패턴

2-6. Set으로 배열 중복 제거

중복 숫자 배열에서 고유 값만 추출해 정렬해라 (프로그래머스 두 개 뽑아서 더하기 선행지식)

int[] arr = {10, 30, 20, 30, 10, 40};
Set<Integer> mySet = new HashSet<>();

// 중복 제거
for (int num : arr) {
    mySet.add(num);
}

// Set → 배열 변환 + 정렬
int[] uniqueArr = new int[mySet.size()];
int index = 0;
for (int num : mySet) {
    uniqueArr[index++] = num;
}
Arrays.sort(uniqueArr);

System.out.println(Arrays.toString(uniqueArr)); // [10, 20, 30, 40]
  • HashSet의 중복 불허 특성으로 간단히 중복 제거
  • Set은 인덱스가 없어 별도 index 카운터 필요

3. 프로그래머스 & 백준 문제 풀이 모음

3-1. 특정문자 제거하기

문제 : URL

주어진 문자열에서 특정 문자를 모두 제거하는 문제

class Solution120826 {
    public String solution(String my_string, String letter) {
        String answer = "";
        for (int i = 0; i < my_string.length(); i++) {
            if (my_string.charAt(i) != letter.charAt(0)) {
                answer += my_string.charAt(i);
            }
        }
        return answer;
    }
}
  • letter 는 문자열이지만, 실제로는 한 글자만 쓰이므로 letter.charAt(0) 으로 비교
  • 문자열 누적에 += 를 쓰는 대신 StringBuilder 로 리팩터링해보는 것도 좋은 연습

3-2. 가운데 글자 가져오기

문제 : URL

단어 s 의 가운데 글자를 반환하는 함수 작성 문제

class Solution12903 {
    public String solution(String s) {
        String answer = "";
        if (s.length() % 2 == 0) {
            answer += s.substring(s.length() / 2 - 1, s.length() / 2 + 1);
        } else {
            answer += s.substring(s.length() / 2, s.length() / 2 + 1);
        }
        return answer;
    }
}
  • 길이가 짝수면 가운데 두 글자, 홀수면 가운데 한 글자를 잘라서 반환
  • 인덱스 기준이 헷갈리기 쉬우니, 종이에 인덱스를 써보고 체크하는 습관이 도움됨

3-3. 문자열 밀기

문제 : URL

문자열 A 를 오른쪽으로 한 글자씩 밀면서 문자열 B 가 되는 최소 횟수를 구하는 문제

class Solution120921 {
    public int solution(String A, String B) {
        StringBuilder sb = new StringBuilder(A);
        if (A.equals(B)) {
            return 0;
        }
        for (int i = 0; i < sb.length(); i++) {
            sb.insert(0, sb.charAt(sb.length() - 1));
            sb.deleteCharAt(sb.length() - 1);

            if (sb.toString().equals(B)) {
                return i + 1;
            }
        }
        return -1;
    }
}
  • insert(0, 마지막 문자)deleteCharAt(마지막 인덱스)오른쪽으로 한 칸 회전 구현
  • 최대 length 번 회전해도 안 맞으면 더 이상 맞출 수 없으므로 -1 반환

3-4. 수 찾기

문제 : URL

  • N(1 ≤ N ≤ 100,000), M(1 ≤ M ≤ 100,000)
  • 선형탐색 시 복잡도 약 10억번
  • 이분탐색 시 100~200만번정도
  • 정렬 복잡도 nlog(n) + 이분탐색 복잠도 log(n) n = 2n*log(n) (1천만 이하)
  • Set, Map을 써도 되지만 우리는 선형탐색으로 시간초과를 내보고, 이분탐색을 써볼 예정!

선형탐색 풀이 (시간초과)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {


        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        StringTokenizer st1 = new StringTokenizer(br.readLine());
        int[] n_arr = new int[n];

        int m = Integer.parseInt(br.readLine());
        StringTokenizer st2 = new StringTokenizer(br.readLine());
        int[] m_arr = new int[m];

        for (int i = 0; i < n; i++) {
            n_arr[i] = Integer.parseInt(st1.nextToken());
        }
        for (int i = 0; i < m; i++) {
            m_arr[i] = Integer.parseInt(st2.nextToken());
        }
        for (int i = 0; i < m; i++) {
            boolean isMatch = false;
            for (int j = 0; j < n; j++) {
                if (m_arr[i] == n_arr[j]) {
                    isMatch = true;
                    break;
                }
            }
            System.out.println(isMatch ? "1" : "0");
        }
    }
}

이분탐색 풀이

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        StringTokenizer st1 = new StringTokenizer(br.readLine());
        int[] n_arr = new int[n];

        int m = Integer.parseInt(br.readLine());
        StringTokenizer st2 = new StringTokenizer(br.readLine());
        int[] m_arr = new int[m];

        for (int i = 0; i < n; i++) {
            n_arr[i] = Integer.parseInt(st1.nextToken());
        }
        for (int i = 0; i < m; i++) {
            m_arr[i] = Integer.parseInt(st2.nextToken());
        }
        for (int i = 0; i < m; i++) {
            boolean isMatch = false;
            for (int j = 0; j < n; j++) {
                if (m_arr[i] == n_arr[j]) {
                    isMatch = true;
                    break;
                }
            }
            System.out.println(isMatch ? "1" : "0");
        }
    }
}

3-5. 행렬의 덧셈

문제 : URL

class Solution {
    public int[][] solution(int[][] arr1, int[][] arr2) {

       int[][] answer = new int[arr1.length][arr1[0].length];

        int arr1_value = 0;
        int arr2_value = 0;

        for(int i = 0; i < arr1.length; i++){
            for(int j = 0; j < arr1[i].length; j++){
                arr1_value = arr1[i][j];
                arr2_value = arr2[i][j];
                answer[i][j] = arr1_value+arr2_value;
            }
        }
        return answer;
    }
}

3-6. K번째수

문제 : URL

import java.util.Arrays;
class Solution {
    public int[] solution(int[] array, int[][] commands) {
        int[] answer = new int[commands.length];

        for (int i = 0; i < commands.length; i++) {
            int iValue = 0;
            int jValue = 0;
            int kValue = 0;
            iValue = commands[i][0] - 1;
            jValue = commands[i][1];
            kValue = commands[i][2] - 1;
            int[] copy_arr = Arrays.copyOfRange(array, iValue, jValue);
            Arrays.sort(copy_arr);
            answer[i] = copy_arr[kValue];
        }
        return answer;
    }
}
profile
Eazy하게

4개의 댓글

comment-user-thumbnail
2025년 12월 11일

안녕하세요 백준입니다
하하하~ 존나쉽네요
열심히하세요 수고하세요

답글 달기
comment-user-thumbnail
2025년 12월 11일

문자열 밀기

// TODO 성능이 좋은 구현 방법
//  A+A를 만들어서 B를 찾아라 앞으로 몇번 뺐는지 확인해보면 알 수 있음
답글 달기
comment-user-thumbnail
2025년 12월 12일

https://velog.io/@jiyean99/Java-%EA%B8%B0%EC%B4%88-%EB%AC%B8%EC%9E%90%EC%97%B4-%EB%B0%B0%EC%97%B4-%EC%8B%A4%EC%8A%B5%EB%AC%B8%EC%A0%9C-%EB%AA%A8%EC%9D%8C%EC%A7%91#3-4-%EC%88%98-%EC%B0%BE%EA%B8%B0

해당 문제는 Set으로도 풀이가 가능하며 이 때 복잡도는 1이되는것
map을 쓰게 되면 메모리 초과가 발생할 수 도 있다는 점까지 유의

답글 달기
comment-user-thumbnail
2025년 12월 12일

기니님 벨로그열심히안쓰시네요? 댓글달게없네요 오늘실망입니다

답글 달기