1. Day08

  • C++ 문법 학습
  • 개인 공부

2. C++ 문법 학습

  • 게임 개발자를 위한 C++ 문법(1-3, 1-4)

    • 조건문, 복합 조건, for문 while문 복습
    • 포인터와 레퍼런스 복습
  • C/C++ 가변인자

    • 개수가 정해지지 않은 매개변수를 받을 수 있게 해주는 기능
    • ...으로 선언하고 va_list, va_start, va_arg, va_end로 사용
  • 핵심 도구 4가지

    도구 역할
    va_list 가변인자 리스트 (상자)
    va_start 읽기 시작 (상자 열기)
    va_arg 하나씩 꺼내기
    va_end 읽기 종료 (상자 닫기)
  • 끝을 알리는 두 가지 방법

    방법 예시 장점 단점
    개수 전달 sum(3, 10, 20, 30) 여러 타입 혼용 가능 개수를 세야 함
    NULL 종료 create(a, b, c, NULL) 개수 안 세도 됨 포인터 타입만 가능
    • 가변인자의 한계
      • 값이 동적인 것은 OK: sum(3, a, b, c)
      • 개수가 동적인 것은 불가능: sum(n, ???)
      • 이유: 인자 개수는 컴파일 시점에 확정되어야 함
    • 실제 사용되는 곳
      • printf, scanf (C 표준 라이브러리)
      • UE_LOG (언리얼 엔진)
      • Sequence::create (cocos2d-x)
  • 가변인자 vs 다른 방식

    방식 사용 상황
    가변인자 ... 경우의 수가 무한할 때 (printf)
    함수 오버로딩 경우의 수가 적을 때 (sort)
    기본 매개변수 일부만 생략할 때
    vector/배열 런타임에 개수가 결정될 때
    • 결론
      • 가변인자는 printf처럼 호출 시점에 인자를 다 알고 있을 때 사용
      • 동적 입력 처리에는 vector/배열 사용
      • 알고리즘 문제에서는 쓸 일이 거의 없음 → if-else, map + 함수, vector로 해결

3. 개인공부

  • 실버2 21736번 헌내기는 친구가 필요해(그래프 탐색)
    • 처음에는 DFS로 접근했으나 BFS가 좀더 직관적 → 처음 위치에서 시계 방향으로 진행 루트를 체크해야하기 때문에
// 실버2 21736번 헌내기는 친구가 필요해(그래프 탐색)
#include <iostream>
#include <vector>
#include <queue>

using namespace std;

int N, M;
// char 대신 string으로 받는다면 입력이 더 직관적이고 쉬워짐
vector<vector<char>> graph;
vector<vector<bool>> visited;


int BFS(int startX, int startY)
{
    queue<pair<int, int>> q;
    q.push({ startX,startY });
    visited[startX][startY] = true;
    int count = 0;

    int dx[4] = { 0, 1, 0, -1};
    int dy[4] = { -1, 0, 1, 0 };

    while (!q.empty())
    {
        int x = q.front().first;
        int y = q.front().second;
        q.pop();

        for (int i = 0; i < 4; i++)
        {
            int nx = x + dx[i];
            int ny = y + dy[i];

            if (nx < 0 || nx >= N || ny <0 || ny >= M)
            {
                continue;
            }

            if (visited[nx][ny] || graph[nx][ny] == 'X')
            {
                continue;
            }

            visited[nx][ny] = true;
            if (graph[nx][ny] == 'P')
            {
                count++;
            }
            q.push({ nx,ny });

        }
    }
    return count;
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);


    cin >> N >> M;

    graph.assign(N, vector<char>(M));
    visited.assign(N, vector<bool>(M, false));

    int x, y;
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < M; j++)
        {
            cin >> graph[i][j];
            if (graph[i][j] == 'I')
            {
                x = i;
                y = j;
            }
        }
    }

    int result = BFS(x, y);

    if (result == 0)
    {
        cout << "TT" << '\n';
    }
    else
    {
        cout << result << '\n';
    }

    return 0;
}

3. 내일 일정 : C++ 문법 학습 및 개인공부(그래프 더 풀어보기)

+ Recent posts