Algorithm 15

[백준 (BOJ)] 1405 - 미친 로봇 (Python)

1405번: 미친 로봇 (acmicpc.net) 1405번: 미친 로봇 첫째 줄에 N, 동쪽으로 이동할 확률, 서쪽으로 이동할 확률, 남쪽으로 이동할 확률, 북쪽으로 이동할 확률이 주어진다. N은 14보다 작거나 같은 자연수이고, 모든 확률은 100보다 작거나 같은 자 www.acmicpc.net 백트랙킹 문제이다. 로봇이 이동 횟수를 모두 채울 때까지 방문하지 않은 지점만 방문한다면, 해당 경로의 확률을 정답에 더해주면 된다. 이때 방문한 지점은 (2n + 1) * (2n + 1) 크기의 행렬을 만들어서 표시했다. 한 방향으로 최대 n번 갈 수 있기 때문이다. dx, dy = [-1, 0, 1, 0], [0, 1, 0, -1] def dfs(x, y, cnt, p): global ans if cnt =..

Algorithm/Graph 2021.05.12

[백준 BOJ] 1520 내리막길 (Python)

1520번: 내리막 길 (acmicpc.net) 1520번: 내리막 길 여행을 떠난 세준이는 지도를 하나 구하였다. 이 지도는 아래 그림과 같이 직사각형 모양이며 여러 칸으로 나뉘어져 있다. 한 칸은 한 지점을 나타내는데 각 칸에는 그 지점의 높이가 쓰여 있으 www.acmicpc.net 다이나믹 프로그래밍 문제이다. 배열을 순차적으로 순회하는 게 아니라 사방으로 움직이며 연산이 진행되기 때문에, DFS/BFS + DP의 조합으로 문제를 풀어야 한다. 1. DFS: 현재 지점에서 접근할 수 있는 곳의 모두 경우의 수를 더해가며, 출발점으로 되돌아온다. dp를 0으로 초기화하면, 경우의 수가 0일 때와 혼동되므로 -1로 초기화한다. 현재 지점을 이미 방문했다면 더 DFS를 들어갈 필요 없이 현재 저장된 D..

[백준 BOJ] 11722 가장 긴 감소하는 부분 수열 (Python)

11722번: 가장 긴 감소하는 부분 수열 (acmicpc.net) 11722번: 가장 긴 감소하는 부분 수열 수열 A가 주어졌을 때, 가장 긴 감소하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 30, 10, 20, 20, 10} 인 경우에 가장 긴 감소하는 부분 수열은 A = {10, 30, 10, 20, 20, 10} www.acmicpc.net 다이나믹 프로그래밍 문제이다. 두 가지 방식으로 풀 수 있다. 이중 for문: 현재 인덱스와 그 앞에 있는 모든 수를 비교한다. O(N^2) bisect 사용: 반복문 안에서 이진탐색을 수행한다. O(NlogN) 1. dp 배열에 현재 수를 포함해 만들 수 있는 수열의 길이를 저장한다. 앞에 있는 어떤 수가 현재 수 보다 ..

[해커랭크 HackerRank] SQL Project Planning (Oracle)

SQL Project Planning | HackerRank SQL Project Planning | HackerRank Write a query to output the start and end dates of projects listed by the number of days it took to complete the project in ascending order. www.hackerrank.com Advanced Join 문제이다. 주어진 테이블에 start_date와 end_date라는 컬럼이 있는데, 같은 행의 두 원소는 무조건 하루가 차이 난다. 이때, 연속하는 날짜의 행은 같은 프로젝트이다. 프로젝트가 시작하는 날짜와 끝나는 날짜를 찾고 걸린 기간에 따라 정렬하면 된다. 위와 같은 테이블은..

Algorithm 2021.04.03

[백준 BOJ] 5014 스타트링크 (Python)

5014번: 스타트링크 (acmicpc.net) 5014번: 스타트링크 첫째 줄에 F, S, G, U, D가 주어진다. (1 ≤ S, G ≤ F ≤ 1000000, 0 ≤ U, D ≤ 1000000) 건물은 1층부터 시작하고, 가장 높은 층은 F층이다. www.acmicpc.net BFS 문제이다 엘레베이터를 타고 올라가든 내려가든 버튼을 누르는 횟수는 1로 동일하기 때문에 (=가중치가 1로 똑같기 때문에) 중복방문을 허용하지 않는 BFS 문제라고 생각하면 된다. 버튼을 눌러 얼마만큼 이동하느냐는 로직에 큰 영향을 주지 않는다. 범위만 넘어가지 않도록 설정해주면 된다. 가중치가 여러 개여서 중복방문을 허용하는 문제👇 2021.03.18 - [Algorithm/Graph] - [백준 BOJ] 13549 숨..

