[Java 풀스택 과정 강의] 2월 25일

부트캠프 일지/Java 풀스택 과정 강의
2026.03.02
※ TIL와는 별개로 적는 개인 개발 일지라서 말은 좀 편하게하는 페이지입니다.
일지이기 때문에 일기의 성격이 더 강합니다.

 

 

알고리즘 기초

우리는 Java를 기반으로 알고리즘을 배운다. 그러하여 java에서 사용되는 개념들을 먼저 배우고 넘어갔는데, 이미 일지로 정리되어 있어 인상적인 부분이나 필요한 것만 이야기한다.

 

String 주요 메서드

.length()

String의 길이를 잰다. int형으로 반환된다.

.charAt(int i)

String의 i 번째 인덱스의 문자를 반환한다. char형으로 반환된다.

 

.substring(i, j)

String의 i번부터 j - 1까지의 문자열을 추출해 반환한다. String으로 반환된다.

 

.equals(String s)

String이 s와 동일한지 내용을 비교한다. boolean으로 반환된다.

 

.equalsIgnoreCase

위 equals와 동일하지만, Case를 무시한다. 대소문자를 무시한다는 의미. 마찬가지로 boolean으로 반환.

 

.contains(String s)

String에서 s의 포함 여부를 반환한다. boolean으로 반환된다.

 

.indexOf(String s)

String에서 s의 시작점을 반환한다. int로 반환하며, 없을 경우 -1로 반환한다.

 

.replace(old, new)

특정 문자를 다른 문자로 교체한다. 문자열로 반환한다.

 

.split(String regex)

구분자로 문자열을 분리하여 배열을 반환한다. Array형태로 반환하며, 내부 요소는 String이 된다.

regex인 이유는 정규식을 사용할 수 있기 때문.

 

.toUpperCase()

문자열의 모든 문자를 대문자로 변환한다.

 

.toLowerCase()

문자열의 모든 문자를 소문자로 변환한다.

 

.trim()

문자열 앞 뒤의 공백을 제거한다.

 

 

PRINTF

출력방식에는 print, println, printf 가 있다. print의 경우 줄바꿈 없이 출력, println은 출력후 줄바꿈, printf는 특정 format으로 출력이 가능하다.

 

printf의 주요 포맷 지정자는 다음과 같다.

포맷 지정자 내용
%d Integer 형태, 정수 형태를 출력한다.
%f Float 형태, 실수 형태를 출력한다.
%s String 형태, 문자열 형태를 출력한다.
%c Char 형태, 문자 형태를 출력한다.
%n 줄바꿈한다.
%b Boolean 형태, true or false를 출력한다.

 

 

입력

Scanner에 대해서는 이야기한 적 있으니, 입력에서 새로 추가된 객체만 정리한다.

 

InputStreamReader

InputStreamReader는 바이트 스트림을 문자 스트림으로 변환해주는 브릿지 클래스이다. 단독으로는 사용하지 않고, BufferedReader와 같이 사용한다.

 

바이트 스트림과 문자 스트림의 개념에 대해서는 좋은 글이 있어서 참조.

입출력 스트림 (1). 바이트 스트림, 문자 스트림

 

입출력 스트림 (1). 바이트 스트림, 문자 스트림

컴퓨터 내부 또는 외부 장치와 프로그램 간의 데이터를 주고 받는것을 입출력이라 한다. 장치와 입출력을 하기 위해서는 하드웨어 장치에 직접 접근이 필요한데 다양한 매체에 존재하는 데이터

velog.io

 

Scanner보다 빠르다는 장점이 있지만, 자체로는 버퍼가 없다. Scanner가 왜 느리냐면 내부 정규식 파싱에 따른 오버헤드가 있기 때문이다.

 

 

BufferedReader + StringTokenizer

