목록BOJ (40)
소소한 개발이야기
📄 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를 만들 수 있는지 확인해야 하기 때문에 어려워..
📄 등수 구하기 [백준 1205번] 🔗 [전체 소스 코드] 🔗 [문제 풀러 가기] 문제 해설 문제는 반복문을 이용해 해결하였습니다. 이분탐색(Binary Search)으로도 해결할 수 있으므로 따로 시도해보시면 좋습니다. 문제를 해결할 때 조건이 생각보다 많기 때문에 잘 살펴보아야 합니다. 먼저 문제의 조건을 살펴보겠습니다. 문제 조건 이미 게임을 하고 얻은 점수 N개가 비오름차순으로 주어진다. 랭킹 리스트에 등록될 수 있는 점수는 P개 이다. 등수는 위에서부터 몇 번쨰 있는 점수인지로 결정하지만 같은 점수가 있을 때에는 그러한 점수의 등수 중에 가장 작은 등수가 된다. 새로운 점수의 등수를 구하여라. (랭킹 리스트안에 들어갈 수 없다면 -1을 출력한다.) 여기서 살펴보아야 할 첫 번째 사항은 조건 1에..
📄 수들의 합 [백준 1789번] 🔗 [전체 소스 코드] 🔗 [문제 풀러 가기] 문제 해설 문제는 for문을 이용하여 해결하였습니다. 문제를 처음 봤을 때 어려워 보일 수 있지만 조금만 쉽게 생각하면 해결하기 쉽습니다. 먼저 문제의 조건을 살펴보겠습니다. 문제 조건 서로 다른 N개의 자연수의 합이 S라고 할 때 자연수 N의 최댓값을 구하여라. 즉, 가장 많은 자연수를 사용해서 S를 만들어라 라고 이야기 하는 것과 같습니다. 문제의 예제를 보면 S가 200이라고 주어져 있는데 200을 만들 수 있는 가지수는 아래와 같습니다. 1 + 199 1 + 2 + 197 1 + 2 + 3 + 194 ... 문제의 풀이는 가장 많은 수를 사용해야 하기 때문에 1부터 더해가면서 주어진 S를 넘지 않는 선까지 모두 더했을..
📄 신입 사원 [백준 1946번] 🔗 [전체 소스 코드] 🔗 [문제 풀러 가기] 문제 해설 문제는 신입 사원의 정보를 저장하는 클래스(Employee)를 만들고 정렬하여 문제를 해결하였습니다. 문제의 조건을 잘 살펴봐야지 헷갈리지 않기 때문에 먼저 문제의 조건을 살펴보겠습니다. 문제 핵심 조건 다른 모든 지원자와 비교했을 때 서류 성적과 면접 성적 중 적어도 하나가 다른 지원자보다 떨어지지 않는 자만 선발한다. 문제의 조건은 한 가지 이지만 핵심적인 내용을 모두 담고 있습니다. 또한 조건에서 힌트 아닌 힌트? 도 제공해주고 있습니다. 적어도 하나가 다른 지원자보다 떨어지지지 않아야 한다. 라는 조건을 살펴보면 두 성적 중 하나는 무조건 다른 사람보다 높아야 합니다. 그렇다면 두 성적 중 한 가지를 기준으..
📄 30 [백준 10610번] 🔗 [전체 소스 코드] 🔗 [문제 풀러 가기] 문제는 각 수(0~9)의 개수를 이용하여 문제를 해결하였습니다. 먼저 30의 배수가 될 수 있는 조건에 대해 살펴보면 다음과 같습니다. 첫 번째로, 만들어지는 수의 맨 마지막은 무조건 0으로 끝나야 합니다. 예를 들면, 30, 60, 210등 모든 수는 0으로 끝이나기 때문에 0은 적어도 1개 이상 필요합니다. 따라서 주어진 숫자에 0이 적어도 1개이상 포함되어야 합니다. 두 번째로, 3의 배수이면서 10의 배수여야 합니다. 첫 번째 조건에서 0으로 끝나야 하는 조건이 10의 배수임을 나타냅니다. 따라서 2번째 조건에서는 3의 배수인지만 확인하면 됩니다. 여기서 3의 배수인지 확인해야하는데 3의 배수를 나열해보면 다음과 같습니다..
📄 회의실 배정 [백준 1931번] 🔗 [전체 소스 코드] 🔗 [문제 풀러 가기] 문제는 회의실 정보를 저장하는 Conference 클래스를 만들고 정렬하여 해결하였습니다 문제를 해결할 때 정렬 기준이 중요합니다. 문제를 보며 풀어보겠습니다. 먼저 회의의 시작시간과 종료시간이 주어지고 한 개의 회의실 안에서 최대한 많은 회의가 진행될 수 있도록 회의를 배정해야 하는 문제입니다. 여기서 가장 많은 회의를 배정할 수 있는 방법은 회의가 빨리 끝나는 시간 순서대로 정렬하는 방법입니다. 회의가 빨리 끝나는 순서대로 진행함으로써 앞에서부터 최대한 많은 회의를 진행할 수 있습니다. 다만 주의해야할 점은 회의가 끝나는 시간이 같다면 회의 시작시간이 빠른 순으로 정렬을 해야합니다. 이와 같은 이유는 시작시간과 종료시간..
📄 문자열 [백준 1120번] 🔗 [전체 소스 코드] 🔗 [문제 풀러 가기] 문제는 2중 for문으로 해결하였습니다. 먼저 문제의 조건 및 접근하는 방법에 관하여 살펴보겠습니다. 문제는 두 문자열의 길이를 같게 만들고 각 차이를 최소로 만드는게 목적입니다. 여기서 가장 먼저 생각할 수 있는 방법은 만약 문자를 추가해야 한다면 앞, 뒤 어디든지 추가할 수 있으므로 앞에 추가한다면 Y의 첫 번째 문자를 X에 추가하고, 뒤에 추가한다면 Y의 마지막 문자를 X에 추가해서 차이를 최소로 해야겠다~ 라고 생각하신 분들은 저와 같이 잘못 접근한겁니다. 문제를 다시 살펴보면 문자열을 알고 싶은게 아니고 최소 차이만 알고 싶어합니다. 그렇다면 X의 앞, 뒤에 추가 할 문자는 어차피 내맘대로 넣는거니 신경쓰지 않아도 됩니..