반응형

알고리즘 53

[백준][1339번]단어 수학[JAVA]

문제 설명 민식이는 수학학원에서 단어 수학 문제를 푸는 숙제를 받았다. 단어 수학 문제는 N개의 단어로 이루어져 있으며, 각 단어는 알파벳 대문자로만 이루어져 있다. 이때, 각 알파벳 대문자를 0부터 9까지의 숫자 중 하나로 바꿔서 N개의 수를 합하는 문제이다. 같은 알파벳은 같은 숫자로 바꿔야 하며, 두 개 이상의 알파벳이 같은 숫자로 바뀌어지면 안 된다. 예를 들어, GCF + ACDEB를 계산한다고 할 때, A = 9, B = 4, C = 8, D = 6, E = 5, F = 3, G = 7로 결정한다면, 두 수의 합은 99437이 되어서 최대가 될 것이다. N개의 단어가 주어졌을 때, 그 수의 합을 최대로 만드는 프로그램을 작성하시오. 풀이 방법 백트래킹 + 구현문제였다. 문자열의 값을 부여하면서..

[백준][14500번]테트로미노[JAVA]

문제 설명 폴리오미노란 크기가 1×1인 정사각형을 여러 개 이어서 붙인 도형이며, 다음과 같은 조건을 만족해야 한다. 정사각형은 서로 겹치면 안 된다. 도형은 모두 연결되어 있어야 한다. 정사각형의 변끼리 연결되어 있어야 한다. 즉, 꼭짓점과 꼭짓점만 맞닿아 있으면 안 된다. 정사각형 4개를 이어 붙인 폴리오미노는 테트로미노라고 하며, 다음과 같은 5가지가 있다. 아름이는 크기가 N×M인 종이 위에 테트로미노 하나를 놓으려고 한다. 종이는 1×1 크기의 칸으로 나누어져 있으며, 각각의 칸에는 정수가 하나 쓰여 있다. 테트로미노 하나를 적절히 놓아서 테트로미노가 놓인 칸에 쓰여 있는 수들의 합을 최대로 하는 프로그램을 작성하시오. 테트로미노는 반드시 한 정사각형이 정확히 하나의 칸을 포함하도록 놓아야 하며..

[백준][19236번]청소년 상어[JAVA]

문제 설명 아기 상어가 성장해 청소년 상어가 되었다. 4×4크기의 공간이 있고, 크기가 1×1인 정사각형 칸으로 나누어져 있다. 공간의 각 칸은 (x, y)와 같이 표현하며, x는 행의 번호, y는 열의 번호이다. 한 칸에는 물고기가 한 마리 존재한다. 각 물고기는 번호와 방향을 가지고 있다. 번호는 1보다 크거나 같고, 16보다 작거나 같은 자연수이며, 두 물고기가 같은 번호를 갖는 경우는 없다. 방향은 8가지 방향(상하좌우, 대각선) 중 하나이다. 오늘은 청소년 상어가 이 공간에 들어가 물고기를 먹으려고 한다. 청소년 상어는 (0, 0)에 있는 물고기를 먹고, (0, 0)에 들어가게 된다. 상어의 방향은 (0, 0)에 있던 물고기의 방향과 같다. 이후 물고기가 이동한다. 물고기는 번호가 작은 물고기부..

[백준][20055번]컨베이어 벨트 위의 로봇[JAVA]

문제 설명 길이가 N인 컨베이어 벨트가 있고, 길이가 2N인 벨트가 이 컨베이어 벨트를 위아래로 감싸며 돌고 있다. 벨트는 길이 1 간격으로 2N개의 칸으로 나뉘어져 있으며, 각 칸에는 아래 그림과 같이 1부터 2N까지의 번호가 매겨져 있다. 벨트가 한 칸 회전하면 1번부터 2N-1번까지의 칸은 다음 번호의 칸이 있는 위치로 이동하고, 2N번 칸은 1번 칸의 위치로 이동한다. i번 칸의 내구도는 Ai이다. 위의 그림에서 1번 칸이 있는 위치를 "올라가는 위치", N번 칸이 있는 위치를 "내려가는 위치"라고 한다. 컨베이어 벨트에 박스 모양 로봇을 하나씩 올리려고 한다. 로봇은 올라가는 위치에만 땅에서 올라가고, 내려가는 위치에서만 땅으로 내려갈 수 있다. 내려가는 위치에 로봇이 있는 경우 로봇은 반드시 ..

