목록공부/알고리즘 문제 (41)
빠에야는 개발중
행렬의 곱셈은, 곱하려는 두 행렬의 어떤 행과 열을 기준으로, 좌측의 행렬은 해당되는 행, 우측의 행렬은 해당되는 열을 순서대로 곱한 값을 더한 값이 들어갑니다. 행렬을 곱하기 위해선 좌측 행렬의 열의 개수와 우측 행렬의 행의 개수가 같아야 합니다. 곱할 수 있는 두 행렬 A,B가 주어질 때, 행렬을 곱한 값을 출력하는 productMatrix 함수를 완성해 보세요. 행렬의 곱셈을 이론적으로는 알고 있었는데 코드로 구현하려고 하니 어딘가 부족한 부분이 느껴졌다.2차원 행렬에서 생각이 굳어 진행을 못하고 있다가 다른 사람이 짠 코드를 보니 3차원 행렬로 해결했더라.틀을 깨지 못한 것 같아서 아쉬웠다. 손으로 직접 테스트 케이스를 작성해봤으면 빨리 눈치챘을지도 모른다. 자기과신... 1234567891011..
reverseInt 메소드는 int형 n을 매개변수로 입력받습니다. n에 나타나는 숫자를 큰것부터 작은 순으로 정렬한 새로운 정수를 리턴해주세요. 예를들어 n이 118372면 873211을 리턴하면 됩니다. n은 양의 정수입니다. int형 정수의 각 자릿수를 쪼개는 것이 포인트라고 할 수 있다.각각의 자릿수를 배열에 담아 내림차순 정렬하고, 다시 정수로 만들어주었다.각 자릿수를 10 지수승 단위로 받으려고 했다가 꼬여서 단순히 일의 자리의 수를 가져오고 10씩 나누는 방법을 사용했다.이 방법이 바로 생각나지 않아서 꽤 고민을 했다. 자괴감 타임...123456789101112131415161718192021222324252627282930313233343536373839import java.util.Ar..
자연수로 이루어진 길이가 같은 수열 A,B가 있습니다. 최솟값 만들기는 A, B에서 각각 한 개의 숫자를 뽑아 두 수를 곱한 값을 누적하여 더합니다. 이러한 과정을 수열의 길이만큼 반복하여 최종적으로 누적된 값이 최소가 되도록 만드는 것이 목표입니다.예를 들어 A = [1, 2] , B = [3, 4] 라면A에서 1, B에서 4를 뽑아 곱하여 더합니다.A에서 2, B에서 3을 뽑아 곱하여 더합니다.수열의 길이만큼 반복하여 최솟값 10을 얻을 수 있으며, 이 10이 최솟값이 됩니다. 수열 A,B가 주어질 때, 최솟값을 반환해주는 getMinSum 함수를 완성하세요. 간단하게 두 배열을 각각 오름차순, 내림차순으로 정렬하여 차례대로 곱해서 더하면 된다. 쉽게 해결했다.1234567891011121314151..
numberOfPrime 메소드는 정수 n을 매개변수로 입력받습니다.1부터 입력받은 숫자 n 사이에 있는 소수의 개수를 반환하도록 numberOfPrime 메소드를 만들어 보세요.소수는 1과 자기 자신으로만 나누어지는 수를 의미합니다. (1은 소수가 아닙니다.)10을 입력받았다면, 1부터 10 사이의 소수는 [2,3,5,7] 4개가 존재하므로 4를 반환 5를 입력받았다면, 1부터 5 사이의 소수는 [2,3,5] 3개가 존재하므로 3를 반환 이 문제는 1. 1부터 n까지 각각 약수가 존재하는지 검사2. 에라토스테네스의 체 이렇게 두가지 방법으로 풀 수 있다. 1번 방법은 모든 경우를 다 해보는 방법이고 2번 방법은 그나마 계산 수를 줄이는 방법이다. 그래서 2번을 선택했다.123456789101112131..
행렬의 덧셈은 행과 열의 크기가 같은 두 행렬의 같은 행, 같은 열의 값을 서로 더한 결과가 됩니다. 2개의 행렬을 입력받는 sumMatrix 함수를 완성하여 행렬 덧셈의 결과를 반환해 주세요.예를 들어 2x2 행렬인 A = ((1, 2), (2, 3)), B = ((3, 4), (5, 6)) 가 주어지면, 같은 2x2 행렬인 ((4, 6), (7, 9))를 반환하면 됩니다.(어떠한 행렬에도 대응하는 함수를 완성해주세요.) 단순한 행렬의 덧셈 문제인데 처음에 정사각행렬만 생각했다가 틀려서 다시 풀다가 A.length가 높이값이라는 것을 알게 되었다. 이전에는 전체 요소 크기인줄 알고 있었는데 바로 잡아서 기분이 좋다. 123456789101112131415161718192021222324252627cla..
reverseStr 메소드는 String형 변수 str을 매개변수로 입력받습니다. str에 나타나는 문자를 큰것부터 작은 순으로 정렬해 새로운 String을 리턴해주세요. str는 영문 대소문자로만 구성되어 있으며, 대문자는 소문자보다 작은 것으로 간주합니다. 예를들어 str이 Zbcdefg면 gfedcbZ을 리턴하면 됩니다. 이 문제는 "대문자가 소문자보다 작다"라는 조건이 붙어있지만 기본적으로 대문자의 코드값이 소문자보다 작기 때문에 그냥 sort() 메소드로 정렬하고 reverse해주면 되는 문제이다. 만약 우선순위가 반대였다면 toUpperCase(), toLowerCase()로 대소문자를 서로 바꿔주면 된다. 123456789101112131415import java.util.Arrays; pu..
문제 출처 : Baekjoon Online Judge 2251번 "물통" - https://www.acmicpc.net/problem/2251 완전 탐색 강의를 들으면서 접한 문제이다. 이러한 종류의 탐색 문제를 푸는 방법은 n중 for문, 큐, 순열, 재귀, 비트마스크 등이 있는데, 이번에는 큐를 사용한 bfs로 문제를 풀었다. 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610..
Baekjoon Online Judge 10992번 "별찍기 - 17"https://www.acmicpc.net/problem/10992 새롭게 시작한 알고리즘 강의에서 추천해준 연습용 별찍기 문제를 풀던 중, 속이 비어있는 삼각형을 출력하는 문제를 만났다.처음에는 뭔가 간단히 끝낼 수 있을것 같은 느낌이 들어서 이것저것 시도해봤는데, 코드가 조잡해지기만 하고 별다른 진전이 없었다. 그래서 구글링을 해봤는데 이런 풀이를 발견했다.#include int n; int main() { scanf("%d", &n); for (int i = 0; i
준규가 사는 나라는 우리가 사용하는 연도와 다른 방식을 이용한다. 준규가 사는 나라에서는 수 3개를 이용해서 연도를 나타낸다. 각각의 수는 지구, 태양, 그리고 달을 나타낸다.지구를 나타내는 숫자를 E, 태양을 나타내는 숫자를 S, 달을 나타내는 숫자를 M이라고 했을 때, 이 세 수는 서로 다른 범위를 가진다. (1 ≤ E ≤ 15, 1 ≤ S ≤ 28, 1 ≤ M ≤ 19)우리가 알고있는 1년은 준규가 살고있는 나라에서는 1 1 1로 나타낼 수 있다. 1년이 지날 때마다, 세 수는 모두 1씩 증가한다. 만약, 어떤 수가 범위를 넘어가는 경우에는 1이 된다.예를 들어, 15년은 15 15 15로 나타낼 수 있다. 하지만, 1년이 지나서 16년이 지나면 16 16 16이 아니라 1 16 16이 된다. 이유..
여러 조건을 만족하는 정렬을 구현해보자. 우선 정렬할 객체를 생성할 클래스를 작성한다. 여기서는 Student로 하겠다.1234567891011class Student { int num; String name; String address; Student(int num, String name, String address) { this.num = num; this.name = name; this.address = address; }}Colored by Color Scriptercs 그 다음 Comparator 인터페이스를 구현하는 StudentCompare 클래스를 작성한다. 이때 Comparator 인터페이스의 제네릭 타입을 정해줘야한다. Student 끼리 비교하기 때문에 Student로 설정한다.Stu..