블로그 글을 정리할 때 공부한 내용은 찾아보기 쉽도록 따로 분류해서 글을 작성하고
TIL에서는 오늘 어떤 것에 대해 공부를 하였는지 전체적으로 적는 것이 좋을 것 같아서 새로운 카테고리를 만들었습니다.
1. C++ 디자인 패턴
- 디자인 패턴 강의를 듣고, 추가적인 공부를 진행하였습니다.
- 디자인 패턴이라는 것이 언제 어디서 사용해야 할 지 감이 잘 잡히지 않아서, 좀 더 예시들이나 다른 좋은 코드들을 보면서 앞으로 공부를 더 해야할 것 같다는 생각이 들었습니다.
C++ 디자인 패턴
수업시간에 배운 디자인 패턴에 대해 공부하고, 추가적인 내용도 정리해 보았다.참고한 자료는 아래와 같다.https://refactoring.guru/design-patterns/cpp Design Patterns in C++Turns a request into a stand-alone object th
gbleem.tistory.com
2. Unreal Engine 간단한 로그를 통한 C++ 연습
- UE_LOG를 사용해서 간단한 예제 코드들을 돌려보고, 새로 배운 내용들 몇 가지 정리해 보았습니다.
- 새로 배운 것
- FString::FromInt 함수: int 값을 FString으로 바꿔주는 함수
- AddOnScreenDebugMessage 함수: 출력로그(콘솔)이 아니라 화면에 값을 출력해주는 함수
Unreal Engine 간단한 로그 찍기
1. UE 로그 시스템아래의 코드와 같은 format 을 가지고 있으며, 각 파라메터는 다음과 같다.첫번째 파라메터는 카테고리두번째 파라메터는 로그 상세 레벨세번째 파라메터는 형식 문자열네번째
gbleem.tistory.com
3. 코딩 테스트
https://school.programmers.co.kr/learn/courses/30/lessons/159993
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
- 오늘은 level2의 미로탈출 문제를 풀었습니다.
- 이 문제는 BFS로 풀 수 있는 문제입니다.
- 기본적인 BFS 테크닉에 distance 계산을 하는 방식을 추가해서 풀면 되는 문제입니다.
- https://www.acmicpc.net/problem/2178 이 문제에서 쓰는 테크닉과 같은 테크닉을 쓰지만, 이 문제에서는 BFS를 두 번 사용해야 한다는 점이 차이점입니다.
- 우리가 기본적으로 BFS를 사용할 때 visited라는 배열을 통해 이미 해당 좌표를 방문했는지를 체크하게 됩니다.
- 그러나 생각을 바꿔보면, 해당 좌표를 방문할 때 거리를 업데이트 해준다면, 시작점으로부터 도착점으로 까지의 거리를 쉽게 구할 수 있습니다.
- 기본적인 BFS 테크닉에 distance 계산을 하는 방식을 추가해서 풀면 되는 문제입니다.
- 정답 코드와 추가적인 설명
- vis 배열을 int타입으로 선언 후, 각각의 BFS를 시작할 때 모두 -1로 값을 초기화합니다.
- 시작점을 큐에 넣음과 함께 vis[시작점X][시작점Y] = 0; 으로 초기화 후 BFS 진행합니다.
- 이때 예외처리에 걸리지 않고(좌표를 벗어나거나, 이미 방문한 곳을 오거나, 'X' 인 곳을 오거나) 정상적인 좌표라면,
- 큐에 해당 좌표를 넣어주면서, vis배열의 값을 이전 좌표의 값 + 1 을 대입해주면 됩니다. (vis[nx][ny] = vis[cur.first][cur.second] + 1;)
#include <string>
#include <vector>
#include <queue>
#include <iostream>
using namespace std;
int answer = 0;
char board[102][102]; //row col
int vis[102][102];
int dx[4] = { 1, 0, -1, 0 };
int dy[4] = { 0, 1, 0, -1 };
int row = 0;
int col = 0;
int bfs(pair<int, int> st, pair<int, int> en)
{
for (int i = 0; i < row; ++i)
fill(vis[i], vis[i] + col, -1);
queue<pair<int, int>> q;
q.push({ st.first, st.second });
vis[st.first][st.second] = 0;
while (!q.empty())
{
auto cur = q.front();
q.pop();
for (int dir = 0; dir < 4; ++dir)
{
int nx = cur.first + dx[dir];
int ny = cur.second + dy[dir];
if (nx < 0 || nx >= row || ny < 0 || ny >= col)
continue;
if (board[nx][ny] == 'X' || vis[nx][ny] != -1) //벽이거나, 이미 방문한 경우
continue;
if (nx == en.first && ny == en.second)
{
vis[nx][ny] = vis[cur.first][cur.second] + 1;
return vis[nx][ny];
}
q.push({ nx, ny });
vis[nx][ny] = vis[cur.first][cur.second] + 1;
}
}
return -1;
}
int solution(vector<string> maps)
{
int answer = 0;
pair<int, int> s;
pair<int, int> e;
pair<int, int> l;
row = maps.size();
col = maps[0].size();
for (int i = 0; i < maps.size(); ++i)
{
for (int j = 0; j < maps[i].size(); ++j)
{
if (maps[i][j] == 'S')
s = { i,j };
else if (maps[i][j] == 'E')
e = { i,j };
else if (maps[i][j] == 'L')
l = { i, j };
else if (maps[i][j] == 'O')
board[i][j] = 'O';
else if (maps[i][j] == 'X')
board[i][j] = 'X';
}
}
if (bfs(s, l) == -1)
return -1;
answer += bfs(s, l);
if (bfs(l, e) == -1)
return -1;
answer += bfs(l, e);
return answer;
}
- 아래 사진이 각각의 BFS가 끝난 후 vis 배열의 모습입니다.
'TIL' 카테고리의 다른 글
TIL day 19 (1) | 2025.01.13 |
---|---|
TIL day 18 (1) | 2025.01.10 |
TIL day 17 (1) | 2025.01.09 |
TIL day 16 (2) | 2025.01.08 |
TIL day 15 (0) | 2025.01.07 |