[백준][15655번]N과 M(6)[JAVA]

문제 설명 N개의 자연수와 자연수 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오. N개의 자연수는 모두 다른 수이다. N개의 자연수 중에서 M개를 고른 수열 고른 수열은 오름차순이어야 한다. 풀이 방법 N과M(5)번 문제와, N과M(4)번 문제의 결합 문제이다. 주어진 N을 이용해서 순열을 만들지만, N배열이 정렬되어 있다는 가정으로 매개변수의 idx를 1씩 증가하면 된다. 알아야되는 개념 백트래킹 Stringbuilder import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.*; public class Main {..

[백준][15654번]N과 M(5)[JAVA]

문제 설명 N개의 자연수와 자연수 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오. N개의 자연수는 모두 다른 수이다. N개의 자연수 중에서 M개를 고른 수열 풀이 방법 주어진 N개의 배열을 갖고 순열을 만들면 되는 문제였다. N과M(1)번 문제와 유사했고, N의 원소에 대해 값을 꺼내고, 중복 체크를 해주면 되는 문제이다. 알아야되는 개념 백트래킹 Stringbuilder import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.*; public class Main { static int N, M; static int ..

[백준][15652번]N과 M(4)[JAVA]

문제 설명 자연수 N과 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오. 1부터 N까지 자연수 중에서 M개를 고른 수열 같은 수를 여러 번 골라도 된다. 고른 수열은 비내림차순이어야 한다. 길이가 K인 수열 A가 A1 ≤ A2 ≤ ... ≤ AK-1 ≤ AK를 만족하면, 비내림차순이라고 한다. 풀이 방법 중복 허용 -> N과M(3)번과 유사하다. 비내림차순 -> N과M(2)번과 유사하다. 즉, 매개변수에 idx를 추가하지만, 오름차순이 아니기 때문에 +1을 넣어주지 않으면 된다. idx에 값으로 반복문을 돌기 때문에 arr[0]은 항상 arr[1] 보다 작거나 같게 된다. 알아야되는 개념 백트래킹 Stringbuilder import java.util.Sca..

[백준][15651번]N과 M(3)[JAVA]

문제 설명 자연수 N과 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오. 1부터 N까지 자연수 중에서 M개를 고른 수열 같은 수를 여러 번 골라도 된다. 풀이 방법 N과 M(1)에는 중복을 허용하지 않나 visit 배열을 사용했었다. 하지만 N과M(3)에서는 중복을 허용해준다 !! 그럼으로 중복을 체크했던 visit 부분을 지워주면 된다. 단, JAVA를 사용할 경우 System.out.print를 쓰면 시간 초과가 발생한다. 이러한 문제를 방지하기 위해서 StringBuilder를 사용하면 된다. (System.out.print는 매우 느린 속도를 갖고 있다) 알아야되는 개념 백트래킹 Stringbuilder import java.util.Scanner; ..

[백준][15650번]N과 M(2)[JAVA]

문제 설명 자연수 N과 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오. 1부터 N까지 자연수 중에서 중복 없이 M개를 고른 수열 고른 수열은 오름차순이어야 한다. 풀이 방법 N과 M 1번과 다르게 오름차순 조건이 추가되었다. 그렇다면 매개변수 idx를 추가하여, 다음 출력할 문자를 이전 출력할 문자 + 1을 해준다. 알아야되는 개념 백트래킹 import java.util.Scanner; public class Main { private static int N,M; private static boolean visit[]; private static int arr[]; public static void func(int depth, int N, int M, in..

[백준][15649번]N과 M(1)[JAVA]

문제 설명 자연수 N과 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오. 1부터 N까지 자연수 중에서 중복 없이 M개를 고른 수열 풀이 방법 전형적인 백트래킹 문제였다. 백트레킹의 기초이기 때문에 따로 풀이가 없고, 잘 모르는 사람은 유튜브에 강의를 벡트래킹 찾아보기 바란다. 알아야되는 개념 백트래킹 import java.util.Scanner; public class Main { private static int N,M; private static boolean visit[]; private static int arr[]; static void func(int depth, int N, int M){ if (depth == M){ for(int i=0;i

반응형