전체 글 56

[JAVA] 백준 알고리즘 14225번 (부분수열의 합)

문제 이번에 다뤄볼 문제는 14225번 문제 '부분수열의 합'입니다. 문제에서 연습해야 하는key-point는 비트마스크입니다. 우선 비트마스크가 무엇인지 알아보겠습니다. 비트마스크는 알고리즘 기법을 뜻하는건 아닙니다. 컴퓨터 과학에서 마스크(mask) 또는 비트마스크(bitmask)로 불리우는 개념은 특히 비트 필드에서 비트 연산에 사용되는 데이터를 뜻합니다. 즉, 2진수 형태의 비트에서 각 포지션별로 true(1), false(0)가 마스킹 된 데이터를 비트마스크라고 생각하면 됩니다. 비트 연산으로는 기본적으로 AND연산(&), OR연산(|), XOR(^)연산, NOT연산(~), 쉬프트연산(>)이 존재하며 우리는 오늘 비트마스크 그리고 AND연산과 쉬프트연산을 활용하여 문제를 해결해보겠습니다. 문제에..

algorithm 2022.01.15

[JAVA] 백준 알고리즘 10815번 (숫자 카드)

문제 이번에 다뤄볼 문제는 10815번 문제 '숫자 카드'입니다. 문제에서 연습해야 하는key-point는 분할정복 입니다. 분할 정복 알고리즘(Divide and conquer algorithm)은 그대로 해결할 수 없는 문제를 작은 문제로 분할하여 문제를 해결하는 방법이나 알고리즘을 뜻합니다. 빠른 정렬이나 합병 정렬로 대표되는 정렬 알고리즘 문제와 고속 푸리에 변환(FFT) 문제가 대표적인 케이스 입니다. 이 문제는 분할정복 유형의 기초적인 예제 문제이며 다양한 구현 방식 중 이진탐색을 활용하여 해결해보겠습니다. 이진탐색(binary search)은 오름차순으로 정렬된 리스트에서 특정한 값의 위치를 찾는 알고리즘 입니다. 처음 중간의 값을 임의의 값으로 선택하여, 그 값과 찾고자 하는 값의 크고 작..

algorithm 2022.01.08

[JAVA] 백준 알고리즘 2138번 (전구와 스위치)

문제 이번에 다뤄볼 문제는 2138번 문제 ' 전구와 스위치'입니다. 문제에서 연습해야 하는key-point는 그리디 알고리즘 입니다. 그리디 알고리즘(욕심쟁이 알고리즘, Greedy Algorithm)이란 "매 선택에서 지금 이 순간 당장 최적인 답을 선택하여 적합한 결과를 도출하자" 라는 모토를 가지는 알고리즘 설계 기법입니다. 예를들어 'A도시에서 B도시까지 이동 할 때, 총 5개의 지점을 꼭 거쳐서 가야하며 이때의 최소 이동거리를 구하시오.' 라는 요구사항이 있다면 그리디 알고리즘을 사용할 경우 현재의 지점에서 가장 가까운 지점으로 이동을 하며 최종 결과를 도출해내는 알고리즘이라 생각하면 됩니다. 단, 여기서 주의해야 할 부분은 그리디 알고리즘을 사용하면 매 선택이 그 순간에 대해서는 최적이지만 ..

algorithm 2022.01.02

[JAVA] 백준 알고리즘 1021번 (회전하는 큐)

문제 이번에 다뤄볼 문제는 1021번 문제 '회전하는 큐'입니다. 문제에서 연습해야 하는key-point는 Deque(덱)입니다. Deque이란 양쪽 끝에서 삽입과 삭제가 모두 가능한 자료 구조의 한 형태입니다. 두 개의 포인터를 사용하여, 양쪽에서 삭제와 삽입을 발생시킬 수 있고 큐와 스택을 합친 형태로 생각할 수 있습니다. 흔히 우리가 카드게임을 할 때 카드덱 이라고 부르는 그 덱과 유사한 개념이라고 생각할 수 있습니다. 우선 문제를 천천히 분석해 보겠습니다. 문제에서 결과로 원하는 값은 주어진 숫자를 순서대로 뽑기 위한 큐(카드덱)의 움직임 최솟값 입니다. 예제 입력 2를 통해 문제에서 원하는 값을 가져오는 과정에 대해 살펴보겠습니다. 주어진 연산과 상황은 아래와 같습니다. [연산 3가지] 1. 맨..

algorithm 2021.12.26

