티스토리 뷰
E가 꽤나 어렵게 느껴졌고, 그냥 넘어가서 F를 잡을걸 그랬다. C에서 3WA를 받았는데, double로 연산하면 터져버리는 케이스가 있었던 것 같다.
A - 2:17
단순 구현 문제이다. 8개의 숫자가 들어오고, 모든 숫자가 25의 배수인지 그리고 각 숫자가 100 ~ 675 이내의 차이를 가지고 있는지 확인하면 된다. 하나라도 만족하지 않을 경우 No를 출력하자.
#include <iostream>
#include <queue>
#include <vector>
#include <set>
#include <map>
#include <algorithm>
#include <string>
#include <stack>
#include <cstring>
#define X first
#define Y second
#define NUM 21
using namespace std;
vector<int> v;
bool flag = true;
int main() {
for (int i=0; i<8; i++) {
int x;
cin >> x;
v.push_back(x);
}
for (int i=0; i<8; i++) {
if (i != 0) {
if (v[i] < v[i-1]) flag = false;
}
if (v[i] < 100 || v[i] > 675) flag = false;
if (v[i] % 25 != 0) flag = false;
}
if (flag) {
cout << "Yes" << '\n';
} else {
cout << "No" << '\n';
}
}
B - 9:17
내가 궁금한 string이 들어오고, string별 price가 주어진다. 만약 이 price가 주어지지 않은 문자열이 있다면 P0의 값을 더하면 된다. map을 이용하면 아주 간단하게 해결할 수 있는 문제이다. 해석을 대충하고 넘어갔다가 문제를 괜히 2번 읽었다.
#include <iostream>
#include <queue>
#include <vector>
#include <set>
#include <map>
#include <algorithm>
#include <string>
#include <stack>
#include <cstring>
#define X first
#define Y second
#define NUM 21
using namespace std;
int N, M;
vector<string> v, vv;
map<string,int> mp;
int main() {
cin >> N >> M;
for (int i=0; i<N; i++) {
string s;
cin >> s;
v.push_back(s);
}
for (int i=0; i<M; i++) {
string ss;
cin >> ss;
vv.push_back(ss);
}
int cost;
cin >> cost;
for (int i=0; i<M; i++) {
int c;
cin >> c;
mp[vv[i]] = c;
}
int answer = 0;
for (int i=0; i<N; i++) {
string s = v[i];
if (mp[s] != 0) {
answer += mp[s];
} else {
answer += cost;
}
}
cout << answer << '\n';
}
C - 20:27
아주 간단한 정렬 문제이다. Ai, Bi가 N개 주어질때, Ai / (Ai + Bi)를 기준으로 내림차순 정렬을 수행하고 만약 이 값이 같다면 입력받은 순서로 오름차순으로 정렬하면 된다.
double로 풀었는데 자꾸 틀려서 long double을 넣어봤는데 풀렸다.
#include <iostream>
#include <queue>
#include <vector>
#include <set>
#include <map>
#include <algorithm>
#include <string>
#include <stack>
#include <cstring>
#define X first
#define Y second
#define NUM 21
using namespace std;
typedef pair<int, long double> pid;
int N, M;
vector<pid> v;
bool compare(pid a, pid b) {
if (a.Y == b.Y) {
return a.X < b.X;
}
return a.Y > b.Y;
}
int main() {
cin >> N;
for (int i=1; i<=N; i++) {
long double a, b;
cin >> a >> b;
v.push_back({i, a / (a + b)});
}
sort(v.begin(), v.end(), compare);
for (auto vv : v) {
cout << vv.X << ' ';
}
}
D - 33:37
(1, 1)부터 (H, W)로 이동하려고 한다. 이때 각 칸마다 알파벳이 들어있는데, 무조건 s -> n -> u -> k -> e 을 밟으면서 이동을 해야한다. 주어진 알파벳이 5개뿐이므로, 방문 배열을 3차원으로 잡아 BFS를 돌려볼 수 있다. visited[i][j][k]를 i알파벳을 밟고 j, k에 도달할 수 있는지?로 기준을 잡아서 풀었다.
그런데 지금 다시보니 그럴 필요가 없어보인다. 이미 각 칸에 대해 알파벳이 정해져있고 그냥 순서대로 갈 수 있는지만 보면 될 것 같다.
#include <iostream>
#include <queue>
#include <vector>
#include <set>
#include <map>
#include <algorithm>
#include <string>
#include <stack>
#include <cstring>
#define X first
#define Y second
#define NUM 21
using namespace std;
typedef pair<int, long double> pid;
typedef pair<int, int> pii;
typedef pair<pii, int> piii;
bool visited[5][510][510] = {false};
vector<char> ch = {'s', 'n', 'u', 'k', 'e'};
int dx[4] = {-1, 1, 0, 0};
int dy[4] = {0, 0, -1, 1};
int h, w;
vector<string> graph;
bool flag = false;
queue<piii> q;
void bfs() {
q.push({{0, 0}, 0});
visited[0][0][0] = true;
while (!q.empty()) {
auto curr = q.front();
int x = curr.X.X, y = curr.X.Y, d = curr.Y;
q.pop();
for (int i=0; i<4; i++) {
int nx = x + dx[i];
int ny = y + dy[i];
int nd = (d + 1) % 5;
if (nx < 0 || nx >= h || ny < 0 || ny >= w || visited[nd][nx][ny] || graph[nx][ny] != ch[nd]) continue;
visited[nd][nx][ny] = true;
q.push({{nx, ny}, nd});
}
}
}
int main() {
cin >> h >> w;
for (int i=0; i<h; i++) {
string s;
cin >> s;
graph.push_back(s);
}
if (graph[0][0] == 's') {
bfs();
}
for (int i=0; i<5; i++) {
if (visited[i][h-1][w-1]) flag = true;
}
if (flag) {
cout << "Yes" << '\n';
} else {
cout << "No" << '\n';
}
}
'PS > AtCoder' 카테고리의 다른 글
[Atcoder] ABC308 :: F - Vouchers (2) | 2023.07.04 |
---|---|
[AtCoder] ABC307 (0) | 2023.06.24 |
[Atcoder] ABC306 :: D - Poisonous Full-Course (0) | 2023.06.19 |
[Atcoder] ABC306 :: C - Centers (0) | 2023.06.19 |
[Atcoder] ABC302 :: E - Isolation (0) | 2023.06.15 |
- Total
- Today
- Yesterday
- Database
- Operating System
- spring
- cs
- OS
- GORM
- ARP
- algorithm
- 공지
- effective
- java
- go
- fiber
- Effective Java
- paging
- soft delete
- mmu
- network
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |