[ 백준 9376 : 탈옥 ]
bfs를 응용한 문제.
꽤 생각하고 풀었던 문제이다. 일단 죄수 두 명 중 한 명이 문을 이미 열었다면 그 문은 다른 죄수가 열지 않아도 되는데
이 처리를 어떻게 해야하나 고민했다.
문제를 해결한 방법은
주어진 입력의 바깥 부분을 모두 '.'으로 채웠다. 0,0에서 bfs를 출발하여 임의의 방문 배열을 주고 해당 좌표마다 문을 얼마나 깨고 갔는지를 체크했다.
그리고 두 죄수의 좌표에서 bfs를 실행했고 위와 똑같이 방문배열에 문을 깨고 간 만큼을 입력했다.
그럼 총 이차원 방문 배열이 3개가 나온다. 이 3개를 모두 더한 후 최솟값을 찾았다.
하지만 문이 위치한 곳이라면 -2를 해줬다. 두 죄수 + 외부에서 출발한 임의의 사람 이 동시에 다 같이 문을 연것이기 때문에 -2를 해줬다.
이 블로그 검색
2018년 10월 17일 수요일
[백준 2665] 미로만들기
[ 백준 2665 : 미로만들기 ]
간단한 bfs문제
벽을 최소한으로 부수고 목적지까지 가면된다.
기본 bfs처럼 상하좌우를 탐색한 후 만약 검은방인 0 이라면 큐에 현재 벽을 부순 개수+1 을 push 하고 흰방인 1 이라면 그대로 push를 하면 된다.
방문했는지 안했는지를 체크하기 위해 int형 이차원 배열을 이용해 그 자리까지 벽을 부수고 온 갯수를 집어 넣었다.
만약
다음 가야할 좌표의 방문 이차원 배열의 수가 현재 벽을 부순 개수보다 크다면 이동을 하고 작다면 해당 좌표로 이동하지 않으면 된다.
간단한 bfs문제
벽을 최소한으로 부수고 목적지까지 가면된다.
기본 bfs처럼 상하좌우를 탐색한 후 만약 검은방인 0 이라면 큐에 현재 벽을 부순 개수+1 을 push 하고 흰방인 1 이라면 그대로 push를 하면 된다.
방문했는지 안했는지를 체크하기 위해 int형 이차원 배열을 이용해 그 자리까지 벽을 부수고 온 갯수를 집어 넣었다.
만약
다음 가야할 좌표의 방문 이차원 배열의 수가 현재 벽을 부순 개수보다 크다면 이동을 하고 작다면 해당 좌표로 이동하지 않으면 된다.
2018년 7월 30일 월요일
[백준 1175] 배달
[ 백준 1175 : 배달 ]
간만에 BFS문제~
1분마다 동서남북으로 '#'가 아닌 곳으로 이동하면서 두 곳의 C를 들릴 수 있는 최소의 시간을 구하면된다.
문제에서 체크해야하는 부분은 연속으로 같은 방향으로는 이동 할 수 없다.
이 말은 동->동 이렇게 이동하거나 남->남 이런식으로는 이동 하면 안된다. 무조건 동->(서, 남, 북) 이렇게 다른 방향으로만 이동해야한다.
그리고
목적지가 두 곳이므로 한 곳만 들렸을때 BFS를 종료하면안된다.
목적지 두 곳을 C1,C2라고 해보면 큐에 C1을 들렸는지 C2를 들렸는지도 함께 넣어줘야한다.
그리고 방문을 체크하기 위해 bool VISIT변수를 뒀는데 일단 크기는 교실의 지도범위처럼 [50][50] 선언하고 방향은 총 네곳이므로 [4] 까지 추가한다.
그리고 C1을 들리고 왔는지 C2를 들리고 왔는지 아무곳도 들리지 않았는지도 체크하기 위해 값을 줘야하는데
나는 C1을 들렸을때는 1 C2를 들렸을때는 2 두곳 다 들렸을때는 3 아무곳도 들리지 않았을때는 0 이렇게 줘서 [4]을 추가로 줬다.
그럼 bool VISIT[50][50][4][4] 이렇게 나온다.
이제 BFS를 돌리면된다.
큐에 있는 정보는 X좌표, Y좌표, 이동한 방향, C1들렸는지 C2들렸는지, 시간 이렇게 총 4개이다.
C1과 C2를 1과 2로 체크를 해준다면 0 1 2 3 이렇게 한개의 변수로 모두 처리가 가능하다.
BFS가 끝나도 답이 나오지 않았으면 -1로 출력하고 끝내면된다.
간만에 BFS문제~
1분마다 동서남북으로 '#'가 아닌 곳으로 이동하면서 두 곳의 C를 들릴 수 있는 최소의 시간을 구하면된다.
문제에서 체크해야하는 부분은 연속으로 같은 방향으로는 이동 할 수 없다.
이 말은 동->동 이렇게 이동하거나 남->남 이런식으로는 이동 하면 안된다. 무조건 동->(서, 남, 북) 이렇게 다른 방향으로만 이동해야한다.
그리고
목적지가 두 곳이므로 한 곳만 들렸을때 BFS를 종료하면안된다.
목적지 두 곳을 C1,C2라고 해보면 큐에 C1을 들렸는지 C2를 들렸는지도 함께 넣어줘야한다.
그리고 방문을 체크하기 위해 bool VISIT변수를 뒀는데 일단 크기는 교실의 지도범위처럼 [50][50] 선언하고 방향은 총 네곳이므로 [4] 까지 추가한다.
그리고 C1을 들리고 왔는지 C2를 들리고 왔는지 아무곳도 들리지 않았는지도 체크하기 위해 값을 줘야하는데
나는 C1을 들렸을때는 1 C2를 들렸을때는 2 두곳 다 들렸을때는 3 아무곳도 들리지 않았을때는 0 이렇게 줘서 [4]을 추가로 줬다.
그럼 bool VISIT[50][50][4][4] 이렇게 나온다.
이제 BFS를 돌리면된다.
큐에 있는 정보는 X좌표, Y좌표, 이동한 방향, C1들렸는지 C2들렸는지, 시간 이렇게 총 4개이다.
C1과 C2를 1과 2로 체크를 해준다면 0 1 2 3 이렇게 한개의 변수로 모두 처리가 가능하다.
BFS가 끝나도 답이 나오지 않았으면 -1로 출력하고 끝내면된다.
2018년 6월 29일 금요일
[백준 14867] 물통
[백준 14867 : 물통 ]
BFS를 사용하면 쉽게 풀 수 있는 문제
처음 문제를 접했을때 A와 B의 물통의 MAX값이 10만이라서 이차원 배열도 생성안되고 어떻게 해야하나 고민했었다.
그러다가 처음 시도해본건 그냥 VISIT배열 없이 계속 돌리다가 찾으면 종료시키고 count변수를 하나 둬서 count가 몇 천이 넘어가면 그냥 -1 출력했는데
역시 이런 야매방법은 통하지 않는다. 메모리초과와 시간초과 틀렸습니다가 골고루 나왔었다.
다음으로 생각했던 방법은
해쉬값을 이용하는 것이었다. 현재 A의 물 양에 100만을 곱한다 + 현재 B의 물 양 을 더한다.
그리고 이 수를 해싱해서 충돌은 VECTOR에 넣었는데 시간초과+메모리초과 가났다.
어떻게해야될까?
사실 간단하다.
이 물통의 경우의 수는 네가지이다.
A = 어떤 값 | B = 0
A = 어떤 값 | B = B_MAX
A = 0 | B = 어떤 값
A = A_MAX | B = 어떤 값
이런 네가지 경우를 체크함수로 만들면된다.
어떤 값은 0~100000 일테고 경우는 네 가지 이므로
VISIT[100001][4] = {0,}으로 선언하면된다.
BFS 알고리즘으로 풀 것이므로 무조건 더 먼저 (A의 종료조건 && B의 종료조건) 에 충족하는 것이 답이된다.
끝까지 안나오면 WHILE문을 빠져 나올것이고 -1을 출력한다.
BFS를 사용하면 쉽게 풀 수 있는 문제
처음 문제를 접했을때 A와 B의 물통의 MAX값이 10만이라서 이차원 배열도 생성안되고 어떻게 해야하나 고민했었다.
그러다가 처음 시도해본건 그냥 VISIT배열 없이 계속 돌리다가 찾으면 종료시키고 count변수를 하나 둬서 count가 몇 천이 넘어가면 그냥 -1 출력했는데
역시 이런 야매방법은 통하지 않는다. 메모리초과와 시간초과 틀렸습니다가 골고루 나왔었다.
다음으로 생각했던 방법은
해쉬값을 이용하는 것이었다. 현재 A의 물 양에 100만을 곱한다 + 현재 B의 물 양 을 더한다.
그리고 이 수를 해싱해서 충돌은 VECTOR에 넣었는데 시간초과+메모리초과 가났다.
어떻게해야될까?
사실 간단하다.
이 물통의 경우의 수는 네가지이다.
A = 어떤 값 | B = 0
A = 어떤 값 | B = B_MAX
A = 0 | B = 어떤 값
A = A_MAX | B = 어떤 값
이런 네가지 경우를 체크함수로 만들면된다.
어떤 값은 0~100000 일테고 경우는 네 가지 이므로
VISIT[100001][4] = {0,}으로 선언하면된다.
BFS 알고리즘으로 풀 것이므로 무조건 더 먼저 (A의 종료조건 && B의 종료조건) 에 충족하는 것이 답이된다.
끝까지 안나오면 WHILE문을 빠져 나올것이고 -1을 출력한다.
피드 구독하기:
글 (Atom)
-
아마 나와 비슷한 나이대의 학생들은 대부분 대학에서 수업을 들으면서 꾸준하게 들었을 것 같다. 물론 내가 그래서 그렇다. 4차산업~ IT의 시대~ 빅데이터~ 데이터 마이닝~ 하지만 컴퓨터 관련 전공자가 아니고 더군다나 공학 계열 전공자가 아니라...
-
[ 백준 1024 : 수열의 합 ] 간만에 푼 백준~ 쉬운 문제라고 생각하고 풀었는데 계속 틀려서 봤더니 예외 처리를 한 개 안해준것이 있었다. 만약 이 글을 보기전에 풀었을때 채점이 60%에서 자꾸 틀린다면 90%확률로 나와 같은 실수를 ...
-
[파이썬 초보자의 빅데이터 부수기 - 1. 파이썬을 이용한 웹 크롤링_준비] 순서 1. selenium 설치 2. selenium? 3....
[백준 16236] 아기 상어
[ 백준 16236 : 아기 상어 ] 2018 삼성전자 sw직무 하반기 기출문제입니다. 역대 삼성전자 기출문제가 그렇듯 역시나 BFS,DFS,완탐,DP,단순구현 입니다. 저는 문제를 단순히 BFS로 풀어갔습니다. 조건만 잘 지킨다면 한번에 ...