2023.08.19 - 알고리즘 문제 - 2
주어진 배열 형태의 두 벡터를 내적한 값을 출력하는 문제이다.
class Solution {
public int solution(int[] a, int[] b) {
int answer = 0;
for (int i = 0;i<a.length;i++){
answer+=a[i]*b[i];
}
return answer;
}
}
내적의 기본 공식을 활용하면 그리 어려운 문제는 아니었다.
두 수가 주어질 때, 두 수 사이의 정수를 약수의 갯수가 짝수면 더하고, 홀수이면 뺀 값을 출력하는 문제이다.
class Solution {
public int solution(int left, int right) {
int answer = 0;
for(int i = left;i<=right;i++){
if(Math.sqrt(i)%1==0) answer-=i;
else answer+=i;
}
return answer;
}
}
약수의 갯수가 홀수라는 것은 결국 제곱수라는 의미이고 제곱수의 제곱근은 정수이기에 제곱근의 소수자리의 숫자가 0일 때는 빼고, 그 외에는 더하는 형태로 문제를 해결하였다. 이 또한 삼항연산자로 문제를 풀어낸 풀이도 확인되었다.
알파벳 문자열을 큰 것부터 작은 것 순서로 정렬하는 문제이다.
import java.util.*;
import java.util.stream.Stream;
class Solution {
public String solution(String s) {
Stream<String> strStream = Stream.of(s.split(""));
return Arrays.toString(strStream.sorted(Collections.reverseOrder()).toArray()).replace("[","").replace(", ","").replace("]","");
}
}
문제의 조건에서, 대문자는 소문자보다 작은 것으로 취급한다는 조건이 있었는데, 아스키 코드에서 대문자가 소문자보다 작은 값을 갖기에 별 조건 없이 단순히 역순정렬만 하면 쉽게 문제를 풀 수 있었다.
이번에도 stream을 사용해 보았는데, s를 각 문자 하나하나를 저장한 배열로 만든 후, 이를 역순정렬 -> 배열화 후 배열을 String으로 만드는 형태로 작성하였다. 다만 이를 바로 출력할 경우 배열 출력 시 함께 따라오는 [, ] 등의 요소가 있으면 안되기에 이를 제거해 주는 작업을 별도로 해 주엇다.
이용료가 사용한 횟수배만큼 증가하는 놀이기구를 입력받은 정수번 타고 싶을 때, 보유한 돈이 충분한가를 출력하는 문제이다.
class Solution {
public long solution(long price, long money, int count) {
long answer = money-(price+price*count)*count/2;
return answer>0?0:-answer;
}
}
총 이용료를 계산할 때 등차수열의 합을 사용했던 것이 생각나 이를 활용해 보았다. 다만 변수 타입을 int로 하니 채점 케이스에서 에러가 발생해 오버플로우가 일어난 것으로 판단하여 long 타입으로 바꿔주었다.
문자열의 길이가 4, 혹은 6이고 숫자로만 이루어져 있을 경우 True, 그 외의 경우는 False를 출력하는 문제이다.
class Solution {
public boolean solution(String s) {
try{
int tmp = Integer.parseInt(s);
if (s.length()!=4 && s.length()!=6)
return false;
}catch(Exception e){
return false;
}
return true;
}
}
문자를 강제로 int형으로 변환할 때, 문자가 섞여 있을 경우 에러가 발생할 것이기 때문에 try catch를 활용해 문제를 풀었다. 또한 변환 시도 후 s의 길이가 4, 6이 아닐 경우 False, 에러가 발생했을 때에도 False, 그 외에는 True를 출력하도록 코드를 작성하였다.
문제는 숫자로만 이루어져 있을 경우로 되어 있었는데, 문자열 내에 +,-는 숫자로 취급되는 것인지 tmp를 다시 String으로 변경한 변수의 길이를 기준으로 할 경우 정답이 아닌 것으로 확인되었다.
2차원 배열로 나타낸 두 행렬의 합을 구하는 문제이다.
class Solution {
public int[][] solution(int[][] arr1, int[][] arr2) {
int row = arr1[0].length;
int col = arr1.length;
int[][] answer = new int[col][row];
for(int i= 0; i<col;i++){
for(int j = 0;j<row;j++){
answer[i][j] = arr1[i][j]+arr2[i][j];
}
}
return answer;
}
}
행렬의 행은 모든 행의 길이가 동일하기에 배열의 첫 요소의 길이로 표현하였고, 열은 배열의 길이로 표현하였다. 그리고 크기가 동일한 행렬을 선언한 후, 각 행렬의 요소를 더한 값을 저장해 주었다.
두 수가 입력되면, 첫번째 입력된 수를 가로로 하고 두 번째 입력된 수를 세로로 하는 직사각형 형태로 *을 출력하는 문제이다.
import java.util.Scanner;
class Solution {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int b = sc.nextInt();
for(int i = 0;i<b;i++)
System.out.println("*".repeat(a));
}
}
Scanner를 활용해 두 수를 입력받고, 첫 수는 repeat, 다음 수는 for문 조건에 활용하여 문제를 해결하였다.