[JAVA] 백준 알고리즘 1654번 (랜선 자르기)

문제 이번에 다뤄볼 문제는 1654번 문제 '랜선 자르기'입니다. 이 문제는 이분탐색을 활용하여 해결 할 수 있습니다. 이분탐색(Binary Search)이란 이미 정렬되어 있는 배열에서 탐색 범위를 반씩 줄여 가며 찾고자 하는 값을 찾는 탐색 방법인데요. 검색 범위를 줄여 나가면서 원하는 데이터를 검색하는 알고리즘입니다. 검색 범위에 해당하는 하한값, 상한값을 기준으로 중간값부터 탐색을 시작하는 방식이고 이에 대하여 1부터 100까지의 범위에서 77이란 숫자를 찾는 과정을 통해 예를 들어보겠습니다. 첫 시작은 하한값(1)과 상한값(100)의 중간값인 50부터 시작을 합니다. 찾고자 하는 77의 경우 중간값보다 큰 값이기 때문에 하한값(1)을 중간값(50)으로 상향 조정하여 재정의 합니다. 이렇게 될 경..

algorithm 2021.12.19

[JAVA] 백준 알고리즘 1759번 (암호 만들기)

문제 이번에 다뤄볼 문제는 1759번 문제 '암호 만들기'입니다. 우선 문제를 분석해보도록 하겠습니다. 문제에서 원하는건 "주어진 문자들을 활용하여 L개의 문자로 구성된 암호문자열을 만들어내라" 입니다. 첫째 줄에서 두 정수를 입력받습니다. L = 암호문자의 글자수, C = 암호를 구성할 문자들의 수 두번째 줄에서는 C개 만큼의 암호구성이 주어지네요. 그리고 여기서 조건이 두가지가 주어졌습니다. 1. 최소 한 개의 모음, 최소 두 개의 자음 으로 구성된 암호여야 한다. 2. 각 알파벳 암호는 오름차순을 갖는다. 두번째 조건의 경우 Arrays.sort() 메서드를 통해 입력받은 C개의 암호문자를 미리 정렬을 시켜놓고 진행하면 쉽게 만족시킬 수 있으니 첫번째 조건에 대해서만 메서드를 하나 만들어 체크하면 ..

algorithm 2021.12.10

가을캠핑::인제 하추자연휴양림 캠핑장

안녕하세요. 오늘은 지난 10월 23일 1박으로 다녀온 인제에 위치한 하추자연휴양림 캠핑장 리뷰를 하려합니다 :) 하추자연휴양림은 숲나들e 홈페이지에서 예약하실 수 있구요. 매주 수요일날 5주 뒤의 일주일예약이 오픈됩니다! 예약하실때 참고하세요. 이 캠핑장의 특징은 모든 사이트가 독립사이트로 구성되어 있다는 점입니다. 프라이빗한 캠핑을 좋아하신다면 안성맞춤이에요 ㅎㅎ 하추자연휴양림은 다리를 건너 입구에 들어가면 바로 관리소가 있습니다. 거기서 체크인 하시면 되구요. 야영장은 아래 사진의 빨간색으로 표시된 부분이에요. 보이는것 처럼 자연휴양림 입구 및 관리동과 야영장의 거리가 꽤 멀기 때문에 차량으로 이동하셔야 합니다. 근데 그 이동하는 루트의 경사가 정말 굉장히 .. 굉장히 가파르니까 당황하지 마시고 천..

취미/캠핑 2021.12.08

가을캠핑::포천 아버지의 숲 (별의계곡1 사이트)

안녕하세요. 얼마전 겨우겨우 예약에 성공한 포천 아버지의 숲을 다녀왔습니다 :) 아버지의숲 산정캠프 : 네이버 방문자리뷰 1571 · ★4.76 · 매일 00:00 - 24:00 m.place.naver.com 아버지의 숲은 매월 1일 다음달의 예약을 받고 있으니 예약에 참고하시길 바랍니다. 네이버예약을 통해서 진행하시면 되는데 주의하셔야 할 부분은 만약 주말캠핑을 가려 하신다면 꼭! 금 / 토 / 일 2박 3일로 예약을 하셔야 합니다. 토/일 1박 2일로만 예약을 걸면 취소된다고 하니 유의하세요. 예약이 열리는 시간은 정해져있지 않습니다. 하지만 경험상(?) 오전중에 열리고 예약이 마감되는것 같아요. 아버지의 숲은 사이트가 굉장히 많습니다. 개인적으로 추천하는 명당자리는 별의계곡1 / 님프의정원 4,5..

