오늘 대박 지각을 했다. 어제 새벽 5시까지 작업을 하고 있었는데 분명히 나는 열심히 코드를 작성하고 있었는데 오후 12시였다. 분명 난 앉아있었는데... 그래서 오전 11시30분부터 진행하는 CS스터디도 참여를 못했다.. 뭐하는 놈인가 이거..

이렇게 시간을 효율적으로 관리하지 못하면 안된다. 그래서 어제 일과 계획표도 열심히 짰는데, 이번주는 이미 꼬여버린 것 같고 주말 하루는 회고하고 휴식을 하며 충전을 하고 다음주 월요일부터 계획표 대로 체계적인 일과를 진행해야겠다.

1. 알고리즘 실전 테스트

지난 화요일 알고리즘 모의고사를 실시했다. 그때 문제는 일과 중에 연습하던 문제들 보다는 확실히 난이도가 낮아서 큰 어려움이 없이 해결 후 제출했다. 오늘도 마찬가지 문제의 난이도는 충분히 해낼 수 있었다.

내가 선택한 문제는 "자연수 뒤집어 더하기". 이전에 연습하던 문제 중 풀어봤던 문제였는데 예를 들어 매개변수로 정수 12345가 주어진다면 거꾸로 나열해 54321을 return하는 메소드를 구현했다면 이번에는 "5+4+3+2+1=15" 이런식으로 문자열을 return 하는 문제였다.

예전에는 "12345"를 문자열로 형변환 후 split() 메소드로 쪼개어 배열로 만든 다음 내림차순으로 정렬 후 다시 join() 메소드로 이어 붙여 다시 정수로 형변환 후 return 하는 알고리즘을 구현했지만 그 당시 새로 배운 풀이법을 이번 테스트에 적용해보았다.

public class Main {
	public int solution(int n) {
    	int answer = 0;
        
    	for (int i = n; i > 0; i /= 10) {
        	answer += (i % 10);
        }
        
        return answer;
    }
    
    public static void main(String args[]) {
    	Main main = new Main();
        int test = main.solution(12345);	// 15
    }
}

우선 정수 12345가 주어졌을 때, 12345에서부터 0이 되기 전까지 10씩 나눠 가며 감소하는 반복을 한다.

저런 반복을 하는 이유는 n(12345)에서 10씩 나누어 가면

718253
71825.3
7182.53
718.253
71.8253
7.18253

이런식으로 소숫점이 한칸씩 앞으로 이동하게 된다. 그런데 int 타입의 특성상 실수의 값이 되면 소숫점 아래의 수는 모두 버림을 한다. 따라서

718253
71825
7182
718
71
7

i는 이렇게 감소하게 된다. 이 i 값을 활용해 각 자릿수도 얻어 낼 수 있는데 어떠한 수의 각 자릿수를 알아낼 수 있는 방법은 (i % 10) i에서 10을 나눈 나머지 값이 각 자릿수가 된다.

i % 10 = 3
i % 10 = 5
i % 10 = 2
i % 10 = 8
i % 10 = 1
i % 10 = 7

이렇게 각 자릿수가 구해졌으니 미리 선언해둔 answer에 누적시켜주면 자릿수의 합이 구해진다. 사실 각 자리수의 합을 구할거면 거꾸로 뒤집을 필요도 없는건데...ㅎㅎ

나는 for문으로 처리를 했는데 원래 내가 배웠을 때는 while문으로 되어 있었다. 이러한 경우 보통 while문으로 처리하긴 한다.

public class Main {
	public int solution(int n) {
    	int answer = 0;
        
        while (n > 0) {
        	answer += (i % 10);
            n /= 10;
        }
        
        return answer;
    }
    
    public static void main(String args[]) {
    	Main main = new Main();
        int test = main.solution(12345);	// 15
    }
}

이런 문제에서는 값을 구하고나면 땡이니까 이렇게 직접적으로 n의 값에 변화를 줘도 문제가 없지만 만약 어떠한 프로그램인 경우 n을 다시 사용해야 한다면? 그럴 때는 for문으로 지역변수의 값을 연산하여 처리해주는 것이 좋을것이라 생각한다. 그렇게 되면 n의 값을 지킬 수 있을테니까.

결론은 알고리즘 테스트 무사 통과 했다.

2. 항해99 2주차 과제 완성

class 문법을 기반으로 객체 지향 프로그래밍에 대한 이해도를 높이기 위한 미션이었다 생각한다. 미션의 목적은 그러했다. 사실 그렇게 어렵지 않은 기능을 구현 하는 것이었기에 이렇게 시간이 오래 걸릴 일도 아니었다. 하지만 오래 걸렸던 이유는 기능 정의서의 시나리오에 조금의 오차가 있었기 때문이다. 누적금액이 정상적으로 흘러간다면 예를들어 18000원이 나와야 하는데 시나리오에는 19000원으로 나와있는 것이다. 그래서 혹시 이동 거리가 일정 값이 이상이면 할증이 붙어야 하나?

또 하나는 버스의 기능 정의서에 속도, 가속/감속, 주행시작에 관한 정보를 포함하고 있으라 나와 있지만 시나리오에서는 전혀 테스트 하는 항목이 없었다. 시나리오에 없다면 그냥 선언만 하고 코드에 내포하고 있으면 그만이겠지만 주유량에 대한 정보도 있었는데 주유량이 감소하고 증가하는 메소드는 또 테스트 항목에 있었다. 만약 연료가 감소한다는 것은 주행을 했기 때문인데 주행을 했다면 속도가 증가 했을 것이고. 어떠한 연결고리로 메소드가 동작해야 하며, 어떠한 상관관계로 속도가 얼마 증가하면 주유량이 얼마 감소 되어야 하지? 라는 생각을 하면서 이런 저런 시도를 하면서 시간을 많이 보냈던 것 같다. (어제 밤을 새웠던 이유이다...) 그렇게 깊게 생각할 필요도 없는 문제였다. 그저 시나리오에서 요구한 값만 도출 되면 되는 것이고 목적이 객체 지향 프로그래밍에 대한 이해 였기 때문에 그저 클래스 문법을 잘 활용하고 공부만 되면 되는 것이었다.

지금까지 나의 억울함에 대한 호소였다!

결과적으로는 마무리 해서 과제 제출을 잘 하였고 이번에도 과제를 진행하면 얻은 것이 많다. 예전 퍼블리셔로 직장 생활을 할 때 개발에 대한 공부 열의가 넘쳐 퇴근 후 국비지원을 받아 자바 한달 과정을 들었던 적이 있다. 그리고 또 틈틈이 시간날 때 마다 "혼자 공부하는 자바" 책을 독학하기도 했고 추상 클래스(Abstract)까지는 배웠던 것 같다. 지금은 또 가물가물 하긴 하지만 이번 과제를 통해 다시 리마인드가 되고 더 지식이 짙어지는 유익한 시간이었다.

어제 이야기 했듯, class 문법에서 정말 중요한 개념인 오버라이딩(overriding)과 오버로딩(overloading)에 대해 설명을 할텐데 TIL이 너무 길어지는 것을 원치 않기에 따로 기술 블로그에 작성하였다.

[Java]class: 오버라이딩(overriding)과 오버로딩(overloading)

0개의 댓글