본문 바로가기

728x90

algorithm

[백준알고리즘] 1697번: 숨바꼭질 -Python [백준알고리즘] 1697번: 숨바꼭질 -Python https://www.acmicpc.net/problem/1697 1697번: 숨바꼭질 문제 수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때 걷는다면 1초 후에 X-1 또는 X+1로 이동하게 된다. 순간이동을 하는 경우에는 1초 후에 2*X의 위치로 이동하게 된다. 수빈이와 동생의 위치가 주어졌을 때, 수빈이가 동생을 찾을 수 있는 가장 빠른 시간이 몇 초 후인지 www.acmicpc.net 처음에 이번 문제를 DFS 방식으로 풀으려 했다. 백트래킹으로 여러 조건들을 추가해서 .. 더보기
[백준알고리즘] 10971번: 외판원 순회 2 -Python [백준알고리즘] 10971번: 외판원 순회 2 -Python https://www.acmicpc.net/problem/10971 10971번: 외판원 순회 2 첫째 줄에 도시의 수 N이 주어진다. (2 ≤ N ≤ 10) 다음 N개의 줄에는 비용 행렬이 주어진다. 각 행렬의 성분은 1,000,000 이하의 양의 정수이며, 갈 수 없는 경우는 0이 주어진다. W[i][j]는 도시 i에서 j로 가기 위한 비용을 나타낸다. 항상 순회할 수 있는 경우만 입력으로 주어진다. www.acmicpc.net 두 가지 방법으로 문제를 풀었다. 첫 번째 방법은 처음에 푼 방식으로 말 그대로 완전 탐색을 위해서 모든 경우를 탐색하도록 했고, 두 번째 방법은 찾아보니 다들 비트 마스크를 이용해서 문제를 풀었길래 공부해서 다시 .. 더보기
[백준알고리즘] 1451번: 직사각형으로 나누기 -Python [백준알고리즘] 1451번: 직사각형으로 나누기 -Python https://www.acmicpc.net/problem/1451 1451번: 직사각형으로 나누기 첫째 줄에 직사각형의 세로 크기 N과 가로 크기 M이 주어진다. 둘째 줄부터 직사각형에 들어가는 수가 가장 윗 줄부터 한 줄에 하나씩 M개의 수가 주어진다. N과 M은 100보다 작거나 같은 자연수이고, 직사각형엔 적어도 3개의 수가 있다. 또, 직사각형에 들어가는 수는 한 자리의 숫자이다. www.acmicpc.net 브루트 포스 방식으로 해결을 해야 한다. 애를 많이 먹고 다른 분들의 풀이를 살펴본 후 해결했다. 처음에 풀었던 방식으로는 각 테이블을 그룹 1, 2, 3으로 직접 나누었다. 이중 for문을 돌려가며 시작점을 설정하고, 그룹이 시.. 더보기
[백준알고리즘] 1107번: 리모컨 -Python [백준알고리즘] 1107번: 리모컨 -Python https://www.acmicpc.net/problem/1107 1107번: 리모컨 첫째 줄에 수빈이가 이동하려고 하는 채널 N (0 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 고장난 버튼의 개수 M (0 ≤ M ≤ 10)이 주어진다. 고장난 버튼이 있는 경우에는 셋째 줄에는 고장난 버튼이 주어지며, 같은 버튼이 여러 번 주어지는 경우는 없다. www.acmicpc.net 브루트 포스로 해결해야 하는 건지 모르고 이상하게 풀었었다... 조건을 다 맞추려고 하다 보니 오류가 계속 발생하고 통과가 안 되는 반례가 계속 존재했다. 이 문제의 경우에는 MAX가 500000으로 depth도 얕기 때문에 recursion depth도 6으로 낮고, 0~9.. 더보기
[백준알고리즘] 1744번: 수 묶기 -Python [백준알고리즘] 1744번: 수 묶기 -Python https://www.acmicpc.net/problem/1744 1744번: 수 묶기 길이가 N인 수열이 주어졌을 때, 그 수열의 합을 구하려고 한다. 하지만, 그냥 그 수열의 합을 모두 더해서 구하는 것이 아니라, 수열의 두 수를 묶으려고 한다. 어떤 수를 묶으려고 할 때, 위치에 상관없이 묶을 수 있다. 하지만, 같은 위치에 있는 수(자기 자신)를 묶는 것은 불가능하다. 그리고 어떤 수를 묶게 되면, 수열의 합을 구할 때 묶은 수는 서로 곱한 후에 더한다. 예를 들면, 어떤 수열이 {0, 1, 2, 4, 3, 5}일 때, 그냥 이 수열 www.acmicpc.net 주어진 조건은 아래와 같다. 수열에서 임의의 두 수를 곱할 수 있다. 한 번 묶여서 .. 더보기
[백준알고리즘] 2873번: 롤러코스터 -Python [백준알고리즘] 2873번: 롤러코스터 -Python https://www.acmicpc.net/problem/2873 2873번: 롤러코스터 문제 상근이는 우리나라에서 가장 유명한 놀이 공원을 운영하고 있다. 이 놀이 공원은 야외에 있고, 다양한 롤러코스터가 많이 있다. 어느 날 벤치에 앉아있던 상근이는 커다란 황금을 발견한 기분이 들었다. 자신의 눈 앞에 보이는 이 부지를 구매해서 롤러코스터를 만든다면, 세상에서 가장 재미있는 롤러코스터를 만들 수 있다고 생각했다. 이 부지는 직사각형 모양이고, 상근이는 R행 C열의 표 모양으로 나누었다. 롤러코스터는 가장 왼쪽 위 칸에서 시작할 것이고, 가 www.acmicpc.net 문제의 규칙만 잘 생각하면 된다. 분류는 그리디 알고리즘으로 되어있으나 내가 푼 .. 더보기
[백준알고리즘] 1783번: 병든 나이트 -Python [백준알고리즘] 1783번: 병든 나이트 -Python https://www.acmicpc.net/problem/1783 1783번: 병든 나이트 첫째 줄에 체스판의 세로 길이 N와 가로 길이 M이 주어진다. N과 M은 2,000,000,000보다 작거나 같은 자연수이다. www.acmicpc.net 다른 분들의 코드도 봤는데 모두 비교문으로만 작성했다. 물론 약간씩 다르긴 했지만. 문제에서 중요한 점은 다음과 같다. 1. 항상 나이트가 오른쪽으로만 이동한다. 2. 4번 "이상" 이동 시에는 모든 이동 방법이 한 번 이상씩 사용되어야 한다. 3. 현재 위치한 점도 포함해서 센다. 1의 조건때문에 오른쪽으로 얼마나 이동할 수 있는가가 중요하다. 2의 조건때문에 오른쪽으로의 길이를 무시한다면 4가지의 이동 .. 더보기
[백준알고리즘] 10610번: 30 -Python [백준알고리즘] 10610번: 30 -Python https://www.acmicpc.net/problem/10610 10610번: 30 문제 어느 날, 미르코는 우연히 길거리에서 양수 N을 보았다. 미르코는 30이란 수를 존경하기 때문에, 그는 길거리에서 찾은 수에 포함된 숫자들을 섞어 30의 배수가 되는 가장 큰 수를 만들고 싶어한다. 미르코를 도와 그가 만들고 싶어하는 수를 계산하는 프로그램을 작성하라. 입력 N을 입력받는다. N는 최대 105개의 숫자로 구성되어 있으며, 0으로 시작하지 않는다. 출력 미르코가 만들고 싶어하는 수가 존재한다면 그 수를 출력하라. 그 수가 존재하지 않는 www.acmicpc.net 만들 수 있는 30의 배수 중에서 가장 큰 수를 출력해야 한다. 여기서 배수 판정법을 .. 더보기

728x90