문제

주어진 수 N개 중에서 소수가 몇 개인지 찾아서 출력하는 프로그램을 작성하시오.


입력

첫 줄에 수의 개수 N이 주어진다. N은 100이하이다. 다음으로 N개의 수가 주어지는데 수는 1,000 이하의 자연수이다.


출력

주어진 수들 중 소수의 개수를 출력한다.


코드

#include <iostream>
#include <cmath>

using namespace std;

static int IsPrimeNumber(int _number)
{
    // :: 예외처리
	if (_number == 1) return 0;
	if (_number == 2) return 1;
	
    // :: 2부터 sqrt(_number)까지 나누어 떨어지는 수가 있는지 확인한다.
    int i;
    for (i = 2; i <= sqrt(_number); i++) if (_number % i == 0) return 0;

    // :: 소수인 경우
    return 1;
}
int main()
{   
    // :: 문제
    // :: 주어진 수 N개 중에서 소수가 몇 개인지 찾아서 출력하는 프로그램을 작성하시오.
    // :: 첫 줄에 수의 개수 N이 주어진다. N은 100이하이다. 다음으로 N개의 수가 주어지는데 수는 1,000 이하의 자연수이다.
    // :: 주어진 수들 중 소수의 개수를 출력한다.

    // :: 1. N개의 수를 입력받는다.
    int N;
    cin >> N;

    // :: 2. 소수인지 판별한다.
    int primeNumberCount = 0;
    for (int i = 0; i < N; i++)
    {
        int num;
        cin >> num;
        primeNumberCount += IsPrimeNumber(num);
    }

    // :: 3. 소수의 개수를 출력한다.
    cout << primeNumberCount << endl;

    return 0;
}

참고

'C++ > Baekjoon' 카테고리의 다른 글

백준 2581: 소수  (0) 2023.01.29
백준 11653: 소인수분해  (0) 2023.01.26
백준 1929: 소수 구하기  (0) 2023.01.24
백준 5597: 과제 안 내신 분..?  (0) 2022.12.23
백준 10807: 개수 세기  (0) 2022.12.17
블로그 이미지

RIsN

,

문제

정수 N이 주어졌을 때, 소인수분해하는 프로그램을 작성하시오.


입력

첫째 줄에 정수 N (1 ≤ N ≤ 10,000,000)이 주어진다.


출력

N의 소인수분해 결과를 한 줄에 하나씩 오름차순으로 출력한다. N이 1인 경우 아무것도 출력하지 않는다.


코드

#include <iostream>

using namespace std;

int main()
{   
    // :: 정수 N이 주어졌을 때, 소인수분해하는 프로그램을 작성하시오.

    // :: Input
    int number;
    cin >> number;

    // :: Exception
    if(number == 1) return 0;

    // :: Progress
    string result = "";
    for (int i = 2; i <= number; i++)
    {
        while (number % i == 0)
        {
            result += to_string(i) + "\n";
            number /= i;
        }
    }

    // :: Output
    cout << result;
    return 0;
}

참고

'C++ > Baekjoon' 카테고리의 다른 글

백준 2581: 소수  (0) 2023.01.29
백준 1978: 소수 찾기  (0) 2023.01.28
백준 1929: 소수 구하기  (0) 2023.01.24
백준 5597: 과제 안 내신 분..?  (0) 2022.12.23
백준 10807: 개수 세기  (0) 2022.12.17
블로그 이미지

RIsN

,

답: 54

풀이

  • 200 - (2의 배수 + 3의 배수 + 5의 배수 - 2,3의 공배수(6n) - 2,5의 공배수(10m) - 3,5의 공배수(15x) + 2,3,5의 공배수(30y))
  • 30은 2, 3, 5,에서 빠지고, 6, 10, 15에서 더해졌으므로 존재하지 않으니 다시 뺄 것ㅅ
블로그 이미지

RIsN

,

문제

