본문 바로가기

Algorithm/BOJ172

[BOJ]1194번: 달이 차오른다, 가자. 문제: https://www.acmicpc.net/problem/1194 비트 연산자 + BFS 문제입니다. A~F는 6개의 문자로 {공집합, ... , {a,b,c,d,e,f} } 까지의 부분집합은 2^6 = 64개로 나타낼 수 있습니다. 총 64개의 state가 존재한다고 표현하겠습니다. 그래서 [64][N][M] 만큼의 방문(상태)배열이 존재하게 됩니다. 그러면 각 칸을 순회할 때 가지고 있어야 할 정보는 아래와 같이 네 가지 정보입니다. { 현재 STATE(0~64), Y좌표, X좌표, MOVE_CNT } 열쇠칸을 만났다면 OR 연산자를 통해 현재 STATE에 특정 열쇠를 더해줍니다. int NEW_STATE = NOW_STATE | (1 2020. 5. 17.
[BOJ]17822번: 원판 돌리기 문제: https://www.acmicpc.net/problem/17822 시뮬레이션 문제입니다. 원판의 숫자와 인접한 컴포넌트를 확인할 때 1번인덱스와 M번 인덱스의 숫자도 4방향 탐색을 할 수 있도록 인덱스를 조정하는 게 중요합니다. 또한, 평균값은 실수로 구해줘서 대소비교를 해주도록 하면 됩니다. 코드: https://github.com/cottory/algorithm/blob/master/BOJ/BOJ17822.cc 2020. 5. 15.
[BOJ]4358번: 생태학 문제: https://www.acmicpc.net/problem/4358 map이나 트라이 알고리즘으로 해결할 수 있는 문제입니다. 정해는 트라이입니다. 위 코드가 트라이로 해결한 방법이고, 아래 코드가 map으로 해결한 방법입니다. 둘 사이에 왜 이런 시간 차이가 생기냐면, 나무 이름: T (30) 나무의 종류 갯수: N (10,000) 주어지는 나무의 그루 수: M (1,000,000) 트라이를 사용 경우: 하나의 나무를 트라이에 넣을 때 O(T) 만큼의 시간이 걸립니다. map을 사용하는 경우: 하나의 나무를 map에 넣을 때 O(logN * logN)의 시간이 걸립니다. (나무가 map에 있는지 체크하는데 logN, 그리고 map에 나무를 넣는데 logN) 그러므로 트라이 알고리즘의 시간복잡도는 .. 2020. 5. 10.
[BOJ]14425번: 문자열 집합 트라이로 해결한 문제입니다. Map을 통해 해결해도 되지만, 트라이를 사용하면 O(500 * 10000) 정도에 해결할 수 있습니다. 주의해야할 점은, 아래 그림처럼 포함관계가 있는 경우에는 false를 리턴하도록 코드를 짜야합니다. baekjoononlinejudge (트라이에 있는 문자) bakjoon (쿼리로 들어온 문자) 2020. 5. 8.