Self Number 찾기

대엽님 블로그에서 퀴즈를 발견하고 원문을 보고 풀었는데 원문에는 파이썬 코드인지 모르는 문법이라 그런가 눈에 잘 안들어오네요. 대엽님이 푼 코드는 자바여서 역시 눈에 잘 들어오더군요. 문제를 다르게 풀 수 있을 것 같아서 코딩을 해봤습니다.

저는 1~4999까지 배열을 만들고 Generated 숫자가 될 수 있는 것들[footnote]다른 말로 generator를 가지고 있는 수[/footnote]을 지워나갔습니다.[footnote]해당 index안에 들어있는 수를 0으로 만들었습니다.[/footnote] 지우고 남는 숫자들이 Self Number들이기 때문에 나중에 배열에 들어있는 수를 쫙 더해주면 됩니다.

[#M_ more.. | less.. | public class SumOfSelfNumber {
    public static void main(String[] args) {
        new SumOfSelfNumber().start();
    }

    private void start() {
        int[] numbers = makeArray();
        checkSelfNumber(numbers);
        System.out.println(addAllSelfNumber(numbers));
    }

    private int[] makeArray() {
        int[] numbers = new int[4999];
        for (int i = 1; i < 5000; i++) {
            numbers[i-1] = i;
        }

        return numbers;
    }

    private void checkSelfNumber(int[] numbers) {
        for (int i = 0 ; i < numbers.length ; i++) {
            int generatedNumber = 0;
                generatedNumber = generate(i+1);
            if (generatedNumber != 0 && generatedNumber < 5000) {
                numbers[generatedNumber – 1] = 0;
            }
        }
    }

    private int generate(int number) {
        char[] chars = new String(number+””).toCharArray();
        int[] ints = new int[chars.length + 1];
        ints[0] = number;
        for (int j = 1; j < ints.length; j++) {
            ints[j] = (int)chars[j-1] – 48;
        }

        int generatedNumber = 0;
        for (int i = 0; i < ints.length; i++) {
            generatedNumber += ints[i];
        }

        return generatedNumber;
    }

    private long addAllSelfNumber(int[] numbers) {
        long sum = 0;
        for(int i : numbers)
            sum += i;
        return sum;
    }
}_M#]
코딩할 때 불편한 점은 int -> char -> int 이 과정에서 숫자가 변질 되는데 이것좀 어떻게 편하게 바꿀 수 있는 방법이 없을지 궁금하네요.

대엽님 코드를 보니 (int)c – (int)‘0’ 이런 방법으로  char 안에 들어간 int값을 그대로 살려냈는데 저도 마찬가지로 (int)chars[j-1] – 48 이런식으로 int값을 살려냈습니다. 좋은 방법 아시는 분~

여행 경비 구하기 수정

비용이 12.00으로 나온 이유를 보기 위해 중간 중간 값을 찍어봤습니다.
bl106.bmp9.0049999 이건 원래 값이 9.005 인데 표기가 잘 못 된 것이기에 이렇게 바꿔주는 메소드를 구현했습니다.

중간 중간 값을 보니 무엇이 틀린지 알 수 없습니다. 문제가 의도한 닶인 11.99센트를 도출하려면 평균 값은 0.5 센트라는 개념이 있는 존재하는 것으로 생각을 하다가 돈을 배급할 때는 0.5 센트 개념은 없는 것으로 생각해야 합니다. 그래야 11.99센트가 나옵니다.

bl107.bmp그래서 문제가 의도한 대로 문제를 해결해주었습니다. 그런데 정말 이게 맞는 건지 모르겠군요. 11.99센트가 이동한다라…흠~ 잘 이해가 안되는군요.ㅠ.ㅠ

어쨋든 원하는 답을 도출해 줬다는거~

bl108.java

여행 경비 구하기

팀으로 여행을 하는 경우 여행에서의 경비를 각자가 알아서 지불 한 뒤에 맨 나중에 각자 지불한 금액들을 보고 1센트 단위로 정리를 한다고 합니다.

이 때 이동되는 금액의 총액을 구하는 것이 문제입니다.

입력은 다음과 같이 합니다.
3 =>3명이 여행을 했음을 알려줍니다.
10.00
20.00
30.00  => 세명이 각자 지불한 금액을 입력합니다.
4 => 4명이 여행을 했음을 알려줍니다.
15.00
15.01
3.00
3.01 => 네명이 각자 지불한 금액을 입력합니다.
0 => 종료 조건입니다.[footnot]인원수가 0일 경우 입력을 종료합니다.[/footnote]

출력은 다음과 같이 합니다.
$10.00  => 처 번째 팀의 이동되는 비용
$11.99  => 두 번째 팀의 이동되는 비용

퀴즈 2번과 비슷한 템플릿으로 풀었습니다. 특별한 내용이 없기 때문에 무난한게 풀 수 있는 내용인 것 같습니다.
bk92.zip

지뢰찾기

지뢰찾기를 풀어주는 프로그램을 만들어야 합니다.

입력은 다음과 같이 합니다.

첫번째 줄에는 지뢰찾기 게임판의 크기를 정해주는 입력값이 들어갑니다.

x = 3 y = 5 <엔터>
*..<엔터>
…<엔터>
..*<엔터>
.*.<엔터>
…<엔터>
x = 2 y = 2 <엔터>
..<엔터>
.*<엔터>
x = y = 0<엔터>

이렇게 x = y = 0을 만나거나 지뢰밭을 잘못 그리는 경우[footnote]x는 가로의 길이 y는 세로의 길이[/footnote]에는 적당한 메시지 출력과 함께 프로그램을 종료 시킵니다.

출력은 다음과 같습니다.

1번째 지뢰판
*10
121
12*
1*2
2번째 지뢰판
11
1*

Spring 공부하다가 머리를 식히기 위해…보았으나.. 머리가 더 아파오는~

풀었습니다.
GMap.java -> 하나의 지뢰 찾기 맵을 클래스로 만들고
GMapManager.java -> 요개 지뢰 맵 퀴즈를 돌리는 주요 클래스고
GMapTest.java -> 요개 test하는 클래스입니다.
bk91.zip

3n+1 문제

문제 : http://realstudy.tistory.com/36

간략히 간추리면 n이 1이 될 때까지 n이 짝수면 2로 나누고 n이 홀수면 3n + 1을 합니다.

22일 때를 예로 들면
22     11     34     17     52     26     13     40     20     10     5     16     8     4     2     1

22가 1이 될 때까지 위의 규칙에 따라가다보면 총 16개의 숫자[footnote]1과 22도 포함합니다.[/footnote]를 보게 됩니다. 이 갯수를 ‘싸이클의 길이’라고 한답니다.

작성할 프로그램은 두 수를 입력 받아서 그 두 수 사이의 모든 수 들의 ‘싸이클의 길이’를 구해서 그 중에 가장큰 ‘싸이클의 길이’를 출력해 주는 것입니다.

내일 낮에 풀어야 할 문제인데 잠자면서 미리 풀어둬야겠습니다.

와 풀었다~

bk36.java
bk37.java