M이상 N이하의 소수를 모두 출력하는 프로그램을 작성하시오.


입력

첫째 줄에 자연수 M과 N이 빈 칸을 사이에 두고 주어진다. (1 ≤ M ≤ N ≤ 1,000,000) M이상 N이하의 소수가 하나 이상 있는 입력만 주어진다.


출력

한 줄에 하나씩, 증가하는 순서대로 소수를 출력한다.


코드

#include <iostream>
#include <cmath>

using namespace std;

int main()
{   
    // :: Input
    int start, end;
    cin >> start >> end;

    // :: Array
    bool* isNotPrime = new bool[end + 1];
    isNotPrime[0] = true;
    isNotPrime[1] = true;

    // :: Process
    string result = "";
    // :: 소수인지 판별 할 자연수의 제곱근을 기준으로 그 숫자의 약수들의 곱셈은 대칭적으로 곱셈이 일어나게 됩니다. 
    // :: 따라서 소수인지 판별할때는 그 자연수의 제곱근 이하의 수까지만 검사를 하면 됩니다.
    // :: 출처: https://velog.io/@tmpks5/Algorithm-소수를-판별하는-방법-제곱근-나누기
    for (int i = 1; i <= sqrt(end); i++)
    {
        // :: Skip if not prime
        if(isNotPrime[i] == true) continue;
        
        // :: Mark as not prime
        for (int j = i * 2; j <= end; j += i)
        {
            isNotPrime[j] = true;
        }
    }
    
    // :: Output
    for (int i = start; i <= end; i++){
        if (isNotPrime[i] == false){
            result += to_string(i) + "\n";
        }
    }
    cout << result;
    return 0;
}

참고

'C++ > Baekjoon' 카테고리의 다른 글

백준 1978: 소수 찾기  (0) 2023.01.28
백준 11653: 소인수분해  (0) 2023.01.26
백준 5597: 과제 안 내신 분..?  (0) 2022.12.23
백준 10807: 개수 세기  (0) 2022.12.17
백준 2839: 설탕 배달  (0) 2022.12.14
블로그 이미지

RIsN

,

[Unity] 가로 Swipe 판단

Unity 2023. 1. 22. 17:44

목표: 가로 Swipe를 토대로 캐릭터 카메라 회전

  • Event에 익숙해지기 위해서 Event 사용
    • Scene이 바뀌어도 딱히 문제 없이 사용하기 위함
private Coroutine iCoroutine_Input = null;
public void StartInput()
{
    this.iCoroutine_Input = this.StartCoroutine(this.IENInput());
}
public event System.Action<float> eSwipeHorizontal = null;
private IEnumerator IENInput()
{
    while (true)
    {
        // :: Swipe Horizontal
        // :: 처음 터치
        if (Input.GetMouseButtonDown(0))
        {
            // :: 터치 시작 위치
            Vector2 startPos = Input.mousePosition;
            // :: 터치 중
            while (Input.GetMouseButton(0))
            {
                // :: 터치 끝 위치
                Vector2 endPos = Input.mousePosition;
                // :: 터치 방향
                Vector2 swipe = endPos - startPos;
                // :: 터치 방향 이벤트
                this.eSwipeHorizontal?.Invoke(swipe.x);
                yield return null;
            }
        }
        yield return null;
    }
}
public void StopInput()
{
    if (this.iCoroutine_Input != null)
    {
        this.StopCoroutine(this.iCoroutine_Input);
        this.iCoroutine_Input = null;
    }
}

 

블로그 이미지

RIsN

,

목표: 게임의 레시피 UI가 카메라를 계속 바라볼 필요가 있음

  • 주의
    • 빈 게임 오브젝트를 만들고 거기에 스크립트를 부착할 필요가 있음.
    • 내부의 이미지나 글은 조금 각도 등이 수정이 가능한 형태로 만들어야 나중에 편해짐

예) 방식

