변수 i 는 구구단을 각각 세 단씩 나누는 역할을 합니다.

i의 최댓값이 3이 되면 최대 9단까지 만들어 집니다. (3*i + 1에 의해)

#include <stdio.h> 

int main(void)
{
    int x, y, i;
 
    for (i = 1; i < 4; i++){
        for (y = 1; y < 10; y++){
            for (x = 3 * i - 2; x < 3 * i + 1; x++){
                printf("%d * %d = %2d  ", x, y, x*y);
            }
            printf("\n");
        }
        printf("\n");
    }
    return 0;
}



'Algorithm > etc.' 카테고리의 다른 글

사이냅소프트 면접문제  (0) 2017.01.18
완전수 구하기  (0) 2017.01.11
가장 많은 직각삼각형이 만들어지는 둘레(≤ 1000)의 길이는?  (0) 2016.11.03
소인수분해 프로그램  (0) 2016.10.28
Spiral Array  (0) 2016.06.03

주어진 문자열(공백 없이 쉼표로 구분되어 있음)을 가지고 아래 문제에 대한 프로그램을 작성하세요.

이유덕,이재영,권종표,이재영,박민호,강상희,이재영,김지완,최승혁,이성연,박영서,박민호,전경헌,송정환,김재성,이유덕,전경헌

  1. 김씨와 이씨는 각각 몇 명 인가요?
  2. "이재영"이란 이름이 몇 번 반복되나요?
  3. 중복을 제거한 이름을 출력하세요.
  4. 중복을 제거한 이름을 오름차순으로 정렬하여 출력하세요.
package KYU;
 
import java.util.*;
 
public class ex1 {
    public static void main(String args[]) {
        int i, count_kim, count_lee, count_leejae;
        count_kim = 0;
        count_lee = 0;


        count_leejae = 0;
        String names = "이유덕,이재영,권종표,이재영,박민호,강상희,이재영,김지완,최승혁,이성연,박영서,박민호,전경헌,송정환,김재성,이유덕,전경헌";
        String[] arr = names.split(",");
        Set<String> set = new HashSet<String>(); //중복 제거를 위한 HashSet//
        List sortedList;
 
        for (i = 0; i < arr.length; i++) {
            if (arr[i].charAt(0) == '이')
                count_lee++;
            else if (arr[i].charAt(0) == '김')
                count_kim++;
            else
                continue;
        }
        System.out.println("김씨: " + count_kim + "명, 이씨: " + count_lee + "명");
        for (i = 0; i < arr.length; i++) {
            if (arr[i].equals("이재영"))
                count_leejae++;
        }
        System.out.println("이재영: " + count_leejae + "명");
        for (i = 0; i < arr.length; i++) {
            set.add(arr[i]);
        }
        System.out.println("중복 제거: " + set);
        sortedList = new ArrayList(set);
        Collections.sort(sortedList); //오름차순 정렬//
        System.out.println("오름차순 정렬: " + sortedList);
    }
}

자기 자신을 제외한 모든 양의 약수들의 합이 자기 자신이 되는 자연수를 완전수라고 한다.

