[백준] 8595. 히든 넘버

1 분 소요

문제 링크

[백준] 8595. 히든 넘버


풀이 과정

다음은 정규식으로 푼 코드입니다.


Pattern 과 Matcher 를 사용했습니다.


Pattern pattern = Pattern.compile("([\\d]+)[a-zA-Z]+([\\d]+)");

히든 넘버 사이에는 적어도 하나 이상의 문자가 있어야 하므로 위와 같이 패턴을 작성했습니다.


while (matcher.find(idx)) {
    if (first) {
        sum += Integer.parseInt(matcher.group(1));
        first = false;
    }

    sum += Integer.parseInt(matcher.group(2));
    idx = matcher.end() - 1;
}

첫 매칭과 나머지 매칭으로 구분했습니다. 처음 매칭에선 매칭된 두 히든 넘버를 모두 더해준 뒤, 나머지 매칭에서는 뒤의 히든 넘버만 누적해줬습니다.


import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        String word = sc.next();
        long sum = 0;

        Pattern pattern = Pattern.compile("([\\d]+)[a-zA-Z]+([\\d]+)");
        Matcher matcher = pattern.matcher(word);
        int idx = 0;
        boolean first = true;

        while (matcher.find(idx)) {
            if (first) {
                sum += Integer.parseInt(matcher.group(1));
                first = false;
            }

            sum += Integer.parseInt(matcher.group(2));
            idx = matcher.end() - 1;
        }

        System.out.println(sum);
    }
}


정규식 패턴에 매칭되는 문자열을 매번 검색하다 보니, 아래 작성한 코드보다 5배 시간이 더 오래 걸리는 모습을 확인할 수 있습니다.


위 예시에서의 히든 넘버는 13, 9, 07 입니다. 이 숫자들을 더하면 정답 29가 됩니다.

단어의 각 문자를 순회하며, 다음과 같은 작업을 합니다.

  1. 현재 가리키는 문자가 숫자라면, 이전까지 누적된 히든 넘버 tmp에 해당 숫자도 포함시킵니다.
  2. 숫자가 아니라면, 현재까지 만들어진 히든 넘버 tmp을 변수 sum에 누적시킵니다.

다음은 히든 넘버를 찾는 일부 과정을 작성한 것입니다.


<img src="http://dl.dropbox.com/s/cf68n06k0iec498/%EB%B0%B1%EC%A4%80-8595_%ED%9E%88%EB%93%A0%20%EB%84%98%EB%B2%84-3.png>

숫자이므로, 이전까지 만들어진 히든 넘버 tmp 에 숫자 1을 추가해줍니다.


숫자이므로, 이전까지 만들어진 히든 넘버 tmp 에 숫자 3을 추가해줍니다.


숫자가 아니므로, 이전까지 만들어진 히든 넘버 tmp 을 변수 sum 에 누적시킨 뒤, tmp 을 0으로 초기화 해줍니다.


코드

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        char[] word = sc.next().toCharArray();
        int sum = 0, tmp = 0;

        for (int i = 0; i < N; i++) {
            if (word[i] >= '0' && word[i] <= '9') {
                tmp = tmp * 10 + word[i] - '0';
            } else {
                sum += tmp;
                tmp = 0;
            }
        }

        sum += tmp;
        System.out.println(sum);
    }
}

카테고리:

업데이트:

댓글남기기