백준 알파벳 점수 계산기

KIMYEONGJUN·2026년 1월 21일
post-thumbnail

문제

내가 생각했을때 문제에서 원하는부분

영소문자로 이루어진 문자열 S가 주어집니다. (1 ≤ |S| ≤ 100000)

문자열의 총 점수를 출력해주세요.

내가 이 문제를 보고 생각해본 부분

입력 문자열 읽기:
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));: BufferedReader 객체를 생성해서 표준 입력(System.in)으로부터 데이터를 읽어올 준비를 한다.
String s = br.readLine();: 사용자(또는 백준 채점 시스템)가 입력하는 한 줄의 문자열을 읽어서 s 변수에 저장합니다. 이 s가 바로 점수를 계산할 대상 문자열이다.
변수 초기화:
long totalScore = 0;: 문자열 전체의 총 점수를 저장할 변수이다. 
문제에서 문자열 길이가 최대 100,000이라고 했고, 각 문자가 최대 26점(연속적으로 'a'부터 'z'까지 오면 'z'는 26점)을 가질 수 있기 때문에, 총점은 100,000 * 26 = 2,600,000 정도가 될 수 있다. 
int 타입으로도 충분히 표현 가능하지만, 혹시 모를 오버플로우를 방지하고 더 넓은 범위를 커버하기 위해 long 타입으로 선언하는 것이 더 안전한 방법이다.
int currentConsecutiveScore = 0;: 현재 보고 있는 문자가 '연속된 오름차순'을 얼마나 길게 유지하고 있는지를 나타내는 점수이다. 
즉, 이전에 계산된 문자의 점수를 저장해서 다음 문자의 점수를 계산할 때 활용하는 역할을 한다.
첫 번째 문자 점수 처리:
if (s.length() > 0) { ... }: 문자열 s가 비어있지 않은지 확인하는 조건문이다. 
문제 조건상 1 <= |S| 이므로 사실상 문자열이 비어있을 일은 없지만, 방어적인 코딩 습관으로 추가할 수 있는 부분이다.
currentConsecutiveScore = 1;: 문제 규칙대로 문자열의 첫 번째 문자는 항상 1점을 받는다.
totalScore += currentConsecutiveScore;: 계산된 1점을 totalScore에 즉시 더해준다.
두 번째 문자부터 반복 처리:
for (int i = 1; i < s.length(); i++) { ... }: for 루프를 사용해서 문자열의 두 번째 문자(인덱스 1)부터 마지막 문자까지 순회한다. 
첫 번째 문자는 이미 처리했으니, i는 1부터 시작하는 거다.
if (s.charAt(i) > s.charAt(i - 1)) { ... }: 현재 문자의 점수를 결정하는 로직이다.
s.charAt(i)는 현재 문자를 가져오고, s.charAt(i - 1)은 바로 이전 문자를 가져온다.
char 타입은 내부적으로 아스키(ASCII) 코드나 유니코드 값으로 표현되기 때문에, 이 값들을 직접 비교하면 사전 순서 비교와 동일한 효과를 준다.
> 연산자를 사용해서 현재 문자가 이전 문자보다 사전 순서상 뒤에 오는지를 확인한다. (예: 'b' > 'a'는 참)
만약 true라면, 오름차순이 계속 이어지고 있다는 의미이므로 currentConsecutiveScore 값을 1 증가시킨다.
else { ... }: if 조건이 false인 경우, 즉 현재 문자가 이전 문자보다 사전 순서상 같거나 앞에 오는 경우이다.
오름차순이 깨졌다는 의미이므로 currentConsecutiveScore를 다시 1로 초기화한다.
totalScore += currentConsecutiveScore;: if-else 블록에서 새롭게 결정된 currentConsecutiveScore 값을 totalScore에 더해준다.
결과 출력 및 리소스 해제:
System.out.println(totalScore);: 모든 문자열에 대한 점수 계산이 끝나면, 최종 합산된 totalScore를 화면에 출력한다.
br.close();: BufferedReader가 사용했던 시스템 리소스를 반환하도록 close() 메서드를 호출한다.

코드로 구현

package baekjoon.baekjoon_32;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

// 백준 34553번 문제
public class Main1274 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String s = br.readLine(); // 입력으로 주어지는 문자열을 읽어옵니다.

        long totalScore = 0; // 모든 문자의 점수를 합산할 변수입니다.
        // 문자열 길이가 최대 100,000이고 각 문자 점수가 최대 26점(z)이므로,
        // 총점은 최대 260만 정도로 int 범위를 넘지 않지만,
        // 혹시 모를 경우를 대비하여 long 타입으로 안전하게 선언했습니다.

        int currentConsecutiveScore = 0; // 현재 연속된 오름차순 길이를 나타내는 점수입니다.

        // 문자열이 비어있지 않은 경우에만 처리합니다. (문제 제약 상 최소 1글자이긴 합니다)
        if (s.length() > 0) {
            // 첫 번째 문자는 항상 1점입니다.
            currentConsecutiveScore = 1;
            totalScore += currentConsecutiveScore; // 총점에 첫 번째 문자의 점수를 더합니다.
        }

        // 두 번째 문자부터 문자열의 끝까지 반복하면서 점수를 계산합니다.
        for (int i = 1; i < s.length(); i++) {
            // 현재 문자와 이전 문자를 비교합니다. (char 타입은 아스키/유니코드 값으로 비교 가능합니다)
            if (s.charAt(i) > s.charAt(i - 1)) {
                // 현재 문자가 이전 문자보다 사전 순으로 뒤에 오면,
                // 연속된 오름차순이 계속되므로 점수를 1 증가시킵니다.
                currentConsecutiveScore++;
            } else {
                // 현재 문자가 이전 문자보다 사전 순으로 같거나 앞에 오면,
                // 오름차순이 끊어진 것이므로 점수를 1로 초기화합니다.
                currentConsecutiveScore = 1;
            }
            // 계산된 현재 문자의 점수를 총점에 더합니다.
            totalScore += currentConsecutiveScore;
        }

        System.out.println(totalScore); // 최종 총 점수를 출력합니다.
        br.close(); // BufferedReader를 닫아 리소스를 해제합니다.
    }
}

마무리

코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.

profile
Junior backend developer

0개의 댓글