BOJ 16

18352. 특정 거리의 도시 찾기 - 파이썬. BFS, 큐

1. 사용한 알고리즘 | 자료 구조 BFS 큐 2. 풀이 접근 방식 전형적인 BFS 문제입니다. K회 만큼 BFS 연산 후 Queue 에 있는 값을 정렬, 출력합니다. 3. 특이사항 Stack 2개를 스왑하는 방식으로 사용하여 deque 를 import 하지 않고 BFS 알고리즘을 구현할 수 있습니다. 4. 언어 | 실행시간 | 메모리 사용량 Python3 | 1264ms | 97164kb from sys import stdin def solution(): # 1. 입력 # N: 정점의 수 | M: 간선의 수 # K: BFS 연산 횟수 | X: BFS 연산 시작점 N, M, K, X = map(int, stdin.readline().split()) # 2. 선언 # 2-1. paths: 간선 정보 pat..

23253. 자료구조는 정말 최고야 - AdHoc, 스택, 정렬. 파이썬

사용한 알고리즘 / 자료구조 스택 정렬 힙 정렬 접근한 방법 정렬을 이용한 접근법 '책 더미'(스택)의 정보를 M회 입력 받는다. '책 더미'를 입력받을 때마다 각 책 더미가 내림차순으로 정렬되어있는지 확인한다. 만약 단 하나의 '책 더미'라도 내림차순 정렬되어있지 않다면, 문제에서 요구하는 정렬 연산은 불가능하다. 'is_order_possible'이라는 변수에 '정렬이 불가능하다'는 정보를 기입한다. 반복문을 종료한다. '정렬' 가능 여부를 파악한다. 조건에 맞게 콘솔에 출력한다. 힙 정렬을 이용한 접근법 '책 더미'(스택)의 정보를 M회 입력 받는다. '책 더미'를 입력받을 때마다 각 책 더미의 가장 오른쪽 원소를 pop한다. 2번에서 pop된 원소를 '책 더미'의 index값과 함께 heap 에 ..

BOJ/스택 2022.01.15

14868. 문명 - 유니온 파인드. 백준. 파이썬

사용한 알고리즘 / 자료구조 델타를 이용한 이차원 배열 탐색. 유니온 파인드 해시 테이블(딕셔너리, 셋) 접근한 방법 지도에 각 문명의 정보를 표시한다. set에 '통합되지 않은 문명 번호'를 기입한다. dict에 '각 문명별 발상지' 를 기입한다. key는 문명 번호, value는 그 문명 발상지의 좌표. 정보를 입력받은 뒤에 이차원 배열을 탐색한다. 다른 문명과 인접할 때마다 Union연산을 수행한다. 문명이 모두 통합되었다면 탐색을 종료한다. + 각 문명이 통합될 때, dict에서 '문명별 발상지' 의 좌표 또한 업데이트한다. 이렇게 하면 타일에 '아직 통합되지 않은 문명 번호'가 남아있다 하더라도 그 숫자들을 '통합된 문명 번호' 취급할 수 있다. 개선 가능한 점 4 방향 탐색 부분 코드가 계속 ..

16120. PPAP - 스택. 파이썬.

사용한 알고리즘 / 자료구조 스택 접근한 방법 스택으로 명세를 그대로 구현한다. 유사한 문제를 이미 풀어보아서 큰 고민 없이 스택으로 풀이했다. '9935 문자열 폭발'과 같은 문제다. https://programmer-565.tistory.com/18?category=999468 https://www.acmicpc.net/problem/9935 9935번: 문자열 폭발 첫째 줄에 문자열이 주어진다. 문자열의 길이는 1보다 크거나 같고, 1,000,000보다 작거나 같다. 둘째 줄에 폭발 문자열이 주어진다. 길이는 1보다 크거나 같고, 36보다 작거나 같다. 두 문자열은 모 www.acmicpc.net 9935. 문자열 폭발 - 스택. 파이썬 9935. 문자열 폭발 사용한 알고리즘 / 자료구조 1. 스택..

BOJ/스택 2021.11.03

15971. 두 로봇

사용한 알고리즘 / 자료구조 우선순위 큐 (heapq) 트리 다익스트라 알고리즘 접근한 방식 두 로봇 사이의 최단 거리를 계산해야 합니다. 일반적인 다익스트라 방식으로 접근했습니다. 단, 현재 사용한 경로에서 '가장 긴 경로'를 제외해야 하므로 두 로봇 사이의 최단 경로 정보를 저장해야 합니다. 배열을 사용해 이를 구현합니다. path: 접근 경로를 저장하는 리스트. index == 노드 번호, value == 출발지 path_distance: 경로의 길이를 저장하는 리스트. index == 노드 번호, value == 경로의 길이. 다익스트라 연산을 끝마친 후 경로를 역추적합니다. 로봇1에서 로봇2까지의 거리를 계산한 뒤 , 가장 길었던 경로(worst_path)를 거리에서 제합니다. 어려웠던 점 다익..

21608. 상어 초등학교 - 구현, 시뮬레이션, counter sort, 해시 테이블. 파이썬