따라서 위에서 받은 것을 BufferedReader로 읽는다. BufferedReader는 버퍼를 통해 줄 단위로 고속 읽기를 수행한다. 전체를 읽고, BufferedReader.readLine()로 한 줄의 전체를 읽어올 수 있다. 그리고 이것을 StringTokenizer로 쪼개주면 된다. StringTokenizer는, 공백이나 구분자를 통하여 토큰으로 쪼갤 수 있다. 이 토큰들은 String 형태. 쪼갠 토큰들은 StringTokenizer.nextToken()으로 그 내용을 불러올 수 있는데, nexToken으로 불러올 경우 토큰이 줄어듦을 잊지 말 것. 이 때문에 token 개수는 미리 countTokens()로 개수를 필드로 저장하거나 hasMoreTokens()를 사용한다. hasMoreTokens()는 다음 토큰이 있는지 알아보는 boolean 타입 반환 메서드다.

 

 

StringBuilder

String의 한계로 인해 만들어진 클래스. String의 경우 매번 새로이 생성되기 때문에(str = "내용" 해준다고 해도 수정이 아니라, 새로이 생성되는 것이다.), 그에 따른 메모리 부담이 당연히 생긴다. 가변 버퍼에 문자열을 쌓아, 최종에 toString()으로 변환해주면 된다.

자주 사용되는 메서드는 .append .reverse가 있다.

 

 

정렬

연산자 또한 배웠으나 java에서 사용한 것과 동일하여 생략한다. 시간 복잡도와 효율에 대해서는 TIL에서 정리해보기로…..

정렬에는 버블 정렬, 선택 정렬, 카운팅 정렬, 삽입 정렬, 병합 정렬, 퀵 정렬, 힙 정렬, 팀 정렬 등이 있다. 모든 정렬에는 장단점이 있으므로, 각 채용 방식도 다르다. 이번에는 버블정렬과 선택 정렬만 배웠다.

 

 

버블 정렬

기본적인 정렬 알고리즘. 인접한 두 개를 비교해서 큰 쪽을 계속 뒤로 보내는(swap) 방식이다. 수도코드는 이런 느낌이다.

 

for i from 0 to N-2:            // 총 N-1번의 라운드 진행
    for j from 0 to N-2-i:      // 정렬된 끝부분은 제외하고 배틀
        if arr[j] > arr[j+1]:   // 왼쪽이 더 크면
            swap(arr[j], arr[j+1]) // 위치 교체

 

보다시피 연산의 크기가 크기 때문에 자주 채용되지는 않는다.

 

 

선택 정렬

전체 중에 가장 작은 것을 선택해 맨 앞으로 보내는 방식이다. 수도 코드는 이런 느낌이다.

 

for i from 0 to N-2:            // 현재 채워야 할 자리 (0번부터 차례대로)
    minIndex = i                // 일단 현재 자리가 제일 작다고 가정
    for j from i+1 to N-1:      // 그 다음 칸부터 끝까지 뒤져봄
        if arr[j] < arr[minIndex]: // 더 작은 놈 발견하면
            minIndex = j        // 걔를 최솟값 인덱스로 찜함
    
    swap(arr[i], arr[minIndex]) // 다 뒤졌으면 찾은 최솟값을 i자리와 교체

 

버블보다는 더 효율적으로 보이지만 결국 배열순회를 전부 해야하므로 양이 커지면 연산이 많아질 수밖에 없다. 다만 이 방식은 간단한 문제들에서는 꽤 사용된다.

 

 

 

실전 문제 풀이

이후로는 실전 문제 풀이가 있었다. 강사님과 함께 살펴보는 시간이었다.

실전 문제는 1206. View로, 관련해서는 다음 글을 참고하면 된다.

 

[코딩 테스트 RUN] SWEA 수업 : 1206.View

 

[코딩 테스트 RUN] SWEA 수업 : 1206.View

⚠️ 주의!SWEA에서 낸 코딩 문제에 대한 해답이 들어있습니다.열람 시 주의해주세요. 문제 전문은 이렇다. [SW Expert Academy] 1206. [S/W 문제해결 기본] 1일차 - View SW Expert AcademySW 프로그래밍 역량 강

bbbbabbbababababa.tistory.com