java
[백준] 2667 - 단지 번호 붙이기 (자바/Java)
문제 링크 성능 요약 메모리: 11912 KB, 시간: 96 ms 분류 너비 우선 탐색(bfs), 깊이 우선 탐색(dfs), 그래프 이론(graphs), 그래프 탐색(graph_traversal) 문제 설명 과 같이 정사각형 모양의 지도가 있다. 1은 집이 있는 곳을, 0은 집이 없는 곳을 나타낸다. 철수는 이 지도를 가지고 연결된 집의 모임인 단지를 정의하고, 단지에 번호를 붙이려 한다. 여기서 연결되었다는 것은 어떤 집이 좌우, 혹은 아래위로 다른 집이 있는 경우를 말한다. 대각선상에 집이 있는 경우는 연결된 것이 아니다. 는 을 단지별로 번호를 붙인 것이다. 지도를 입력하여 단지수를 출력하고, 각 단지에 속하는 집의 수를 오름차순으로 정렬하여 출력하는 프로그램을 작성하시오. 입력 첫 번째 줄에는 지..
[알고리즘] 너비 우선 탐색 BFS & 깊이 우선 탐색 DFS (자바/Java)
목차 BFS & DFS 그래프에서 모든 정점을 방문하는 방법 [참고] 그래프의 인접 노드 구현 1. 인접 행렬 n * n 행렬에 (i, j) (j, i)에 1 (또는 가중치)를 할당 장점 이해하기 쉬움 간선의 존재 여부를 빠르게 알 수 있음 단점 n^2에 해당하는 공간이 필요 모든 원소를 채우는 데에도 시간이 오래 걸림 2. 인접 리스트 보통 연결 리스트를 사용, 각 정점마다 인접한 정점들을 연결 리스트에 표현 장점 행렬에 비해 공간 낭비가 없다. (간선의 총 수에 비례하는 양만큼만 공간이 필요) 단점 만약 거의 모든 정점에 대해 간선이 존재한다면 (dense) 연결 리스트의 정보를 표현하기 위한 오버헤드가 많이 든다. 간선이 존재하는지 알아볼 때 리스트에서 차례로 훑어야 하기 때문에 인접 행렬보다 시간..
[백준] 2263 - 트리의 순회 (자바/Java)
문제 링크 성능 요약 메모리: 69800 KB, 시간: 428 ms 분류 분할 정복(divide_and_conquer), 재귀(recursion), 트리(trees) 문제 설명 n개의 정점을 갖는 이진 트리의 정점에 1부터 n까지의 번호가 중복 없이 매겨져 있다. 이와 같은 이진 트리의 인오더와 포스트오더가 주어졌을 때, 프리오더를 구하는 프로그램을 작성하시오. 입력 첫째 줄에 n(1 ≤ n ≤ 100,000)이 주어진다. 다음 줄에는 인오더를 나타내는 n개의 자연수가 주어지고, 그 다음 줄에는 같은 식으로 포스트오더가 주어진다. 출력 첫째 줄에 프리오더를 출력한다. 4256 문제랑 비슷한 것 같았는데 조금 더 까다로운 것 같다 postOrder에서 왼쪽으로 가는 것을 구현하는 것은 어렵지 않았는데, 오..
[백준] 4803 - 트리 (자바/Java)
문제 링크 성능 요약 메모리: 53236 KB, 시간: 408 ms 분류 자료 구조(data_structures), 깊이 우선 탐색(dfs), 분리 집합(disjoint_set), 그래프 이론(graphs), 그래프 탐색(graph_traversal), 트리(trees) 문제 설명 그래프는 정점과 간선으로 이루어져 있다. 두 정점 사이에 경로가 있다면, 두 정점은 연결되어 있다고 한다. 연결 요소는 모든 정점이 서로 연결되어 있는 정점의 부분집합이다. 그래프는 하나 또는 그 이상의 연결 요소로 이루어져 있다. 트리는 사이클이 없는 연결 요소이다. 트리에는 여러 성질이 있다. 예를 들어, 트리는 정점이 n개, 간선이 n-1개 있다. 또, 임의의 두 정점에 대해서 경로가 유일하다. 그래프가 주어졌을 때, 트..
[백준] 1167 - 트리의 지름 (자바/Java)
문제 링크 성능 요약 메모리: 87924 KB, 시간: 820 ms 분류 깊이 우선 탐색(dfs), 그래프 이론(graphs), 그래프 탐색(graph_traversal), 트리(trees) 문제 설명 트리의 지름이란, 트리에서 임의의 두 점 사이의 거리 중 가장 긴 것을 말한다. 트리의 지름을 구하는 프로그램을 작성하시오. 입력 트리가 입력으로 주어진다. 먼저 첫 번째 줄에서는 트리의 정점의 개수 V가 주어지고 (2 ≤ V ≤ 100,000)둘째 줄부터 V개의 줄에 걸쳐 간선의 정보가 다음과 같이 주어진다. 정점 번호는 1부터 V까지 매겨져 있다. 먼저 정점 번호가 주어지고, 이어서 연결된 간선의 정보를 의미하는 정수가 두 개씩 주어지는데, 하나는 정점번호, 다른 하나는 그 정점까지의 거리이다. 예를 ..
[백준] 1300 - K번째 수 (자바/Java)
문제 링크 성능 요약 메모리: 12960 KB, 시간: 148 ms 분류 이분 탐색(binary_search), 매개 변수 탐색(parametric_search) 문제 설명 세준이는 크기가 N×N인 배열 A를 만들었다. 배열에 들어있는 수 A[i][j] = i×j 이다. 이 수를 일차원 배열 B에 넣으면 B의 크기는 N×N이 된다. B를 오름차순 정렬했을 때, B[k]를 구해보자. 배열 A와 B의 인덱스는 1부터 시작한다. 입력 첫째 줄에 배열의 크기 N이 주어진다. N은 105보다 작거나 같은 자연수이다. 둘째 줄에 k가 주어진다. k는 min(109, N2)보다 작거나 같은 자연수이다. 출력 B[k]를 출력한다. 이분 탐색을 활용하는 문제다. 이분 탐색 개념에 대해서 대충은 알고 있었는데 이 문제에 ..
[백준] 14888 - 연산자 끼워넣기 (자바/Java)
[Silver I] 연산자 끼워넣기 - 14888 문제 링크 성능 요약 메모리: 13276 KB, 시간: 120 ms 분류 백트래킹(backtracking), 브루트포스 알고리즘(bruteforcing) 문제 설명 N개의 수로 이루어진 수열 A1, A2, ..., AN이 주어진다. 또, 수와 수 사이에 끼워넣을 수 있는 N-1개의 연산자가 주어진다. 연산자는 덧셈(+), 뺄셈(-), 곱셈(×), 나눗셈(÷)으로만 이루어져 있다. 우리는 수와 수 사이에 연산자를 하나씩 넣어서, 수식을 하나 만들 수 있다. 이때, 주어진 수의 순서를 바꾸면 안 된다. 예를 들어, 6개의 수로 이루어진 수열이 1, 2, 3, 4, 5, 6이고, 주어진 연산자가 덧셈(+) 2개, 뺄셈(-) 1개, 곱셈(×) 1개, 나눗셈(÷)..
[백준] 4563 - 리벤지 오브 피타고라스 (자바/Java)
[Gold V] 리벤지 오브 피타고라스 - 4563 문제 링크 성능 요약 메모리: 12928 KB, 시간: 248 ms 분류 수학(math), 정수론(number_theory) 문제 설명 피타고라스의 정리는 직각삼각형의 세 변의 관계를 나타내는 정리이다. 빗변의 길이를 C, 다른 두 변의 길이를 A, B라고 한다면 다음과 같은 식으로 쓸 수 있다. A2 + B2 = C2 세 변의 길이가 모두 자연수인 직각삼각형 중에 가장 유명한 삼각형은 아래와 같다. A = 12인 경우에는 다음과 같이 두 개의 직사각형을 찾을 수 있다. A가 주어졌을 때, 빗변의 길이 C가 자연수인 직각삼각형을 만드는 자연수 B (B > A)는 몇 개가 있을까? 입력 입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는..
[백준] 9663 - N-Queen (자바/Java)
문제 N-Queen 문제는 크기가 N × N인 체스판 위에 퀸 N개를 서로 공격할 수 없게 놓는 문제이다. N이 주어졌을 때, 퀸을 놓는 방법의 수를 구하는 프로그램을 작성하시오. 입력 첫째 줄에 N이 주어진다. (1 ≤ N < 15) 출력 첫째 줄에 퀸 N개를 서로 공격할 수 없게 놓는 경우의 수를 출력한다. dfs를 활용해서 풀 수 있다는 건 쉽게 파악이 되는데 시간 초과와 메모리 초과때문에 오래 걸린 문제였다. 일단 처음에는 chess 배열에 queen을 하나씩 저장하면서 dfs로 깊이가 N이 될 때까지 검사하려고 하였다. r과 c를 이중 for문을 돌며 모두 검사하다 보니 row=0일 때 검사한 결과를 다시 row=1일 때도 추가하는 문제가 발생하였다. 그래서 dfs 함수에 row를 변수로 넣어주..
[백준] 1676 - 팩토리얼 0의 개수 (자바/Java)
문제 N!에서 뒤에서부터 처음 0이 아닌 숫자가 나올 때까지 0의 개수를 구하는 프로그램을 작성하시오. 입력 첫째 줄에 N이 주어진다. (0 ≤ N ≤ 500) 출력 첫째 줄에 구한 0의 개수를 출력한다. 0의 개수는 2*5가 몇 개 있는지를 확인하면 된다. N의 팩토리얼은 1*2*...*(N-1)*N 까지니까 2부터 N까지 for문을 돌며 2와 5를 소인수로 갖는 i에 대해 2와 5의 수를 세서 cnt변수에 더하였다. 2*5의 짝이 맞아야 0이 생기기 때문에 2와 5의 개수 중 작은 수를 출력하였다. tmp에 i를 넣지 않으면 2와 5의 배수를 구하는 과정에서 i가 변화하여 for문이 무한루프에 빠진다. tmp에 i를 넣어서 for문에 영향을 주지 않도록 해야 한다. package Silver.s5; ..