목록Algorithm (25)
소소한 개발이야기
📄 방학 숙제 [백준 5532번] 🔗 [전체 소스 코드] 🔗 [문제 풀러 가기] 문제는 단순 반복문을 통해 해결하였습니다. 문제에서 주어지는 변수들은 다음과 같습니다. 총 방학 일수 풀어야 할 총 국어 페이지 풀어야 할 총 수학 페이지 하루에 풀 수 있는 국어 페이지 하루에 풀 수 있는 수학 페이지 문제 설명에서 주어지는 순서가 총 수학페이지, 총 국어 페이지, 하루 국어 페이지, 하루 수학 페이지 이지만, 입력 순서는 총 국어페이지, 총 수학페이지, 하루 국어 페이지, 하루 수학 페이지 입니다. 입력 부분만 주의한다면 쉽게 해결할 수 있습니다. (제가 실수를 해서..) 각 과목별 총 풀어야 할 페이지 -= 하루 가능한 페이지를 반복하며 방학 일수를 하루씩 빼면 됩니다. 이때 종료 조건은 각 풀어야 할 ..
📄 에라토스테네스의 체 [백준 2960번] 🔗 [전체 소스 코드] 🔗 [문제 풀러 가기] 문제 해설 문제에서 에라토스테네스의 체를 구현하는 방법을 자세하게 설명해 주었으므로 조건을 그대로 코드로 구현할 수 있는지에 대한 문제입니다. 먼저 문제의 조건을 살펴보겠습니다. 문제 조건 2부터 N부터 모든 정수를 적는다. 아직 지우지 않은 수 중 가장 작은수를 찾는다. 이것을 P라 하고, 이 수는 소수이다. P를 지우고, 아직 지우지 않은 P의 배수를 크기 순서대로 지운다. 아직 모든 수를 지우지 않았다면, 다시 2번 단계로 간다. 에라토스테네스의 체는 소수를 빠르게 구할 수 있는 알고리즘 중 하나입니다. 문제가 일반적인 소수를 구하는 것과 다른 것중 하나는 소수인 P도 지우기 때문에 소수 또한 지워진 수에 포함..
📄 한 줄로 서기 [백준 1138번] 🔗 [전체 소스 코드] 🔗 [문제 풀러 가기] 문제 해설 문제는 그리디 알고리즘을 이용해 해결하였습니다. 문제의 조건인 키가 1인 사람부터 차례대로 정보가 주어지는 점을 이용하여 그리디 알고리즘을 적용할 수 있습니다. 먼저 문제의 조건을 살펴보겠습니다. 문제 조건 총 N명의 사람수가 주어지며, 키는 1부터 N까지 모두 다르다. 사람들은 자기보다 큰 사람이 왼쪽에 몇 명 있었는지만을 기억한다. 키가 1인 사람부터 차례대로 자기보다 키가 큰 사람이 왼쪽에 몇 명이 있었는지 주어진다. 줄을 선 순서대로 키를 출력하라. 문제의 조건에서 키가 1인 사람부터 차례대로 주어진다는 점이 가장 중요한 포인트 입니다. 문제에서 요구하는 것은 내가 설 위치를 정하는 것 입니다. 자신보다..
📄 암호 만들기 [백준 1759번] 🔗 [전체 소스 코드] 🔗 [문제 풀러 가기] 문제 해설 문제는 백 트레킹(Back Tracking)을 이용해 해결하였습니다. 먼저 문제의 조건을 살펴보며 해결방법을 알아보겠습니다. 문제 조건 암호는 서로 다른 L개의 알파벳 소문자들로 구성된다. 최소 한 개의 모음과 최소 두개의 자음으로 구성되어 있다. 암호를 이루는 알파벳이 오름차순으로 배열되어 있다. 주어지는 문자의 종류는 C가지가 있다. 가능한 모든 암호를 구하라 문제의 조건에서 알파벳이 오름차순으로 배열 되어 있다는 점이 문제를 푸는데 조금 쉽게 접근할 수 있게 해줍니다. 암호를 만들 수 있는 모든 경우의 수를 따져가며(DFS) 조건에 부합하는 암호만 출력 해주면 해결 할 수 있습니다. 문제 풀이 순서 주어진 ..
📄 셀프 넘버 [백준 4673번] 🔗 [전체 소스 코드] 🔗 [문제 풀러 가기] 문제 해설 문제는 에라토스테네스의 체의 개념을 활용하여 문제를 해결하였습니다. 먼저 문제의 조건을 살펴보며 해결방법을 알아보겠습니다. 문제 조건 d(n) = n + n의 각 자리수 n은 d(n)의 생성자라고 한다. n을 시작으로 d(n), d(d(n)), ... 과 같은 무한 수열을 만들 수 있다. 생성자가 없는 수는 셀프 넘버라고 한다. 10000이하의 모든 셀프 넘버를 찾아라. 문제를 풀기 위해선 d(n)을 이해해야 합니다. d(n)은 문제에서 제시된 것과 같이 d(n) = n + n의 각 자리수 입니다. 그렇다면 여기서 생각해봐야 할 점은 n으로 인해 d(n)이 만들어 집니다. 또한 d(n)은 n보다 무조건 커지게 됩니..
📄 캥거루 세마리 [백준 2965번] 🔗 [전체 소스 코드] 🔗 [문제 풀러 가기] 문제 해설 문제는 단순 상황 파악만으로 해결할 수 있습니다. 먼저 문제의 조건을 살펴보며 해결방법을 알아보겠습니다. 문제 조건 캥거루 세마리는 일직선 상에 서로 다른 좌표위에 있다. 한 번 움직일 때 바깥쪽에 있는 두 캥거루 중 한마리가 다른 캥거루 사이의 정수 좌표로 점프한다. 한 좌표 위에 캥거루가 두 마리 이상일 수는 없다. 위의 조건을 살펴보면 바깥쪽 두 캥거루 중 한마리가 다른 캥거루 사이의 정수 좌표로 점프한다고 하였습니다. 여기서 정수 좌표는 중앙이라고 표시되어 있지 않기 때문에 어떤 좌표로든지 이동할 수 있습니다. 이 점을 힌트로 삼으면 매번 바깥쪽 캥거루 중 이동시킬 한 마리를 정하지 않아도 됩니다. 이유..
📄 NN [백준 11944번] 🔗 [전체 소스 코드] 🔗 [문제 풀러 가기] 문제는 매우 간단하다. N을 N번 출력하는 프로그램을 작성하여라. 다만, 답이 길어지는 경우 답의 앞 M자리만 출력한다. 다만 길어지는 경우는 N을 N번 출력했을 때 길이가 M보다 클 경우입니다. 문제에서 얘기한 것 처럼 매우 간단한 문제였습니다. 문제 풀이 N을 N번 더해준 문자열 NN을 구한다. NN의 길이가 M보다 작다면 NN 출력 NN의 길이가 M보다 크다면 NN의 subString(0, m) 출력 글보단 코드를 보면 더 이해하기 쉽습니다. 🌱 main 함수 public static void main(String[] args) throws IOException { String[] input = br.readLine().s..
📄 행렬 [백준 1080번] 🔗 [전체 소스 코드] 🔗 [문제 풀러 가기] 문제 해설 문제는 단순 비교 연산으로 해결하였습니다. 문제에서 주어지는 행렬을 비교와 변환(toggle)을 간편하게 하기 위해 boolean[][]으로 정의하였습니다. 문제는 어렵게 보이면서 쉬운? 문제입니다. 풀이는 문제에 접근하는 방법과 예외처리에 관한 내용 순으로 진행하겠습니다. 문제 조건 행렬A를 변환하는 연산은 행렬A의 3*3크기의 부분행렬의 모든 원소를 뒤집는 것이다. 행렬A를 행렬B로 바꾸는데 필요한 연산(부분행렬 변환)의 최솟값을 구하여라 행렬A를 행렬B로 변환할 수 없다면 -1을 출력 문제 접근 방법 문제의 조건을 보면 행렬A의 부분 행렬(3 by 3)을 변환해 행렬B를 만들 수 있는지 확인해야 하기 때문에 어려워..