Algorithm/Graph 2021.04.02

[프로그래머스 Programmers] 괄호 변환 (Python)

코딩테스트 연습 - 괄호 변환 | 프로그래머스 (programmers.co.kr) 코딩테스트 연습 - 괄호 변환 카카오에 신입 개발자로 입사한 "콘"은 선배 개발자로부터 개발역량 강화를 위해 다른 개발자가 작성한 소스 코드를 분석하여 문제점을 발견하고 수정하라는 업무 과제를 받았습니다. 소스를 programmers.co.kr 시뮬레이션, 재귀 문제 문제에 괄호를 변환하는 규칙이 차례대로 명시돼 있으므로, 차근차근 따라서 구현하면 된다. 오늘의 포인트 함수 중복 막기 괄호 뒤집는 기능을 map으로 구현 1. 처음에는 그대로 따라서 순서대로 구현했는데, 균형잡힌 괄호 u, v를 분리하는 함수와 올바른 괄호인지 검사하는 함수의 내용이 거의 비슷한 것을 발견했다. def balanced(w): flag = 0 ..

[해커랭크 HackerRank] Symmetric Pairs (Oracle)

Symmetric Pairs | HackerRank Symmetric Pairs | HackerRank Write a query to output all symmetric pairs in ascending order by the value of X. www.hackerrank.com Advanced Join 문제다! 문제 이해하는데 시간이 좀 걸렸다. Symmetric Pairs는 어떤 함수 F에 대해 F(X1) = Y1, F(X2) = Y2 일 때, X1 = Y2이고 X2 = Y1인 두 항을 말한다. 즉 위의 함수에서는 (첫 번째, 두번째), (세 번째, 여섯 번째), (네 번째, 다섯 번째)의 세 쌍의 Symmetric Pairs가 나온다. 이때, 한 쌍 안에서 X 1 OR F1.X < F1.Y OR..

Algorithm 2021.03.19

[해커랭크 HackerRank] Placements (Oracle)

Placements | HackerRank Placements | HackerRank Write a query to output the names of those students whose best friends got offered a higher salary than them. www.hackerrank.com Advanced Join 문제이다! STUDENTS 테이블은 학생, FRIENDS 테이블은 그들의 가장 친한 친구, 그리고 PACKAGES에는 그들의 월급 정보가 저장돼 있다. 이때, 베프가 본인보다 월급이 높은 학생의 이름을 출력해야 한다. 왜 이런 자해 행위를... 우선 학생과 베프를 찾아야 하기 때문에, ID로 조인을 건다. 그리고 월급 정보가 들어있는 PACKAGES를 두 번 사용하여 ..

Algorithm 2021.03.19

[백준 BOJ] 17281번 ⚾ (Python)

17281번: ⚾ (acmicpc.net) 17281번: ⚾ ⚾는 9명으로 이루어진 두 팀이 공격과 수비를 번갈아 하는 게임이다. 하나의 이닝은 공격과 수비로 이루어져 있고, 총 N이닝 동안 게임을 진행해야 한다. 한 이닝에 3아웃이 발생하면 이닝이 종 www.acmicpc.net 시뮬레이션, 브루트포스 문제이다. 문제 설명은 현행 야구 규칙과 동일하다. 주어지는 이닝은 모두 공격일 때의 타자 정보이므로, 수비는 생각하지 않아도 된다. 문제 하단에 pypy3 1.5초라고 명시돼 있는 것이 매우 싸늘한 분위기를 자아낸다... 파이썬으로는 택도 없다는 소리이기 때문이다. 시간초과를 잡기 위해 처음 코드에서 다음과 같은 사항을 고쳤다. 진루 상황을 저장하는 변수: 정수 → 리스트 → 정수 하나의 타순에 대해 ..

[백준 BOJ] 13549 숨바꼭질3 (Python)

13549번: 숨바꼭질 3 (acmicpc.net) 13549번: 숨바꼭질 3 수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 www.acmicpc.net 두 가지 방법으로 풀 수 있다! 다익스트라 (Heap, Priority Queue 활용) 0-1 BFS (Deque 활용) 다익스트라는 힙에서 다음 위치를 꺼낼 때 우선순위를 고려해야하므로, (걸린 시간, 위치)의 형태로 삽입을 하게 된다. 이에 반해 BFS는 가중치(수빈이가 다음 위치로 가는 데 걸리는 시간, 여기서는 0과 1뿐이다.)에 따라 큐에 삽입하는 위치를 달리해서 위의..

Algorithm/Graph 2021.03.18