코드업 기초 100제 1019 (3)

업데이트:


[1019] 연월일 입력받아 그대로 출력하기

[입력] 2013.8.5
[출력] 2013.08.05

//이거 틀린 코드이니 자세하게 보지마세요,,
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
		String date = sc.nextLine();
		char a = '0';
		int secondDot = 0;
		int year = 0, month = 0, day = 0;
		for (int i = 0; i < date.length(); i++) {
			a = date.charAt(i);
			if (i > 4 && a == '.') {
				secondDot = i;
			}
		}
		for (int i = 0; i < date.length(); i++) {
			a = date.charAt(i);
			if (i <= 3) {
				if (i == 0) {
					year += (a - '0') * 1000;
				} else if (i == 1) {
					year += (a - '0') * 100;
				} else if (i == 2) {
					year += (a - '0') * 10;
				} else {
					year += (a - '0') * 1;
				}
			}
			if (i > 4 && i < secondDot) {
				if (secondDot == 6) {
					month = a - '0';
				}
				if (secondDot != 6) {
					if (i == 5) {
						month += (a - '0') * 10;
					} else {
						month += (a - '0') * 1;
					}
				}
			}
			if (i > secondDot && a != '.') {
				if (date.length() - secondDot == 2) {
					day = a - '0';
				} else {
					if (i - secondDot == 1) {
						day += (a - '0') * 10;
					} else {
						day += (a - '0') * 1;
					}
				}

			}
		}
		if (month >= 10 && day >= 10)
			System.out.printf("%d.%d.%d", year, month, day);
		else if (month < 10 && day >= 10)
			System.out.printf("%d.0%d.%d", year, month, day);
		else if (month < 10 && day < 10)
			System.out.printf("%d.0%d.0%d", year, month, day);
		else
			System.out.printf("%d.%d.0%d", year, month, day);
    }
}


일단 장황한 코드에도 불구하고 결과를 말해보자면 틀렸다. 테스트 케이스 자체가 yyyy.m.ddl이 형식에서 바뀌어봤자 월, 일 부분만 바뀌는 줄 알았는데 생각지도 못한 yy.mm.dd에 당황X1000







이렇게 위 사진처럼 돌아가서 뿌듯함에 취했을 때,, 제출을 눌러보니,, 20200922_01

daying
secondDot처럼 firstDot 값을 구해 정답을 맞추고 싶었지만 정처기 때문에 시간이 없어서 결국 답을 보기로 했다. 그래도 57점이나 맞은게 어디야,,
아래는 정답 코드다.

import java.util.Scanner;
 
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String a = sc.next();
        String[] arr = a.split("\\.");
        int A = Integer.valueOf(arr[0]);
        int B = Integer.valueOf(arr[1]);
        int C = Integer.valueOf(arr[2]);
        System.out.printf("%04d.%02d.%02d", A, B, C);
    }
}

정답을 보고 정말 놀라지 않을 수가 없다,, 나는 어차피 ‘yyyy.m.d’ 형식이랑 비슷할테니 아예 첫 번째 닷(.)은 필수적으로 i = 0이라는 전제 하에 네 번째에 올테니, i가 0 ~ 3일때 하나하나 처리해주고,month를 구할 때도 이와 비슷하게 구했는데 저렇게 간단한 방법이 있었을 줄이야,, 아무래도 코딩 머리는 아닌걸지도 몰라,,

일단 정답 코드를 보면 split()이 눈에 띄어서 찾아봤더니 split은 괄호 안에 있는 정규 표현식 기준으로 부분 문자열을 추출해줘서 일단 String 타입 배열 arr에 분리된 문자열을 넣은 후, int 타입 A, B, C 변수에 형변환으로 분리된 문자열 들을 넣고 간단하게 서식 문자열yyyy.mm.dd의 형식을 맞춰주었다. 참고로 split 괄호 안에 \\. 이 값이 들어간 이유는 .(dot)은 예약어\를 붙이고, \역시 예약어라 두 개를 붙이면 .(dot)을 이용해 split 메소드를 사용할 수 있다.
답을 보고 나니 나의 코드가 너무 부끄럽지만 그래도 나중엔 다 밑거름이 되겠지,,


참고

태그:

카테고리:

업데이트:

댓글남기기