예를 들면, 6과 28은 완전수이다. (6=1+2+3 // 1,2,3은 각각 6의 약수 28=1+2+4+7+14 // 1,2,4,7,14는 각각 28의 약수)

입력으로 자연수 N을 받고, 출력으로 N 이하의 모든 완전수를 출력하는 코드를 작성하라.

#include <iostream>

using namespace std;

int main()
{
    int input, sum;
    sum = 0;
    cout << "N 이하의 완전수 구하기: ";
    cin >> input;
    cout << "Result: ";
    for (int i = 1; i <= input; i++)
    {
        for (int j = 1; j < i; j++)
        {
            if (i%j == 0)
                sum += j;
            else
                continue;
        }
        if (i == sum)
            cout << i << " ";
        sum = 0;
    }
    cout << endl;
    return 0;
}

중첩 반복문을 사용해서 그런지 숫자가 커질수록 연산속도가 현저히 떨어지는 것 같다. 좀 더 효율적인 알고리즘을 생각해봐야할 듯..

세 변의 길이가 모두 자연수 {a, b, c}인 직각삼각형의 둘레를 p 로 둘 때, p = 120 을 만족하는 직각삼각형은 아래와 같이 세 개가 있다.

{20, 48, 52}, {24, 45, 51}, {30, 40, 50}

1000 이하의 둘레 p에 대해서, 직각삼각형이 가장 많이 만들어지는 p의 값은 얼마인가?

#include <iostream>

using namespace std;

int main()
{
    int a, b, c;
    int count, max_count, p, result_p;
    count = 0;
    max_count = 0;

    for (p = 4; p <= 1000; p++)
    {
        for (a = 1; a <= p / 2; a++)
        {
            for (b = 1; b < p - a - 2; b++)
            {
                c = p - a - b;
                if (a * a + b * b == c * c)
                    count++;
                else
                    continue;
            }
        }
        if (count > max_count)
        {
            max_count = count;
            count = 0;
            result_p = p;
        }
        else
            count = 0;
    }
    cout << "Result: " << result_p << endl;
    cout << "Count: " << max_count << endl;
    return 0;
}

'Algorithm > etc.' 카테고리의 다른 글

사이냅소프트 면접문제  (0) 2017.01.18
완전수 구하기  (0) 2017.01.11
소인수분해 프로그램  (0) 2016.10.28
Spiral Array  (0) 2016.06.03
1~10000까지 숫자 8이 나오는 횟수 구하기  (0) 2016.06.03

소인수분해를 할 수 있는 간단한 프로그램

#include <iostream>

using namespace std;

int main()
{
    int num, i, j;
    int arr[100];

    while (1)
    {
        i = 2;
        j = 0;
        cout << "Input number (0: exit) : ";
        cin >> num;

        while (num != 1 && num != 0)
        {
            if (num == i)
            {
                arr[j] = i;
                break;
            }
            if (num % i == 0)
            {
                num = num / i;
                arr[j] = i;
                j++;
            }
            else
                i++;
        }

        if (num != 1 && num != 0)
        {
            cout << "Result: ";
            for (i = 0; i < j; i++)
            {
                cout << arr[i] << " * ";
            }
            cout << arr[i] << endl;
            cout << endl;
        }
        else if (num == 1)
            cout << "Input a number which is bigger than 1!" << endl;
        else if (num == 0)
            break;
    }
    return 0;
}

문제는 다음과 같다:


6 6

0   1   2   3   4   5
19  20  21  22  23   6
18  31  32  33  24   7
17  30  35  34  25   8
16  29  28  27  26   9
15  14  13  12  11  10

위처럼 6 6이라는 입력을 주면 6 X 6 매트릭스에 나선형 회전을 한 값을 출력해야 한다.

위 문제를 풀기 위해 2차원 동적배열을 선언한 후, 입력하는 가로, 세로 높이 사이즈에 맞게 메모리에 할당 했습니다. 나선형 배열을 구현할 때, 한쪽 벽에 도달하게 되면 방향을 바꾸고, 한 바퀴를 돌게 되는 순간 (나선형 배열을 그리는 방향이 윗쪽으로 바뀌는 순간) wall이라는 int형 변수를 1 증가시킴으로써 바깥쪽의 이미 숫자가 할당된 배열 요소에 다시 숫자를 할당하는 경우가 없도록 방지하는 역할을 하게 됩니다.

#include <stdio.h>
#include <stdlib.h>

#define RIGHT 1
#define DOWN 2
#define LEFT 3
#define UP 4

int main(void)
{
    int height, width, i, j, number, direc, wall;
    int **arr;

    wall = 0;
    direc = RIGHT;
    printf("Size(x * x): ");
    scanf_s("%d %d", &height, &width);

    arr = (int **)malloc(sizeof(int *) * height); //2차원 동적 배열 선언//
    for (i = 0; i < height; i++)
    {
        arr[i] = (int *)malloc(sizeof(int) * width);
    }

    i = 0;
    j = -1;

    for (number = 0; number < height * width; number++)
    { //동적 배열에 숫자 입력//
        if (direc == RIGHT)
        {
            if (j == width - 1 - wall)
            {
                i++;
                direc = DOWN;
            }
            else
                j++;
        }
        else if (direc == DOWN)
        {
            if (i == height - 1 - wall)
            {
                j--;
                direc = LEFT;
            }
            else
                i++;
        }
        else if (direc == LEFT)
        {
            if (j == wall)
            {
                i--;
                direc = UP;
                wall++;
            }
            else
                j--;
        }
        else if (direc == UP)
        {
            if (i == wall)
            {
                j++;
                direc = RIGHT;
            }
            else
                i--;
        }

        arr[i][j] = number;
    }

    for (i = 0; i < height; i++)
    { //모든 숫자 출력//
        for (j = 0; j < width; j++)
        {
            printf("%2d ", arr[i][j]);
        }
        printf("\n");
    }

    for (i = 0; i < height; i++)
    { //2차원 동적배열 해제//
        free(arr[i]);
    }
    free(arr);
    return 0;
}

1부터 10,000까지 8이라는 숫자가 총 몇번 나오는가?

8이 포함되어 있는 숫자의 갯수를 카운팅 하는 것이 아니라 8이라는 숫자를 모두 카운팅 해야 한다.

(※ 예를들어 8808은 3, 8888은 4로 카운팅 해야 함)

###

주어진 숫자를 10으로 나눈 나머지가 곧 각 자리의 숫자가 되므로, 이 숫자가 8일 경우, count 변수를 1씩 증가시켜주면 된다.

답: 4000번

단순하고 직관적으로 코딩하는 것이 가장 어려운 것 같습니다.

#include < stdio.h >

int main(void)
{
    int i, temp, count;
    count = 0;

    for (i = 1; i < 10001; i++)
    {
        temp = i;
        while (i > = 10)
        {
            if (i % 10 == 8)
            {
                count++;
                i /= 10;
            }
            else
            {
                i /= 10;
                continue;
            }
        }
        if (i == 8)
            count++; //10 ~ 21번째 줄 에서 숫자 8이 나오는 순간 count를 1씩 증가시킨다.//
        i = temp;
    }
    printf("1 ~ 10000까지 8이라는 숫자가 나오는 횟수: %d\n", count);
    return 0;
}

'Algorithm > etc.' 카테고리의 다른 글

완전수 구하기  (0) 2017.01.11
가장 많은 직각삼각형이 만들어지는 둘레(≤ 1000)의 길이는?  (0) 2016.11.03
소인수분해 프로그램  (0) 2016.10.28
Spiral Array  (0) 2016.06.03
넥슨 입사문제(제너레이터)  (0) 2016.06.03

어떤 자연수 n이 있을 때, d(n)을 n의 각 자릿수 숫자들과 n 자신을 더한 숫자라고 정의하자. 예를 들어,

d(91) = 9 + 1 + 91 = 101

이 때, n을 d(n)의 제네레이터(generator)라고 한다. 위의 예에서 91은 101의 제네레이터이다.

어떤 숫자들은 하나 이상의 제네레이터를 가지고 있는데, 101의 제네레이터는 91 뿐 아니라 100도 있다. 그런데 반대로, 제네레이터가 없는 숫자들도 있으며, 이런 숫자를 인도의 수학자 Kaprekar가 셀프 넘버(self-number)라 이름 붙였다. 예를 들어 1,3,5,7,9,20,31 은 셀프 넘버 들이다.

1 이상이고 5000 보다 작은 모든 셀프 넘버들의 합을 구하라.

###

풀이: Self Number을 판별하는 함수를 만들고 그 함수가 반환하는 값(참 or 거짓)에 따라 Self Number 여부를 판별하고 참이 나온 수들을 결과값에 해당하는 Result 변수에 저장한다.

제너레이터는 주어진 변수보다 커질 수 없기 때문에, Self_Num 함수에서 반복문의 범위를 var 미만으로 설정했다.

ex) 101의 제너레이터를 구하기 위해 1 부터 100까지 Self_Num 함수를 사용하여 계산한다. 91을 계산하는 순간, 101과 일치하기 때문에 (결과 값이 변수(var)와 같으면? (제너레이터가 존재하면?) -> Self Number가 아니다.) flag를 거짓으로 변경 후 반복문을 빠져나온다.

