반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- GenAI
- 전주비빔 라이스 버거
- URP
- 2023 Gaming
- 리팩터링 4장
- 스포일러 주의
- 448일선
- 리팩터링 3장
- 2023 게이밍 인 구글 클라우드
- JavaScript
- shader
- 2023 구글 클라우드
- 작계훈련
- unity
- 2023 게이밍
- 주식
- 스즈메의 문단속
- 언리얼5
- 산토리 하이볼
- 상계9동
- 언리얼 5
- 이득우의 언리얼 프로그래밍 1
- 224일선
- 112일선
- 1일차
- 공부
- 구글 컨퍼런스
- 주식단테
- 이득우의 언리얼 프로그래밍1
- 리팩터링
Archives
- Today
- Total
개발 이야기 안하는 개발자
알고리즘 공부 (2024_10_29) 본문
반응형
알고리즘 문제 풀기 시작. 오늘부터야.
목표는 하루에 4문제씩 풀기
너무 막 어렵지 않은걸로 다가.
백준 3109 : 빵집
왼쪽에서 오른쪽으로 길찾기 알고리즘이고, 최대 몇가닥이나 갈 수 있는지 물어보는 문제.
당연히 DFS로 풀었다.
나는 타임오버가 계속 나길래 뭐지 하고 오래 들여다 봤었는데 백트래킹이 문제더라.
어차피 안되는 경로는 다시 활성화 하면 안되는 문제였다.
#include <stdio.h>
#include <algorithm>
#include <queue>
#include <vector>
#include <iostream>
#include <fstream>
#include <stack>
#include <math.h>
using namespace std;
int dx[3] = {1, 1, 1};
int dy[3] = {-1, 0, 1};
int R = 0;
int C = 0;
vector<vector<int>> curMap;
bool DFS(int curY, int curX)
{
if (curX == C)
{
return true;
}
else
{
curMap[curY][curX] = 1;
for (int i = 0; i < 3; i++)
{
int nextY = dy[i] + curY;
int nextX = dx[i] + curX;
if (nextX >= 1 && nextX <= C && nextY >= 1 && nextY <= R && curMap[nextY][nextX] != 1)
{
if (DFS(nextY, nextX))
{
return true;
}
}
}
}
return false;
}
int main() {
streambuf* originalCin = cin.rdbuf();
ifstream inputFile("input.txt");
if (!inputFile.is_open()) {
cerr << "파일을 열 수 없습니다." << endl;
return 1;
}
cin.rdbuf(inputFile.rdbuf());
ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
int answer = 0;
cin >> R >> C;
curMap.resize(R + 1, vector<int>(C + 1,0));
for (int i = 1; i < R + 1; i++)
{
for (int j = 1; j < C + 1; j++)
{
char N;
cin >> N;
if (N == 'x')
{
curMap[i][j] = 1;
}
}
}
for (int i = 1; i < R + 1; i++)
{
if (DFS(i, 1))
{
answer++;
}
}
cout << answer << "\n";
}
백준 1781 : 컵라면
작업을 시간내에 끝내고 보상을 받는 DP 알고리즘을 푸는 문제.
그랬는데 나는 이걸 죽어도 틀렸다길래 뭐가 잘못된거야 하고 반례를 찾아서 깨우쳤다.
작업 데드라인이 3일이라면 작업을 1이나 2에서 진행할 수 있더라. 이걸 몰라서 삽질했다.
https://seungbin0619.tistory.com/89
#include <stdio.h>
#include <algorithm>
#include <queue>
#include <vector>
#include <iostream>
#include <fstream>
#include <stack>
#include <math.h>
using namespace std;
int main() {
streambuf* originalCin = cin.rdbuf();
ifstream inputFile("input.txt");
if (!inputFile.is_open()) {
cerr << "파일을 열 수 없습니다." << endl;
return 1;
}
cin.rdbuf(inputFile.rdbuf());
ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
int answer = 0;
int N = 0;
cin >> N;
vector<pair<int, int>> V;
for (int i = 0; i < N; i++)
{
int a, b;
cin >> a >> b;
V.push_back({a, b});
}
sort(V.begin(), V.end());
priority_queue<int, vector<int>, greater<int>> q;
for (int i = 0; i < V.size(); i++)
{
answer += V[i].second;
q.push(V[i].second);
if (V[i].first < q.size())
{
answer -= q.top();
q.pop();
}
}
cout << answer << "\n";
}
백준 1202 : 보석도둑
처음엔 냅색문제인줄 알았는데 보석이 하나밖에 안들어간다길래 그냥 우선순위 큐로 집어넣어봤다.
시간 초과가 나길래 for문으로 하나씩 돌리지말고 while문으로 point를 지정해서 다음번째를 지정해주었더니 해결되었다.
#include <stdio.h>
#include <algorithm>
#include <queue>
#include <vector>
#include <iostream>
#include <fstream>
#include <stack>
#include <math.h>
using namespace std;
int main() {
streambuf* originalCin = cin.rdbuf();
ifstream inputFile("input.txt");
if (!inputFile.is_open()) {
cerr << "파일을 열 수 없습니다." << endl;
return 1;
}
cin.rdbuf(inputFile.rdbuf());
ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
int N;
int K;
long long answer = 0;
cin >> N >> K;
vector<int> Bag(K);
vector<pair<int, int>> Jewel(N);
for (int i = 0; i < N; i++)
{
int a, b;
cin >> a >> b;
Jewel[i] = {a, b};
}
for (int i = 0; i < K; i++)
{
cin >> Bag[i];
}
sort(Bag.begin(), Bag.end());
sort(Jewel.begin(), Jewel.end());
priority_queue<int> q;
int point = 0;
for (int i = 0; i < K; i++)
{
while (point < N && Jewel[point].first <= Bag[i])
{
q.push(Jewel[point].second);
point++;
}
if (!q.empty())
{
answer += q.top();
q.pop();
}
}
cout << answer << "\n";
}
백준 1911 : 흙길 보수하기
널빤지를 총 몇개를 깔아야 웅덩이를 피하는지 알아보는 알고리즘인데.
사실 이건 그냥 저번 문제에서 좌표로 풀었기 때문에 좌표쓰면 되겠는데 싶어서 해줬더니 바로 해결됐다.
#include <stdio.h>
#include <algorithm>
#include <queue>
#include <vector>
#include <iostream>
#include <fstream>
#include <stack>
#include <math.h>
using namespace std;
int main() {
streambuf* originalCin = cin.rdbuf();
ifstream inputFile("input.txt");
if (!inputFile.is_open()) {
cerr << "파일을 열 수 없습니다." << endl;
return 1;
}
cin.rdbuf(inputFile.rdbuf());
ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
int answer = 0;
int N;
int L;
cin >> N >> L;
vector<pair<int, int>> V(N);
for (int i = 0; i < N; i++)
{
int a, b;
cin >> a >> b;
V[i] = {a, b};
}
sort(V.begin(), V.end());
int point = 0;
for (int i = 0; i < N; i++)
{
if (V[i].first > point)
{
point = V[i].first;
}
while (point < V[i].second)
{
point += L;
answer++;
}
}
cout << answer << "\n";
}
반응형
'개발' 카테고리의 다른 글
알고리즘 공부 (2024_10_31) (1) | 2024.10.31 |
---|---|
알고리즘 공부 (2024_10_30) (0) | 2024.10.30 |
알고리즘 문제 풀이 공부 _ 2 (0) | 2024.10.25 |
알고리즘 문제 풀이 공부 _ 1 (3) | 2024.10.23 |
2023 구글 클라우드 (1) | 2023.06.28 |