본문 바로가기

반응형

BOJ

(36)
[BOJ] 5213. 과외맨 과외맨클릭시 이동합니다. 어떻게 풀까? 굉장히 힘들었습니다.우선, 문제의 절반이 별로 문제 푸는데 도움이 안된다는 사실에 좌절했습니다. 허허 이 문제는 BFS문제이지만, 단계를 잘 설정해서 수행해야 한다는 것이 중요합니다.문제를 풀기 위해서 생각해야 할 것들에 대해서 생각해 봅시다. 1. 타일들 간에 이동가능한 인접 행렬을 만들어야 합니다.2. BFS를 통해서 최단 거리를 찾습니다.3. 최단 거리를 찾는 경로를 어떻게 출력할지 생각해야 합니다. 이 중에서 가장 어려운 것은 1번 입니다. 타일을 어떻게 붙일지에 대해서 생각해 봅시다! 일단, 약간 귀찮은 점은 홀수행과 짝수행에서 타일의 개수가 다르다는 것입니다! 우선은, 타일을 모두 왼쪽으로 밀어넣어서 생각해봅시다!또한, 타일에 여러 정보가 있기 때문에 따..
[BOJ] 11559. Puyo Puyo Puyo Puyo클릭시 이동합니다. 어떻게 풀까? 시뮬레이션문제입니다!시뮬레이션 문제는 문제에서 요구하는 것들에 대해서 구조체와 함수를 잘 만들어야합니다! 해당 문제에서 요구하는 것은 크게 두 가지 입니다. 1. 상 하 좌 우로 4개의 블럭들이 모여있으면 터뜨려라!2. 빈 공간이 생기면 아래로 내려라! 두 가지 모두 이전에 했던 밍이의 블록게임과 유사한 작업입니다.만약, 글만으로 잘 이해가 안된다면, 해당 포스팅을 한번 보시는 것을 추천드립니다! 그럼 우선, 1번 작업에 대해 프로그래밍을 해봅시다. 우선, 맵을 다 보면서 블록이 있는지 확인합니다. 그리고, 만약 블록이 있다면,아래 단계를 순서대로 실행합니다. 1. 블록의 상하좌우에 같은 블록이 있으면 큐에 담고, visit check를 해준다.2. 블록..
[BOJ] 3649 로봇 프로젝트 로봇 프로젝트클릭시 이동합니다. 어떻게 풀까? 정렬 문제라고는 되있지만, 저는 다르게 풀었습니다. 왜냐하면! 답이 10^8을 넘지 않기 때문에, bool 배열을 충분히 만들 수 있기 때문이죠! 구멍의 크기는 입니다.nm = 즉, nm = 이라는 것이죠! 구멍을 막기 위해서 필요한 두 블록 중 하나가 l이라고 한다면, 필요한 나머지 하나의 블록은 x - l 일 것입니다!따라서, 입력을 받을 때 x-l의 블럭이 존재한다면, 구멍을 막을 수 있다는 것이겠죠! 하지만, 문제에 또 다른 조건이 있습니다. 바로 절대값이 가장 큰 수를 출력해야 한다는 것이죠! 절대값이 크기 위해서는 두 수의 차이가 가장 커야하고, 작은 수를 기준으로 보면, 가장 작은 길이 l과, x - l 의 값이 정답으로 출력하면 됩니다. l을 ..
[BOJ] 1219. 오민식의 고민 (18.8.22 그림 추가) 오민식의 고민클릭시 이동합니다. 어떻게 풀까? 으악... 저는 dfs와 bfs를 이용해서 풀었는데... 알고보니 벨만-포드 알고리즘이었어요.. 이따가 벨만-포드로 풀어서 해당 방법도 업데이트 하겠습니다. 버전 1과 2로 나누죠! Version.1 DFS and BFS 노드가 100개밖에 없으니 DFS를 이용해서 최댓값을 구해봅시다.잘 생각해보면, 해당 문제에서 양수 사이클이 생겨서 무한이 생기는 경우는, 방문했던 점을 또 방문할 경우에만 생깁니다.더 정확하게 말하면, 양수 사이클이 생겼을 경우이죠. 반대로, 음수 사이클이 생기는 경우에는 싸이클의 반복 경로를 탄다면, 가격이 계속 줄어든다는 것을 알 수 있죠!결국, 음수 사이클이 생기는 경우에는 반복 경로를 타지 않고 가는 것이 최대 수익을 얻는 경우입니..
[BOJ] 14923. 미로탈출 미로 탈출클릭시 이동합니다. 어떻게 풀까? BFS 문제입니다!해당 캐릭터의 이동 시간은 1이기 때문에, BFS에서 해당 도착점에 도착했을 때가 처음으로 나오는 시간이 바로 해당 지점에 도착할 수 있는 최소 시간입니다! 그리고, 만약 캐릭터가 이동하고자 하는 방향이 이전에 한 번 이동했던 방향이라면 다시 방문할 필요가 없죠.그 말은 가고자 하는 방향을 한번 돌아서 간다는 것이기 때문입니다! 최소 시간과는 거리가 멀어지죠. 따라서, 해당 맵에 들어갔던 최소 시간을 check[y][x]에 표시합시다! 다만, 이 문제는 탈출을 하는데 조건이 하나가 더 있습니다!바로, 마법을 쓸 수 있다는 것이지요.이 마법의 유무가 최소를 만들 수 있는 또 다른 변수가 될 수 있습니다. 왜냐하면, 조금 늦게 왔더라도, 마법이 있..
[BOJ] 14226. 이모티콘 이모티콘클릭시 이동합니다. 어떻게 풀까? 우선, 한 상태에서 달라질 수 있는 것들은 총 3개 이죠. 1. 현재 화면에 있는 이모티콘 수2. 클립보드에 저장된 이모티콘의 수3. 시간 특히, 시간 같은 경우는 모든 연산에서 1초로 동일합니다.따라서, bfs를 이용해서 딱 현재 화면에 있는 이모티콘의 수가 처음으로 나온다면, 그것이 바로 해당 화면에 이모티콘을 만들 수 있는 최소의 시간인 것이죠. 그럼, 만약 큐에서 상태를 뽑았는데, 이미 이전에 화면에 있는 이모티콘의 수와 클립보드에 저장된 이모티콘의 수가 같은 상태를 봤었다면 어떨까요?? 어짜피 똑같은 처리를 다시 한 뒤에 똑같은 상태가 큐에 저장되기 때문에 다시 볼 필요가 없습니다!! 따라서, 이전에 처리한 상태를 저장하기 위해서 visit은 [화면에 있..
[BOJ] 13901. 로봇 로봇클릭시 이동합니다. 어떻게 풀까? 우선, 처음에 방향이 4개가 주어집니다.그리고 4개의 방향에서 나아가지 못하면, 현재의 위치를 출력해야하죠! 따라서, 저는 4개의 방향을 살펴보면서 4개의 방향으로 가지 못하면 cont라는 bool 변수를 false로 만들어서 while문을 빠져나오게 했습니다!한 번이라도 움직이면, 해당 방향으로 움직이기 때문에 계속 루프를 돌겠죠.그리고, 움직인 방향에는 벽을 설치해서 다시 돌아올수 없게 했습니다. 또 중요하게 생각해볼 점은 1. '만약 움직이면 계속 같은 방향으로 움직인다.' 라는 점과2. '만약, 사용자가 지정한 다음 방향이 없다면 맨 처음 방향으로 돌아간다.' 라는 점이겠죠. 1번 같은 경우는, 자신의 현재 방향을 변수로 가지고 있으면 쉽게 해결됩니다!2번의 ..
[BOJ] 1019. 책 페이지 책 페이지클릭시 이동합니다. 어떻게 풀까? 규칙을 찾으면 생각보다 간단하게 풀 수 있습니다! 간단하게 2834 라는 수를 생각해봅시다! 우선, 가장 큰 2천이라는 수를 봅시다 2천이라는 수 전에는0~999라는 수가 있었을 것입니다.그리고 1000~1999까지의 수가 있었겠죠!엇! 이거.. 왠지 0~999까지가 반복되는 느낌이 있습니다. 그렇다면, 0~999까지 등장하는 0~9의 수를 세면 될 것 같습니다.편의상 1도 001이라고 생각하겠습니다! (1001 같은 경우 때문이죠!)잘 생각해보면, 모든 수가 1의 자리에서 100번, 10의 자리에서 100번, 100의 자리에서 100번씩 등장하는 것을 알 수 있습니다! (즉, 0도 300번, 1도 300번, 2도 300번, 3도 300번, 4도 300번, 5도..

반응형