ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JUNGOL...47
    일지 2021. 3. 4. 12:06

    Beginner_Coder/도형만들기2/숫자삼각형


    문제                                            

    삼각형의 높이 n과 종류 m을 입력받은 후 다음과 같은 삼각형 형태로 출력하는 프로그램을 작성하시오.

     

    < 처리조건 >

    종류 1번의 숫자의 진행 순서는 처음에 왼쪽에서 오른쪽으로 진행 한 후 방향을 바꾸어서 이를 반복한다.

    1                 
    3 2              
    4 5 6            
    10 9 8 7         
    11 12 13 14 15
    0 0 0 0 0 0 0 0 0
    1 1 1 1 1 1 1
    2 2 2 2 2
    3 3 3
    4
    1      
    1 2   
    1 2 3
    1 2  
    1    
    종류1 종류2 종류3

     

    입력 형식                                     

    삼각형의 크기 n(n의 범위는 100 이하의 홀수)과 종류 m(m은 1부터 3사이의 정수)을 입력받는다.

     

    출력 형식                                     

    위에서 언급한 3가지 종류를 입력에서 들어온 높이 n과 종류 m에 맞춰서 출력한다. 숫자사이는 공백으로 구분한다.

    입력된 데이터가 주어진 범위를 벗어나면 "INPUT ERROR!"을 출력한다.

     

    입력 예                                        

    7 3                  | 3 2

     

    출력 예                                        

    1                    | 0 0 0 0 0

    1 2                 |    1 1 1

    1 2 3               |      2

    1 2 3 4            | 

    1 2 3               | 

    1 2                 | 

    1                    | 


    NumberTriangle.h

    #include <iostream>
    
    class NumberTriangle: public Base
    {
    private:
    	void Case1(int n);
    	void Case2(int n);
    	void Case3(int n);
    }

     

    NumberTriangle.cpp

    void NumberTriangle::Code()
    {
    	int n, m;
    
    	std::cin >> n >> m;
    
    	if (n < 1 || n > 100 || n % 2 == 0 || m < 1 || m > 3)
    	{
    		std::cout << "INPUT ERROR!";
    	}
    	else
    	{
    		switch (m)
    		{
    		case 1:
    			Case1(n);
    			break;
    		case 2:
    			Case2(n);
    			break;
    		case 3:
    			Case3(n);
    			break;
    		}
    	}
    }
    
    void NumberTriangle::Case1(int n)
    {
    	int num{ 1 };
    	for (int i = 1; i <= n; i++)
    	{
    		if (i % 2 == 1)
    		{
    			for (int j = 0; j < i; j++)
    			{
    				std::cout << num++ << ' ';
    			}
    			num = num + i;
    		}
    		else
    		{
    			for (int j = 0; j < i; j++)
    			{
    				std::cout << num-- << ' ';
    			}
    			num = num + i + 1;
    		}
    		std::cout << '\n';
    	}
    }
    
    void NumberTriangle::Case2(int n)
    {
    	int num{ 0 };
    	for (int i = n; i > 0; i--, num++)
    	{
    		for (int j = n; j > i; j--)
    		{
    			std::cout << "  ";
    		}
    
    		for (int j = 0; j < 2 * i - 1; j++)
    		{
    			std::cout << num << ' ';
    		}
    		std::cout << '\n';
    	}
    }
    
    void NumberTriangle::Case3(int n)
    {
    	for (int i = 0; i <= n / 2; i++)
    	{
    		for (int j = 0; j <= i; j++)
    		{
    			std::cout << j + 1 << ' ';
    		}
    		std::cout << '\n';
    	}
    
    
    	for (int i = 0; i < n / 2; i++)
    	{
    		for (int j = 0; j < n / 2 - i; j++)
    		{
    			std::cout << j + 1 << ' ';
    		}
    		std::cout << '\n';
    	}
    }

     

    Beginner_Coder/도형만들기2/달팽이삼각형


    문제                                            

    삼각형의 높이 N을 입력받아서 아래와 같이 숫자 0부터 달팽이 모양으로 차례대로 채워진 삼각형을 출력하는 프로그램을 작성하시오.

     

    < 처리조건 > 

    왼쪽 위부터 시계방향으로 오른쪽 아래로 이동하면서 숫자 0부터 N개를 채우고 

    다시 왼쪽으로, 다음은 위쪽으로 반복하면서 채워 나간다. (숫자 9 다음에는 0부터 다시 시작한다.)

     

    입력 형식                                     

    삼각형의 한변의 길이 N(N의 범위는 100 이하의 양의 정수)을 입력받는다.

     

    출력 형식                                     

    주어진 형태대로 높이가 N인 달팽이 삼각형을 출력한다. 숫자 사이는 한 개의 공백으로 구분한다.

     

    입력 예                                        

    6

     

    출력 예                                        

    0

    4 1

    3 5 2

    2 0 6 3

    1 9 8 7 4

    0 9 8 7 6 5


    SnailTriangle.h

    #include <iostream>
    
    class SnailTriangle : public Base
    {
    private:
    	enum class SnailDirection { RightDown, Left, Up, Done };
    
    	SnailDirection RightDown(int** arr, int n, int& i, int& j, int& num);
    	SnailDirection Left(int** arr, int n, int& i, int& j, int& num);
    	SnailDirection Up(int** arr, int n, int& i, int& j, int& num);
    }

     

    SnailTriangle.cpp

    void SnailTriangle::Code()
    {
    	int n;
    
    	std::cin >> n;
    
    	int** arr = new int* [n];
    	for (int i = 0; i < n; i++)
    	{
    		arr[i] = new int[n];
    		for (int j = 0; j < n; j++)
    		{
    			arr[i][j] = -1;
    		}
    	}
    
    	int num{ 0 };
    	int i{ 0 }, j{ 0 };
    	SnailDirection direction{ SnailDirection::RightDown };
    	while (true)
    	{
    		switch (direction)
    		{
    		case SnailDirection::RightDown:
    			direction = RightDown(arr, n, i, j, num);
    			break;
    		case SnailDirection::Left:
    			direction = Left(arr, n, i, j, num);
    			break;
    		case SnailDirection::Up:
    			direction = Up(arr, n, i, j, num);
    			break;
    		}
    
    		if (num > 9)
    		{
    			num = 0;
    		}
    
    		if (direction == SnailDirection::Done)
    		{
    			break;
    		}
    	}
    
    	for (int i = 0; i < n; i++)
    	{
    		for (int j = 0; j < n; j++)
    		{
    			if (arr[i][j] != -1)
    			{
    				std::cout << arr[i][j] << ' ';
    			}
    		}
    		std::cout << '\n';
    	}
    
    	for (int i = 0; i < n; i++)
    	{
    		delete[] arr[i];
    	}
    	delete[] arr;
    }
    
    SnailTriangle::SnailDirection SnailTriangle::RightDown(int** arr, int n, int& i, int& j, int& num)
    {
    	if (i >= n || arr[i][j] != -1)
    	{
    		i -= 1;
    		j -= 2;
    
    		if (arr[i][j] != -1)
    		{
    			return SnailDirection::Done;
    		}
    
    		return SnailDirection::Left;
    	}
    
    	arr[i++][j++] = num++;
    	
    	return SnailDirection::RightDown;
    }
    
    SnailTriangle::SnailDirection SnailTriangle::Left(int** arr, int n, int& i, int& j, int& num)
    {
    	if (j < 0 || arr[i][j] != -1)
    	{
    		i -= 1;
    		j += 1;
    
    		if (arr[i][j] != -1)
    		{
    			return SnailDirection::Done;
    		}
    
    		return SnailDirection::Up;
    	}
    
    	arr[i][j--] = num++;
    
    	return SnailDirection::Left;
    }
    
    SnailTriangle::SnailDirection SnailTriangle::Up(int** arr, int n, int& i, int& j, int& num)
    {
    	if (i < 0 || arr[i][j] != -1)
    	{
    		i += 2;
    		j += 1;
    
    		if (arr[i][j] != -1)
    		{
    			return SnailDirection::Done;
    		}
    
    		return SnailDirection::RightDown;
    	}
    
    	arr[i--][j] = num++;
    
    	return SnailDirection::Up;
    }

     

    NadanKim/CodingTest_JUNGOL: JUNGOL 코딩 테스트를 위한 저장소 (github.com)

     

    NadanKim/CodingTest_JUNGOL

    JUNGOL 코딩 테스트를 위한 저장소. Contribute to NadanKim/CodingTest_JUNGOL development by creating an account on GitHub.

    github.com

     

    댓글

Designed by Tistory.