using System.Collections;
using UnityEngine;

public class GearTool_LookAtCamera : _Gear
{
    public override void Init() { }

    // :: 따라갈 카메라 혹은 오브젝트
    [SerializeField] private Transform iCamera = null;

    // :: 쳐다보기
    void Update()
    {
        if (this.iCamera == null) this.iCamera = Camera.main.transform;

        this.transform.LookAt(
            this.transform.position + this.iCamera.rotation * Vector3.forward,
            this.iCamera.rotation * Vector3.up);
    }
}
  • _Gear는 현재 쓰고 있는 형식, MonoBehaviour로 사용하거나, 상황에 맞춰서 사용할 것
블로그 이미지

RIsN

,

목표: TextMeshPro에서 숫자가 바뀔 때마다 카운팅 하여 숫자를 집어 넣도록 처리

using System.Collections;

public static class ToolText
{
    public static void CountingTo(this TMPro.TMP_Text _targetText, int _goal)
    {
        // :: 코루틴을 실행할 녀석 확인
        // :: 지금 구조에서는 App이 모든 코루틴을 실행하고 관리할 예정
        App.oInstance.StartCoroutine(_targetText.IENCountingTo(_goal));
    }
    public static IEnumerator IENCountingTo(this TMPro.TMP_Text _targetText, int _goal)
    {
        // :: 현재 값
        int current = int.Parse(_targetText.text);

        // :: Up일 경우
        while (current < _goal)
        {
            if (current + 100 < _goal) current += 100;
            else if (current + 10 < _goal) current += 10;
            else current++;

            _targetText.text = string.Format("{0}", current);
            yield return null;
        }
        // :: Down일 경우
        while (current > _goal)
        {
            if (current - 100 > _goal) current -= 100;
            else if (current - 10 > _goal) current -= 10;
            else current--;

            _targetText.text = string.Format("{0}", current);
            yield return null;
        }

        // :: 마지막 재확인
        _targetText.text = string.Format("{0}", _goal);
    }
}
블로그 이미지

RIsN

,

목표: 3D 카메라로 바라보는 3D 오브젝트의 위치에 UI 카메라 상의 캔버스에 이미지를 표시
>> 사용 이유: 내가 선호하는 구조가 3D 카메라와 UI카메라의 복합적인 구조

using System;
using UnityEngine;

public static class ToolCamera
{
    public static Vector3 ConvertPosition3DTo2DLocal(this Camera _camera3D,
    Camera _camera2D, Canvas _canvas, Vector3 _position3D)
    {
        // :: 3D 카메라에서의 3D 위치를 3D 카메라에서의 2D 위치로 변경
        Vector3 position2Din3D = _camera3D.WorldToScreenPoint(_position3D);

        // :: 3D 카메라에서의 2D 위치를 UI(2D) 카메라에서의 2D 로컬 위치로 변경
        Vector2 result;
        RectTransformUtility.ScreenPointToLocalPointInRectangle(
            _canvas.transform as RectTransform, position2Din3D, _camera2D, out result);

        // :: Z축은 0으로 고정
        return new Vector3(result.x, result.y, 0);
    }
}

 

블로그 이미지

RIsN

,

1. 애니메이터 컨트롤러 켜기

2. 2개의 레이어(행동, 표정)를 만들기
>> 마스크 등으로 행동 + 행동 등도 가능하지만, 우선 지금 필요한 건 행동 + 표정

3. 2개의 레이어(행동, 표정) 전부 weight 수치를 1로 설정

4. 실행시키면 동시에 애니메이션 2개(앉아서 움직임 + 눈 깜빡임)가 같이 실행되는 것을 확인 가능합니다.

 

블로그 이미지

RIsN

,

  • 해당 이미지의 Sprite Mode가 설정이 안되어 있는 경우가 있으며, 그럴 경우 해당 항목을 설정해줘야 합니다.
블로그 이미지

RIsN

,