morenow
morenow
morenow
전체 방문자
오늘
어제
  • 분류 전체보기 (83)
    • 스프링부트와 AWS로 혼자 구현하는 웹 서비스 (5)
    • [MSA] Spring Cloud로 개발하는 마이.. (14)
    • Baekjoon Online Judge (40)
    • Programmers (11)
    • Spring Boot (7)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 백준 파이어스톰
  • successHandler
  • jwt
  • 마법사 상어와 파이어스톰
  • 백준20058C++
  • HTTP Interface
  • Open Feign
  • re-distribution
  • lost update
  • Feign Client
  • Refresh Token Refresh
  • JWT단점
  • Spring Boot
  • dirty write
  • B Tree
  • write skew
  • HttpExchange
  • Id Token
  • copy up
  • B+ Tree

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
morenow

morenow

Baekjoon Online Judge

[BOJ] 3190 : 뱀 (C++)

2024. 4. 27. 01:16

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
    'Baekjoon Online Judge' 카테고리의 다른 글
    • [BOJ] 16437 : 양 구출 작전 (C++)
    • [BOJ] 20057 : 마법사 상어와 토네이도 (C++)
    • [BOJ] 12015 : 가장 긴 증가하는 부분 수열 2 (C++)
    • [BOJ] 2805 : 나무 자르기 (C++)
    morenow
    morenow

    티스토리툴바