사용한 알고리즘/자료구조 델타를 이용한 2차원 배열 탐색 counter sort 해시 테이블(딕셔너리) 접근한 방법 학생의 위치를 정할 때마다 모든 좌표를 순회하며 주위 4 칸의 좌표 정보를 확인하는 브루트포스 알고리즘으로도 정답 처리를 받을 수 있습니다. 하지만 이런 브루트포스 방식은 O(4*(N**2))의 시간 복잡도를 가진, 굉장히 비효율적인 알고리즘입니다. A학생의 자리를 배정한다고 생각해봅시다. A학생이 좋아하는 학생들 중 한 명 이상이 이미 교실에 앉아있다고 하면, 우리는 이 학생이 좋아하는 학생들 근처 자리들만 조회한 후 우선순위를 계산하면 됩니다. 이 연산을 위해 딕셔너리를 활용합니다. 딕셔너리는 두 개를 사용합니다. 각 학생이 좋아하는 학생들의 정보를 담은 딕셔너리 학생 '주변 자리 좌표..

BOJ/구현 2021.10.25

17070. 파이프 옮기기 - DP + 비트마스킹. 파이썬

17070. 파이프 옮기기 1 사용한 알고리즘, 자료구조 및 기법 다이나믹 프로그래밍 비트마스킹 델타를 이용한 2차원 배열 탐색 접근한 방식 1. 파이프의 '머리'는 우, 하, 대각으로 움직일 수 있다. 1) 파이프의 '꼬리'는 신경 쓸 필요가 없는 변수다. 머리가 갈 수 있는 곳은 꼬리도 무조건 갈 수 있다. 2) 단, 기둥이 있는 곳에는 파이프를 놓을 수 없다. 2. visited[row][column]에는 '이 지점에 방문할 수 있는 방법의 수'를 저장한다. 1) 파이프가 '어디 방향에서 오는지'에 따라서 방법의 수가 달라진다. 2) visited[row][column]은 세 개의 정수를 가진 리스트로 구성한다.[0, 0, 0] 3) 0번 idx에는 '가로에서 접근한 방법의 수', 4) 1번 idx..

BOJ/구현 2021.10.22

1726. 로봇 - BFS, 구현, 시뮬레이션

사용한 알고리즘 및 자료구조 BFS 큐 델타를 이용한 2차원 좌표 탐색 접근 방식 로봇이 한 턴 내에 할 수 있는 동작은 세 가지다. 1~3칸 전진. 좌로 회전. 우로 회전. 로봇의 상태를 que에서 받은 뒤, 위 세 가지 연산을 전부 처리한다. 로봇의 위치와 로봇이 바라보는 방향 모두를 정확히 기록해야 하기에, 3차원 방문 여부 리스트를 활용했다. 문제 특이사항 일반적으로 2차원 좌표 탐색 문제에서, '방향을 돌리는' 연산은 나머지 연산을 통해 쉽게 구현할 수 있다. (나누기를 활용해 2차원 좌표 탐색에 활용하는 문제 샘플을 곧 업로드 하겠습니다.) 하지만 이 문제는 '동쪽이 1, 서쪽이 2, 남쪽이 3, 북쪽이 4' 라고 명시하고 있다. 따라서 좌표를 입력받을 때 적당히 변형하거나, 회전하는 함수를 ..

14500. 테트로미노 -브루트 포스, 구현, 시뮬레이션. [파이썬]

14500. 테트로미노 사용한 알고리즘/자료구조 1. 델타를 이용한 2차원 배열 탐색. 2. 브루트 포스 접근방식 테트로미노들의 상태를 모두 구현한다. 모든 경우의 수를 완전 탐색한다. 문제 특이사항 구현해야 할 양이 많은 문제다. 계획을 잘 짜고 구현하지 않으면 디버깅이 난해할 수 있다. 개선 가능한 점 1) 문제의 조건을 잘 읽고 가지를 칠 수 있다. 2) 부분합을 미리 구해둔 뒤 반복되는 연산을 생략할 수 있다. 느낀점 상당히 배운 점이 많은 문제입니다. 처음 풀 때에는 브루트포스로 풀었으나, 갈수록 시공간 복잡도를 절약할 수 있는 다양한 방법들이 떠올랐습니다. 곧 다른 풀이들을 업로드 하겠습니다. 문제를 풀었을 당시 백준 티어 2021-09-27, 실버 2 from sys import stdin ..

BOJ/구현 2021.10.15

9935. 문자열 폭발 - 스택. 파이썬

9935. 문자열 폭발 사용한 알고리즘 / 자료구조 1. 스택 접근한 방법 1) 입력받은 문자열을 스택에 삽입한다. 2) 폭발 문자열이 생성되었는지 비교한다. 3) 폭발 문자열이 생성되었을 경우 스택에서 폭발 문자열의 길이만큼 문자들을 뺀다. 어려웠던 점 마지막 폭파 처리를 리스트의 슬라이싱으로 처리했다가 시간초과. 느낀 점 시간 복잡도에 항상 유의해야 한다. 같은 결과값을 내는 연산이라면 가장 빠른 방법을 선택해야 한다. 풀었을 때의 백준 티어 2021-10-09. 골드 2. import sys # 1. 입력 # 둘 다 상수이므로 대문자로 표기한다. INPUT_STRING = list(sys.stdin.readline().rstrip()) # 초기 문자열 BOMB = list(sys.stdin.read..

BOJ/스택 2021.10.13