https://www.acmicpc.net/problem/3190
걸린 시간 : 56분
정말 그냥 구현 문제이다. 프로그램으로 상황을 잘 표현할 수 있다면 쉬운 문제이다.
나는 정말 사소한 부분에서 막혔다. 다음 부분이다.
if (find(apple.begin(), apple.end(), {ni, nj}))
apple이라는 벡터에서 {ni, nj} pair를 찾아 bool로 반환하는 algorithm 헤더의 함수이다.
하지만, pair는 기본 자료형이 아니므로 == operator가 정의되어 있지 않다. 즉, 애초에 같다는 것이 정의되어 있지 않아서 찾을 수가 없다는 것이다.
이를 위한 방법으로는 find_if 함수가 있다. 하지만, 어차피 find_if 함수가 시간복잡도가 낮은 것도 아니므로 코딩 테스트 목적으로는 find 함수를 직접 구현하는 것이 오히려 코드도 알아보기 쉽고 편할 것으로 생각됐다.
따라서 find 함수를 직접 구현했다.
정답코드
#include <bits/stdc++.h> using namespace std; int N, K, L, status = 0, sec = 0; int di[4] = {0, 1, 0, -1}; int dj[4] = {1, 0, -1, 0}; vector<pair<int, int> > apple; vector<pair<int, int> > snake; queue<pair<int, char> > change; bool find(pair<int, int> next) { for (int i = 0; i < apple.size(); i++) { pair<int, int> a = apple[i]; if (next.first == a.first && next.second == a.second) { apple.erase(apple.begin() + i); return true; } } return false; } bool crushmyself(int ni, int nj) { for (auto s : snake) { if (ni == s.first && nj == s.second) { for (auto d : snake) { } return true; } } return false; } int main(void) { ios::sync_with_stdio(0); cin.tie(0); cin >> N >> K; for (int i = 0; i < K; i++) { int a, b; cin >> a >> b; apple.push_back({a-1, b-1}); } cin >> L; for (int i = 0; i < L; i++) { int a; char b; cin >> a >> b; change.push({a, b}); } snake.push_back({0, 0}); while (true) { sec++; int ci = snake.back().first; int cj = snake.back().second; int ni = ci + di[status]; int nj = cj + dj[status]; if (ni < 0 || ni >= N || nj < 0 || nj >= N || crushmyself(ni, nj)) { cout << sec; return 0; } else if (find({ni, nj})) { snake.push_back({ni, nj}); } else { snake.push_back({ni, nj}); snake.erase(snake.begin()); } if (change.front().first == sec) { if (change.front().second == 'L') { status--; if (status < 0) status += 4; } else if (change.front().second = 'D') { status++; if (status > 3) status -= 4; } change.pop(); } } return 0; }
'Baekjoon Online Judge' 카테고리의 다른 글
[BOJ] 16437 : 양 구출 작전 (C++) (0) | 2024.04.28 |
---|---|
[BOJ] 20057 : 마법사 상어와 토네이도 (C++) (1) | 2024.04.27 |
[BOJ] 12015 : 가장 긴 증가하는 부분 수열 2 (C++) (1) | 2023.12.26 |
[BOJ] 2805 : 나무 자르기 (C++) (1) | 2023.12.26 |
[BOJ] 9019 : DSLR (Java) (0) | 2023.11.09 |