1. Day12
- C++ 문법 학습
- 알고리즘 특강 - 2
- git활용/코드리뷰 라이브 세션
- 학습 가이드
- 개인 공부
2. C++ 문법 학습(Day12)
게임 개발자를 위한 C++ 문법(2-2)
3. git활용/코드리뷰 라이브세션
4. CH2 학습 가이드 - 12/12
5. 개인공부
- 실버2 18111번 마인크래프트(브루트포스 알고리즘, 구현)
- 처음에 접근방법에 대한 어려움을 겪어 클로드에 코드를 제외한 접근법에 대한 힌트를 얻은 다음에 진행
// 실버2 18111번 마인크래프트(브루트포스 알고리즘, 구현)
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int N, M, B;
cin >> N >> M >> B;
vector<vector<int>> v(N, vector<int>(M));
// 주어진 땅의 높이 입력
for (int i = 0; i < N; i++)
{
for (int j = 0; j < M; j++)
{
cin >> v[i][j];
}
}
// 0부터 시작해서 가장 높은 땅의 갯수 까지
int H = 0;
// 최종 높이
int resultH;
// 걸리는 시간
int T = 1e9;
// 주어진 땅의 높이와 가지고있는 블록의 갯수를 이용해서 가능한 땅의 높이를 전부 구한다
while (H <= 256)
{
// while문 안에서 성공한 걸리는 시간과 한바퀴 돌았을때의 가지고잇는 블록 갯수를 저장하기 위한 임시 변수
int tempT = 0;
int tempB = B; // 주어진 B갯수로 시작 좌표 체크하면서 파낸 블록 갯수만큼 ++
for (int i = 0; i < N; i++)
{
for (int j = 0; j < M; j++)
{
// 목표 높이보다 체크한 좌표의 높이가 더 크면 차이만큼 파내고 *2 초만큼 임시 시간++
// 그 높이 차이만큼 임시 블록 갯수 ++
if (H < v[i][j])
{
int diff = v[i][j] - H;
tempT += diff * 2;
tempB += diff;
}
// 목표 높이보다 체크한 좌표의 높이가 더 낮으면 차이만큼 임시 시간에++ 임시 높이에--
else if (H > v[i][j])
{
int diff = H - v[i][j];
tempT += diff;
tempB -= diff;
}
}
}
// 만일 최종으로 임시높이가 0이상이면 평탄화 가능 그리고 그 시간이 이전 시간이랑 같거나 작다면 최종 높이랑 최종 시간의 자격이 있음
if (tempB >= 0 && tempT <= T)
{
// 이번 while문에서 최종적으로 나온 임시 시간이 기존에 저장되어있던 시간보다 적게 걸린다면 갱신
T = min(T, tempT);
// 걸리는 시간이 같다면 더 큰 높이로 결과 저장(어차피 H++인 while문이기 때문에 시간이 같다면 if문에 걸린 시간이 같거나 작으면이라는 조건 때문에 while문이 끝날때 가장 큰 H가 저장
resultH = H;
}
// H가 계속 커져서 최고 높이에 도달하면 while문이 끝나도록++
H++;
}
cout << T << " " << resultH << '\n';
return 0;
}
5. 내일 계획 : 알고리즘 문제 풀이추가