취미/캠핑 2021.11.04

[JAVA] 백준 알고리즘 11726번 (2xn 타일링)

문제 이번에 다뤄볼 문제는 11726번 문제 '2xn 타일링'입니다. 2xn 타일링 문제에서 연습해야 하는 key-point는 DP입니다. DP(Dynamic Programing)는 이름때문에 어려워 하시는 분들이 많습니다. DP는 쉽게 말하면 어려운 또는 커다란 문제를 작은 문제들로 나눠서 풀이하겠다 인데요. 작은 문제들을 해결해서 메모해놓고 나중에 더 큰 문제를 해결하면서 같은 작은 문제를 만난다면 앞서 풀었던 작은 문제의 결과를 활용하는 방식입니다. 해당 문제에서 주어진 큰 문제는 2xn 사이즈의 직사각형이며 이를 작은 직사각형인 2x1과 1x2 타일로 채워나가는 문제입니다. 목적지인 n까지 반복문을 수행하며 계속해서 이전에 해결한 작은문제들을 더해가면 완성됩니다. 문제에서 제시한 입력의 범위 중 ..

algorithm 2021.08.22

[JAVA] 백준 알고리즘 1463번 (1로 만들기)

문제 이번에 다뤄볼 문제는 1463번 문제 '1로 만들기'입니다. 1로 만들기 문제에서 연습해야 하는 key-point는 DP입니다. DP(Dynamic Programing)는 이름때문에 어려워 하시는 분들이 많습니다. 그렇다고 해서 동적계획법에 대해 구글링하며 찾아보실 필요는 없습니다. DP는 쉽게 말하면 어려운 또는 커다란 문제를 작은 문제들로 나눠서 풀이하겠다 인데요. 작은 문제들을 해결해서 메모해놓고 나중에 더 큰 문제를 해결하면서 같은 작은 문제를 만난다면 앞서 풀었던 작은 문제의 결과를 활용하는 방식입니다. 문제에서 주어진 1로 만들기의 경우 총 3가지의 연산방식이 있습니다. 3으로 나누기 / 2로 나누기 / 1 빼기 이 3개의 연산을 갖고 dp[]라는 메모장에 작은 문제부터 올라가며 해결하고..

algorithm 2021.08.22

[JAVA] 백준 알고리즘 2667번 (단지번호붙이기)

문제 이번에 다뤄볼 문제는 2667번 문제 '단지번호붙이기'입니다. 단지번호붙이기 문제에서 연습해야 하는 key-point는 DFS입니다. DFS(깊이 우선 탐색)이란 맹목적 탐색방법의 하나로 탐색트리의 최근에 첨가된 노드를 선택하고, 이 노드에 적용 가능한 동작자 중 하나를 적용하여 트리에 다음 수준(level)의 한 개의 자식노드를 첨가하며, 첨가된 자식 노드가 목표노드일 때까지 앞의 자식 노드의 첨가 과정을 반복해 가는 방식입니다. 문제에서 원하는건 총 몇개의 단지가 존재하는지, 그리고 그 단지들이 갖고있는 각 집의 총 수를 오름차순 정렬으로 보여달라 입니다. 제공받은 map을 순회하며 집을 뜻하는 1을 만날경우 해당 포인트에서 바로 깊이우선탐색을 시작합니다. 탐색을 시작하는 포인트에서부터 상,하,..

algorithm 2021.08.14

[JAVA] 백준 알고리즘 5014번 (스타트링크)

문제 이번에 다뤄볼 문제는 5014번 문제 '스타트링크'입니다. 스타트링크 문제에서 연습해야 하는 key-point는 BFS입니다. 너비 우선 탐색(Breadth-first search, BFS)은 맹목적 탐색방법의 하나로 시작 정점을 방문한 후 시작 정점에 인접한 모든 정점들을 우선 방문하는 방법입니다. 더 이상 방문하지 않은 정점이 없을 때까지 방문하지 않은 모든 정점들에 대해서도 너비 우선 검색을 적용합니다. 따라서 해당 문제를 풀기 위해 앞으로 탐색을 시작할 층을 담을 queue를 하나 만들고 방문한 층을 기록할 visited 배열을 하나 만듭니다. visited에 담기는 값이 곧 방문 횟수가 되는데요. 예를들면 4층에서 시작할 경우 visited[4]의 값은 1부터 시작합니다. (한번에 방문했다..

algorithm 2021.08.12
반응형