분류 전체보기

    [SWEA] 4789 - 성공적인 공연 기획 (자바 / Java)

    입력되는 string의 각 index는 0부터 시작해서 최소 index명 이상이 박수치고 있을 때 자신도 박수를 친다는 것을 뜻한다. 즉 string이 "110011" 일 때, 세 번째 0은 index가 2이고, 2명 이상 박수치고 있을 때 자신이 박수를 친다는 것이다. 이에 따라 문자열을 char 배열로 바꾼 후, 앞자리부터 박수를 치고 있는 사람의 수를 누적합하여 count 배열을 생성하였다. char[] people = sc.next().toCharArray(); int[] count = new int[people.length]; for (int i = 0; i < count.length; i++) { if (i == 0) count[i] = people[i] - '0'; else { count[i..

    [백준] 1244 - 스위치 켜고 끄기 (자바/Java)

    https://www.acmicpc.net/problem/1244 문제 1부터 연속적으로 번호가 붙어있는 스위치들이 있다. 스위치는 켜져 있거나 꺼져있는 상태이다. 에 스위치 8개의 상태가 표시되어 있다. ‘1’은 스위치가 켜져 있음을, ‘0’은 꺼져 있음을 나타낸다. 그리고 학생 몇 명을 뽑아서, 학생들에게 1 이상이고 스위치 개수 이하인 자연수를 하나씩 나누어주었다. 학생들은 자신의 성별과 받은 수에 따라 아래와 같은 방식으로 스위치를 조작하게 된다. 남학생은 스위치 번호가 자기가 받은 수의 배수이면, 그 스위치의 상태를 바꾼다. 즉, 스위치가 켜져 있으면 끄고, 꺼져 있으면 켠다. 과 같은 상태에서 남학생이 3을 받았다면, 이 학생은 와 같이 3번, 6번 스위치의 상태를 바꾼다. 여학생은 자기가 받..

    [알고리즘] 완전 검색, Baby-Gin (자바/Java)

    목차 완전 검색 가능한 모든 경우의 수를 확인하는 기법 Brute-force, Generate-and-Test 기법 경우의 수가 작을 때 유용함 정확성은 높지만, 경우의 수가 커진다면 비효율적일 수 있음 Baby-Gin 임의의 숫자 6개를 뽑아 run과 triplet으로만 구성된 카드 = baby-gin run: 3장의 카드가 연속적인 번호를 갖는 경우 triplet: 3장의 카드가 동일한 번호를 갖는 경우 모든 경우의 수 구하기 (순열) 6개의 숫자는 6!개의 순열이 가능 먼저 6개 숫자에서 가능한 세 자리 순열(6P3)을 구하여 run 또는 triplet에 해당하는지 검사 true를 반환한다면, 다시 남은 3가지 수 중에서 순열을 구하여 run 또는 triplet에 해당하는지 검사 for (int i..

    [알고리즘] 검색 Search - 순차 검색, 이진 검색 (자바/Java)

    목차 검색 자료에서 원하는 항목을 찾는 작업 종류 순차 검색 이진 검색 인덱싱 순차 검색 일렬로 되어 있는 자료를 순서대로 검색 장점: 배열, 연결 리스트 등에서 유용 단점: 자료의 크기가 큰 경우에 비효율적 정렬X 첫 번째 원소부터 마지막 원소까지 키 값이 같은 원소가 있는지 검색 동일한 원소를 찾으면 검색을 중지하고 그 인덱스를 반환 마지막 원소까지 키를 찾지 못하면 실패 시간 복잡도: O(n) 정렬O 첫 번째 원소부터 키 값보다 큰 원소가 나올 때까지 검색 동일한 원소를 찾으면 반환, 키 값보다 큰 원소가 나왔는데 찾지 못하면 검색 실패 시간 복잡도: O(n) 그러나 정렬되지 않았을 때보다 평균 비교 횟수가 절반으로 줄어든다. 이진 검색 자료의 가운데에 있는 항목의 키 값과 비교하여 다음 검색의 위..

    [알고리즘] 정렬 - 선택 정렬(Selection Sort) (자바/Java)

    [알고리즘] 정렬 - 선택 정렬(Selection Sort) (자바/Java)

    목차 선택 정렬 개념 주어진 자료들 중 가장 작은 값의 원소부터 차례대로 선택하여 위치를 교환하는 방식으로 정렬하는 알고리즘 시간 복잡도: O(n^2) 정렬 과정 첫 번째 원소를 두 번째부터 마지막 원소까지 비교하여 가장 작은 값과 자리 교환 2가 가장 작은 원소이고, 그 값의 index는 2이므로 arr[0]과 arr[1] 교환, arr[0]은 가장 작은 값으로 정렬 완료 두 번째, 세 번째 … 끝에서 두 번째 원소까지 같은 과정을 반복함 코드 package sort; import java.util.Arrays; public class SelectionSort { public static void main(String[] args) { int[] arr = { 30, 15, 2, 8, 21, 7 }; ..

    [알고리즘] 정렬 - 버블 정렬(Bubble Sort) (자바/Java)

    [알고리즘] 정렬 - 버블 정렬(Bubble Sort) (자바/Java)

    목차 버블 정렬 개념 인접한 두 개의 원소를 비교하며 정렬하는 알고리즘 정렬 과정 배열이 {30, 15, 2, 8, 21, 7}일 때를 가정한다. 원소는 자신의 오른쪽 값과 비교하기 때문에, 첫 사이클에서 비교할 마지막 index는 n-2이다. n-1(마지막 원소)와 비교를 하면 한 사이클이 끝나기 때문이다. 그렇게 한 사이클이 지나면 가장 큰 값이 배열의 오른쪽에 위치하여 다음 사이클에서는 비교 대상에서 제외된다. 두 번째는 30을 제외하고 다섯개의 원소만 비교하며 같은 과정을 반복한다. 이 사이클이 끝나면 두 번째로 큰 원소인 21이 자신의 위치를 찾아간다. 이렇게 반복하다보면 i가 1일때, 두 번째로 작은 원소인 7이 정렬되고, 자동으로 가장 작은 원소인 2는 비교 대상이 없기 때문에 모든 정렬이 ..

    [백준] 3273 - 두 수의 합 (자바/Java)

    문제 n개의 서로 다른 양의 정수 a1, a2, ..., an으로 이루어진 수열이 있다. ai의 값은 1보다 크거나 같고, 1000000보다 작거나 같은 자연수이다. 자연수 x가 주어졌을 때, ai + aj = x (1 ≤ i < j ≤ n)을 만족하는 (ai, aj)쌍의 수를 구하는 프로그램을 작성하시오. 입력 첫째 줄에 수열의 크기 n이 주어진다. 다음 줄에는 수열에 포함되는 수가 주어진다. 셋째 줄에는 x가 주어진다. (1 ≤ n ≤ 100000, 1 ≤ x ≤ 2000000) 출력 문제의 조건을 만족하는 쌍의 개수를 출력한다. N의 크기만큼의 boolean 배열을 선언해주고, 입력받은 값을 true로 설정하였다. 그리고 i가 true이고, x-i가 true인 경우 cnt를 하나씩 증가하였다. 이때..

    [백준] 6588 - 골드바흐의 추측 (자바/Java)

    문제 1742년, 독일의 아마추어 수학가 크리스티안 골드바흐는 레온하르트 오일러에게 다음과 같은 추측을 제안하는 편지를 보냈다. 4보다 큰 모든 짝수는 두 홀수 소수의 합으로 나타낼 수 있다. 예를 들어 8은 3 + 5로 나타낼 수 있고, 3과 5는 모두 홀수인 소수이다. 또, 20 = 3 + 17 = 7 + 13, 42 = 5 + 37 = 11 + 31 = 13 + 29 = 19 + 23 이다. 이 추측은 아직도 해결되지 않은 문제이다. 백만 이하의 모든 짝수에 대해서, 이 추측을 검증하는 프로그램을 작성하시오. 입력 입력은 하나 또는 그 이상의 테스트 케이스로 이루어져 있다. 테스트 케이스의 개수는 100,000개를 넘지 않는다. 각 테스트 케이스는 짝수 정수 n 하나로 이루어져 있다. (6 ≤ n ..

    [백준] 15650 - N과 M (2) (자바/Java) 백트래킹 DFS 조합

    문제 자연수 N과 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오. 1부터 N까지 자연수 중에서 중복 없이 M개를 고른 수열 고른 수열은 오름차순이어야 한다. 입력 첫째 줄에 자연수 N과 M이 주어진다. (1 ≤ M ≤ N ≤ 8) 출력 한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열은 사전 순으로 증가하는 순서로 출력해야 한다. 이전 문제와 달라진 점은 전의 문제가 순열이었다면 이번에는 조합을 구하는 경우이다. 조건에 수열이 오름차순이라는 것이 추가되었는데, 이는 즉 1 2 3 4만 허용되고, 1 2 4 3, 1 4 3 2 등은 허용되지 않는 것이니 중복을..

    [백준] 15649 - N과 M (1) (자바/Java) 백트래킹 DFS

    문제 자연수 N과 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오. 1부터 N까지 자연수 중에서 중복 없이 M개를 고른 수열 입력 첫째 줄에 자연수 N과 M이 주어진다. (1 ≤ M ≤ N ≤ 8) 출력 한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열은 사전 순으로 증가하는 순서로 출력해야 한다. 이 문제는 백트래킹을 활용한 문제이다. 그 중에서도 DFS를 활용하여 문제를 풀었다. 먼저 방문 여부를 체크할 check 배열을 만들고, 결과를 담을 result 배열을 만들었다. cnt가 0부터 시작해서 M이 될 때까지 dfs를 계속하는데, 방문되지 않은 노드를 ..

출처: https://gmnam.tistory.com/157 [Voyager:티스토리]