Programmers #24

이강용·2023년 7월 1일
0

Programmers

목록 보기
23/58

부족한 금액 계산하기

📑 문1) 새로 생긴 놀이기구는 인기가 매우 많아 줄이 끊이질 않습니다. 이 놀이기구의 원래 이용료는 price원 인데, 놀이기구를 N 번 째 이용한다면 원래 이용료의 N배를 받기로 하였습니다. 즉, 처음 이용료가 100이었다면 2번째에는 200, 3번째에는 300으로 요금이 인상됩니다.
놀이기구를 count번 타게 되면 현재 자신이 가지고 있는 금액에서 얼마가 모자라는지를 return 하도록 solution 함수를 완성하세요. 단, 금액이 부족하지 않으면 0을 return 하세요.


제한 사항

  • 놀이기구의 이용료 price : 1 ≤ price ≤ 2,500, price는 자연수
  • 처음 가지고 있던 금액 money : 1 ≤ money ≤ 1,000,000,000, money는 자연수
  • 놀이기구의 이용 횟수 count : 1 ≤ count ≤ 2,500, count는 자연수

입출력 예

pricemoneycountresult
320410

입출력 예 설명

입출력 예 #1

  • 이용금액이 3인 놀이기구를 4번 타고 싶은 고객이 현재 가진 금액이 20이라면, 총 필요한 놀이기구의 이용 금액은 30 (= 3+6+9+12) 이 되어 10만큼 부족하므로 10을 return 합니다.

나의 풀이

package programmers;

public class CalculateTheShortfall {
	
	 public static long solution(int price, int money, int count) {
	        long totalPrice = 0;
	        
	        for(int i = 1; i <= count; i++) {
	        	totalPrice += price * i;
	        }
	        
	        if(totalPrice - money < 0) {
	        	return 0;
	        }
	        return totalPrice - money;
	    }
	 
	 public static void main(String[] args) {
		solution(3, 20, 4);
	}

}

나의 생각

나의 경우, for문 반복을 통해 count만큼 반복을 수행함과 동시에, totalPrice 변수에 += price * i 를 수행함으로써, 전체 가격을 더해주는 방법을 사용하였다. 하지만 for문의 반복횟수는 count의 수에 따라 반복횟수가 증가하기 때문에 이 또한, 고려해야할 대상이라고 할 수 있다. 현재의 경우 시간복잡도가 O(n) 즉, 선형 시간복잡도를 따르기 때문에 count 값이 증가함에 따라 필요한 계산 시간도 선형적으로 증가한다고 볼 수 있다.


등차수열의 합을 적용한 풀이

package programmers;

public class CalculateTheShortfall {

    public static long solution(int price, int money, int count) {
        long totalPrice = ((long) count * (1 + count) * price ) / 2;
        
        if(totalPrice - money < 0) {
            return 0;
        }
        return totalPrice - money;
    }

    public static void main(String[] args) {
        solution(3, 20, 4);
    }

}

설명

등차수열의 합 공식

이용료는 1부터 count 까지 1씩 증가하는 등차수열로 볼 수 있으므로, 이를 이용하면 더 빠르게 총 이용료를 계산할 수 있음, 여기서 a는 첫 번째항(price), n은 항의 수(count), d는 공차(price)이다. 따라서, a = price, n = count, d = price 를 대입하여 등차수열의 합을 간단히 나타내면 다음과 같다.

(count * (1 + count) * price ) / 2

나머지 로직은 동일하기때문에 설명은 생략하겠다.


문자열 다루기 기본

📑 문2) 문자열 s의 길이가 4 혹은 6이고, 숫자로만 구성돼있는지 확인해주는 함수, solution을 완성하세요. 예를 들어 s가 "a234"이면 False를 리턴하고 "1234"라면 True를 리턴하면 됩니다.


제한 사항

  • s는 길이 1 이상, 길이 8 이하인 문자열입니다.
  • s는 영문 알파벳 대소문자 또는 0부터 9까지 숫자로 이루어져 있습니다.

입출력 예

