개발 As 공부/Algorithm
[백준] 8595번: 히든 넘버 - JAVA
민킹
2022. 4. 7. 14:56
문제 보기
문제 분석
[요약]
문자열 하나가 주어진다. 주어진 문자열 사이 사이에 존재하는 숫자를 찾아 모두 더하여 출력한다.
[푸는 과정]
오랜만에 한 시간 넘게 잡고 있던 알고리즘 문제다. 왜냐하면... 지금부터 썰을 풀어볼 것이다.
//문제를 대충 읽었어요..
처음에는 그냥 모든 숫자를 일의자리 숫자 취급하여 더해버렸다(문제를 제대로 읽자..ㅎ). 당연히 오답. 자세히 살펴보니 붙어있는 숫자는 하나의 숫자 취급을 해 주어야 한다. 예를 들어 'a555d222f6d5s1'이라는 문자열에 숨어있는 숫자는 '555', '222', 6', '5', '1' 이 되고 555+222+6+5+1 = 789가 정답이 된다.
//로직이 틀렸어요..
이제 문제를 제대로 파악했으니 코드를 짜 본다. 또 오답이다. 이건 내 로직이 완벽하지 못했기 때문이었다. 내가 짠 로직은 마지막 부분에서 출력하기 직전에 한번 더 계산이 필요한 로직이었다. 하지만 마지막 계산을 빼먹고 출력하고 있었기에 오답. 스스로 테스트 케이스 10가지 정도를 만들어 테스트 해 보고 다 통과시켰다. 이제는 정답이겠지?
//내가 바보였어요..
아니 또 오답이다. 내가 테스트 해 보지 못한 케이스가 뭐가 있을까? 사실 위 과정은 빨리 끝났는데 마지막 과정에서 40분정도 걸린 것 같다. 왠만한건 다 테스트 해봤는데 도저히 못 찾겠다.. 뭐냐...
찾았다. 바로 자료형이다. 문제의 입력부를 보면 '단어의 길이 n (1 ≤ n ≤ 5,000,000)이 주어진다.'라고 적혀있다. 이 부분을 안 읽은건 아니다. 그저 착각했을 뿐... 단어의 길이가 5,000,000인것인데 순간 int 자료형의 최대 값 '2,147,483,647'과 헷갈린 것이다. 값이 아니라 숫자의 길이를 생각 했어야 하는 것이다. int로 더해주던 결과값을 모두 long으로 수정하였고 드디어 정답행!
코드 보기
import java.io.*;
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());
String line = br.readLine();
//나온 숫자들을 더한 값.
long total = 0;
//연속해서 나오는 숫자를 저자하기 위한 임시 문자열.
String temp = "0";
for(int i=0; i<N; i++){
char target = line.charAt(i);
//0~9의 숫자를 구분하기 위해 아스키코드 사용.
if(target >= 48 && target <= 57){
temp += String.valueOf(target);
} else{
total += Long.valueOf(temp);
//NumberFormatException을 피하기 위해 "0"으로 설정.
temp = "0";
}
}
System.out.println(total + Long.valueOf(temp));
}
}
What I learned today... is...
아무리 로직을 수정해도 계속 틀린다?(어느정도 로직에 대한 확신이 있는데도 불구하고) 그럼 기본적인 것 부터 다시 살펴봅시다.. 분명 무언가 빠뜨린 예외사항이 있을 것
오늘도 화이팅이다! 글을 마치기 전 이 문제를 꼭 맞추겠다는 나의 (오기와) 의지를.. 박제...한다... (내가 이 문제 정답율 떨어뜨린거 아닌가 모르겠네 허허ㅠㅋㅋㅋ)