그 후 flag를 반환한다.(거짓) 만약, 일치하는 수가 없는 경우(제너레이터가 존재하지 않는 경우) 에는 Self Number 이므로 참을 반환한다.

좀 더 효율적인 방법을 찾아봐야할 것 같습니다.

#include <stdio.h>
#define MAX 5000
#define TRUE 1
#define FALSE 0

int Self_Num(int var);

int main(void)
{
    int i, result;
    result = 0;

    for (i = 1; i < MAX; i++)
    {
        if (Self_Num(i) == TRUE)
            result += i;
        else
            continue;
    }

    printf("Sum of Self Numbers: %d\n", result);
    return 0;
}

int Self_Num(int var) //Self Number을 판별하는 함수//
{
    int i, digit_sum, result, temp, flag;
    digit_sum = 0;
    flag = TRUE;

    for (i = 1; i < var; i++)
    {
        temp = i;

        while (i >= 10)
        { //각 자릿수의 합//
            digit_sum += i % 10;
            i /= 10;
        }
        digit_sum += i;

        result = temp + digit_sum; //각 자릿수 + 원래 숫자//

        if (result == var)
        { //결과 값이 변수와 같으면? (제너레이터가 존재하면? -> Self Number가 아니다.)
            flag = FALSE;
            break;
        }

        else
        {
            digit_sum = 0;
            i = temp;
            continue;
        }
    }
    return flag;
}

+ Recent posts