1. 코딩 테스트
오전 코딩테스트로 프로그래머스 level 2 프렌즈 4블록을 풀었습니다.
https://school.programmers.co.kr/learn/courses/30/lessons/17679
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
- 뭘로 풀지?
- while문 안에서 이중 for문을 돌면서, 유효한 값인지 체크한 후 이중for문이 끝나면, board를 리셋해주는 작업을 반복하다가 한번도 터지지 않는 경우 while문을 탈출하면 됩니다.
- 이중 for문을 돌면서 2x2 형태를 체크하기
- while문 안에서 모든 경우의 수를 체크하면서, 2x2가 모두 같은 경우 시작점을 '0' 으로 체크해 주었습니다.
- 2x2 칸을 체크하는 것은 Check() 함수를 통해 진행하였습니다.
- 이중 for문을 모두 다 돌고 나면, 0으로 체크한 값을 기준으로 board를 다시 구성하는 Reset 함수를 수행하였습니다.
- Reset함수에서는 temp라는 벡터를 만들어서 미리 사이즈만큼 크기를 잡아둡니다.
- 다음으로는 이중for문을 통해서 돌면서 0으로 체크한 곳을 찾아서, (x+1, y), (x, y+1), (x+1, y+1) 인 곳을 '1'로 체크해 줍니다.
- 이때 주의할 점은 (x+1, y), (x, y+1), (x+1, y+1) 인 좌표 중에서 이미 0으로 체크된 곳이 있다면 그대로 0으로 두는 것이 중요합니다.
- Reset 함수를 돌다가 0인 곳을 모두 다 0으로 바꿔버린다면, 겹쳐진 부분을 찾을수가 없기 때문입니다.
- 예를 들어 (1,1) 과 (1,2)를 '0'으로 체크한 경우
- (1,1) 이 0인 것을 발견하고, (1,2) (2,1) (2,2)를 모두 0으로 바꿔버린다면, (1,2) 값을 0으로 체크해 둔 것이 겹쳐서 없어져버리기 때문입니다.
- 그렇기 때문에 0은 그대로 두고, 나머지 3곳의 좌표가 0이 아닌 경우는 1로 바꿔준다면, 겹치지 않고 체크를 할 수 있습니다.
- 아래의 사진을 참고하면 됩니다.

- Reset 함수안에서 이중 for문이 끝난 이후에는 새로운 이중 for문을 통해 우리가 숫자로 써둔 곳의 갯수를 세서 answer에 더해주면 됩니다.
- 마지막으로 board 벡터를 row가 가장 큰 값에서부터 역으로 확인하면서, 우리가 숫자로 써둔 곳을 무시하면서 temp 벡터에 값을 넣어준 다음 board를 clear 하고, temp값을 넣어주면 됩니다.
- 한번도 Check()함수에 걸리지 않은 경우 while문을 탈출해서 answer를 return 해주면 됩니다.
- 이중 for문을 돌면서 2x2 형태를 체크하기
- 정답 코드
- while문 안에서 이중 for문을 돌면서, 유효한 값인지 체크한 후 이중for문이 끝나면, board를 리셋해주는 작업을 반복하다가 한번도 터지지 않는 경우 while문을 탈출하면 됩니다.
#include <string>
#include <vector>
using namespace std;
int answer = 0;
int row;
int col;
void Reset(vector<string>& board)
{
vector<string> temp(row);
for (int i = 0; i < row; ++i)
{
temp[i].resize(col, ' ');
}
for (int i = 0; i < row; ++i)
{
for (int j = 0; j < col; ++j)
{
if (board[i][j] == '0')
{
if (board[i + 1][j] != '0')
{
board[i + 1][j] = '1';
}
if (board[i][j + 1] != '0')
{
board[i][j + 1] = '1';
}
if (board[i + 1][j + 1] != '0')
{
board[i + 1][j + 1] = '1';
}
}
}
}
for (int i = 0; i < row; ++i)
{
for (int j = 0; j < col; ++j)
{
if (board[i][j] == '1' || board[i][j] == '0')
answer++;
}
}
int tempRow = row - 1;
for (int i = 0; i < col; ++i)
{
for (int j = row - 1; j >= 0; --j)
{
if (isalpha(board[j][i]))
{
temp[tempRow][i] = board[j][i];
tempRow--;
}
}
tempRow = row - 1;
}
board.clear();
board = temp;
}
bool Check(int x, int y, vector<string>& board)
{
char cmp = board[x][y];
if (!isalpha(cmp))
return false;
if (x + 1 >= row || y + 1 >= col)
return false;
if (board[x + 1][y] == cmp && board[x][y + 1] == cmp && board[x + 1][y + 1] == cmp)
return true;
else
return false;
}
int solution(int m, int n, vector<string> board)
{
row = m;
col = n;
while (1)
{
bool bomb = false;
for (int i = 0; i < row; ++i)
{
for (int j = 0; j < col; ++j)
{
if (Check(i, j, board))
{
board[i][j] = '0';
bomb = true;
}
}
}
//한번도 안터진 경우는 끝
if (!bomb)
break;
//board 내려주기
Reset(board);
}
return answer;
}
2. 캐릭터 애니메이션 관련 정리
Unreal Engine - 캐릭터 만들기
플랫포머 게임을 테스트 하기 위해서 간단한 캐릭터를 하나 만들어 보면서, 관련 내용을 정리해 볼 예정이다.1. character 클래스 생성 및 기초 세팅우리는 걸어다니는 보행형 캐릭터를 만들기가
gbleem.tistory.com
정리가 다 끝나지 않아서, 주말에 마무리 할 예정입니다. -> 완료
'TIL' 카테고리의 다른 글
| TIL day 30 (2) | 2025.01.31 |
|---|---|
| TIL day 29 (2) | 2025.01.27 |
| TIL day 27 (0) | 2025.01.23 |
| TIL day 26 (0) | 2025.01.22 |
| TIL day 25 (1) | 2025.01.21 |