[백준] 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가 됩니다.
단어의 각 문자를 순회하며, 다음과 같은 작업을 합니다.
- 현재 가리키는 문자가 숫자라면, 이전까지 누적된 히든 넘버 tmp에 해당 숫자도 포함시킵니다.
- 숫자가 아니라면, 현재까지 만들어진 히든 넘버 tmp을 변수 sum에 누적시킵니다.
다음은 히든 넘버를 찾는 일부 과정을 작성한 것입니다.
숫자이므로, 이전까지 만들어진 히든 넘버 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);
}
}
댓글남기기