sresult
"a234"false
"1234"true

나의 풀이

class Solution {
    public boolean solution(String s) {
        if (s.length() != 4 && s.length() != 6) {
            return false; 
        }
        for(char c : s.toCharArray()) {
            if(!Character.isDigit(c)) {
                return false; 
            }
        }
        return true; 
    }
}

행렬의 덧셈

📑 문3) 행렬의 덧셈은 행과 열의 크기가 같은 두 행렬의 같은 행, 같은 열의 값을 서로 더한 결과가 됩니다. 2개의 행렬 arr1과 arr2를 입력받아, 행렬 덧셈의 결과를 반환하는 함수, solution을 완성해주세요.


제한 조건

  • 행렬 arr1, arr2의 행과 열의 길이는 500을 넘지 않습니다.

arr1arr2return
[[1,2],[2,3]][[3,4],[5,6]][[4,6],[7,9]]
[[1],[2]] [[3],[4]][[4],[6]]

나의 풀이

package programmers;

public class MatrixAddition {
	
	public static int[][] solution(int[][] arr1, int[][] arr2) {
        int[][] answer = arr1;
          
        for(int i = 0; i < arr1.length; i++) {
        	for(int j = 0; j < arr1[i].length; j++) {
        		answer[i][j] += arr2[i][j] ;
        	}
        }
        
        return answer;
    }
	
	public static void main(String[] args) {
		
		int[][] arr1 = {{1,2},{2,3}};
		int[][] arr2 = {{3,4},{5,6}};
		
		solution(arr1, arr2);
	}

}

직사각형 별찍기

📑 문4) 이 문제에는 표준 입력으로 두 개의 정수 n과 m이 주어집니다.
별(*) 문자를 이용해 가로의 길이가 n, 세로의 길이가 m인 직사각형 형태를 출력해보세요.


제한 조건

  • n과 m은 각각 1000 이하인 자연수입니다.

입력 예

5 3

출력

*****
*****
*****


나의 풀이

package programmers;

import java.util.Scanner;

public class TakeAStar {
		
	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++) {
			for(int j = 0; j < a; j++) {
			System.out.print("*");
			}
			System.out.println();
		}
	
	}

}

최대공약수와 최소공배수

📑 문5) 두 수를 입력받아 두 수의 최대공약수와 최소공배수를 반환하는 함수, solution을 완성해 보세요. 배열의 맨 앞에 최대공약수, 그다음 최소공배수를 넣어 반환하면 됩니다. 예를 들어 두 수 3, 12의 최대공약수는 3, 최소공배수는 12이므로 solution(3, 12)는 [3, 12]를 반환해야 합니다.


제한 사항

  • 두 수는 1이상 1000000이하의 자연수입니다.

입출력 예

nmresult
312[3,12]
25[1,10]

나의 풀이

package programmers;


public class GcdAndLcm {
	
	public static int[] solution(int n, int m) {
		int gcd = gcd(n,m);
		int lcm = lcm(n,m,gcd);
        int[] answer = {gcd,lcm};
        
      
        return answer;
    }
	
    public static int gcd(int n, int m) {
    	if(m == 0) {
    		return n;
    	}else {
    		return gcd(m, n % m);
    	}
    	
    }
    
    public static int lcm(int n, int m, int gcd) {
    	
    	return Math.abs(n * m) / gcd;
    }
	
	public static void main(String[] args) {
		solution(2, 5);
	}

}

나의 생각

GCD(Greatest Common Divisor)와 LCM(Least Common Multiple)

최대공약수와 최소공배수는 유클리드 호제법을 이용하여 간단하게 구현할 수 있다. 유클리드 호제법 이란, 두 개 이상의 정수의 최대공약수를 구하는 알고리즘으로, 기본원리는 다음과 같다.

두 수 a와 b (a > b)의 최대공약수는 a를 b로 나눈 나머지b의 최대공약수와 같음
즉, GCD(a,b) = GCD(b, a % b)라는 원리를 이용함


profile
HW + SW = 1

0개의 댓글