카테고리 없음

동빈나 2. 그리디&구현

둉영 2023. 7. 16. 13:06

# 거슴름 돈: 답안 예시
n = 1260
count = 0

# 가장 큰 단위의 화폐부터 차례대로 확인하기
array = [500, 100, 50, 10]

for coin in array:
  count += n // coin # 몫. 해당 화폐로 거슬러 줄 수 있는 동전의 개수 세기
  n %= coin # 나머지

print(count) 

 

실행결과 

6

 

// C++ 예시

#include <bits/stdc++.h>  // 표준 라이브러리를 불러오기 위한 헤더 파일 추가구문

 

using namespace std; 

 

int n = 1260; // 정수형 변수

int cnt; // cnt 결과값 0으로 초기화, C언어에서 전역변수는 기본적으로 0으로 초기화

 

int coinTypes[4] = [500, 100, 50, 10]; // 전체 동전의 종류 차례대로 명시, 배열에 4개의 값을 담음

 

int main(void) { 

    for (int i = 0;  i  < 4; i++) {  // 동전 종류만큼 반복

        cnt += n / coinTypes[i];  // 몫

        n %= coinTypes[i]; // 나머지 거스름돈

    }

    cout << cnt << '\n'; //거슬러줘야하는 최소 개수 출력

 

// Java 예시

 

#Java의 경우 class의 이름을 Main이라고 작성하라고 요구하는 경우가 많음

public class Main { 

    

# 변수 값 초기화

    public static void main(String[] args) { 

        int n = 1260;

        int cnt = 0;

        int[] = coinTypes = {500, 100, 50, 10};

 

        for (int i = 0; i < 4; i++) {

            cnt += n / coinTypes[i];

            n %= coinTypes[i];

        }

 

        System.out.println(cnt);

        }

}

 

# 1이 될 때까지

# 내가 작성한 답안

# 입력예시 n = 25, k = 5
n = 25
k = 5

result = 0

# 조건에 대한 반복문 -> while

# 첫번째 연산
while n % k != 0:
  n = n - 1
  result += 1
  
# 두번째 연산
while n % k == 0: 
    n = n // k
    result += 1

print(result)

 

# 오답인 이유, 만약 n = 25이고 k = 3일때 내가 한 연산은 결과값이 2가 나옴 왜냐하면 두번째 연산이 거짓일때 n=n-1이후 반복 작업을 할 수  있는 구문이 없어서 조건 반복문 추가할 필요

 

# 나동빈 답안 -> 로그시간 복잡도로 문제해결 가능

# n, k을 공백을 기준으로 하여 입력 받기
n, k = map(int, input().split())

result = 0

while True:
  # N이 K로 나누어 떨어지는 수가 될 때까지 빼기
    target = (n // k) * k # n이 k로 나누어떨어지지 않을 때 가장 가까운 k로 나누어 떨어지는 수를 구할 수 있음

    result += (n - target)
    n = target
    # N이 K보다 작을 때 (더이상 나눌 수 없을 때) 반복문 탈출
    if n < k :
      break

    # K로 나누기
    result += 1
    n //= k

# 마지막으로 남은 수에 대해서 1씩 빼기
result += (n - 1)
print(result)

 

# 실행 결과(n=25, k=3일때)

6

 

// C++

# include <bits/stdc++.h>

 

using namespace std;

int n, k;

int result;

 

int main(void) :

    cin >> n >> k;

   while (true) {

        // N이 K로 나누어 떨어지는 수가 될 때까지 빼기

        int target = (n / k) * k;

        result += (n - target);

        n = target;

        // N이 K보다 작을 때 (더이상 나눌 수 없을 때) 반복문 탈출

        if (n < k) break;

        // K로 나누기

        result++;

        n /= k;

    }

    // 마지막으로 남은 수에 대하여 1씩 빼기

    result += (n - 1);

    cout << result << '\n";

}

 

//Java

 

import java.utl.*;

 

public class Main {

    

        public static void main(String[] args) { 

                Scanner sc = new Scanner(System.in);

 

                // N, K를 공백을 기준으로 구분하여 입력 받기

                int n = sc.nextInt();

                int k = sc.nextInt();

                int result = 0;

 

                while (true) {

                        // N이 K로 나누어 떨어지는 수가 될 때까지 빼기

                        int target = (n / k) * k;

                        result += (n - target);

                        n = target;

                        // N이 K보다 작을 때 (더이상 나눌 수 없을 때) 반복문 탈출

                        if (n < k) break;

                        // K로 나누기

                        result += 1;

                        n /= k;

                 }

                 // 마지막으로 남은 수에 대하여 1씩 빼기

                result += (n - 1);

                System.out.printIn(result);

       }

}  

 

 

<문제>  곱하기 혹은 더하기

각 자리가 숫자(0~9)로만 이루어진 문자열 S가 주어졌을 때, 왼쪽부터 오른쪽으로 하나씩 모든 숫자를 확인하며 숫자 사이에 'x' 혹은 '+' 연산자를 넣어 결과적으로 만들어 질 수 있는 가장 큰 수를 구하는 프로그램

모든 연산은 왼쪽부터 순서대로 이루어진다고 가정

가장 큰수는 항상 20억 이하의 정수가 되도록 입력이 주어진다

 

예) 02984 라는 문자열로 만들 수 있는 가장 큰 수는 ((((0+2) x 9) x 8) x 4) = 576

 

=> 0일때는 무조건 더하고 나머지는 곱하면 되는거 아닌가? (내생각) 

 

# 1차시도-> 안된 이유 if 이후에 result가 0이라서 else곱하기 하면 다 0으로 나옴

array = [0, 2, 9, 8, 4]
result = 0

for i in array:
  if i == 0:
    result += i
  else:
    result *= i
print(result)

 

# 2차 시도 -> 답은 나왔지만 배열을 [0, 0, 9, 8, 6] 형태로 받으면 오답

array = [0, 2, 9, 8, 4]
result = 0

for i in array:
  if i == 0:
    result += i+1
  else:
    result *= i

print(result)

 

# 3차 시도

array = [0, 0, 9, 8, 4]
result = 0

for i in array:
  if i == 0:
    result += i
    result = 1 # 1로 초기화 
  else:
    result *= i

print(result)

 

=> but 0, 1이면 더하고 나머지는 곱해야함,,,,,1 역시 곱하기 보다 더하기 해야 큰 수가 나옴

 

# 답안 예시

data = input()

 

# 첫 번째 문자를 숫자로 변경하여 대입

result = int(data[0])

 

for i in range(1, len(data)):

        # 두 수 중에서 하나라도 '0' 혹은 '1'인 경우, 곱하기보다는 더하기 수행

        num = int(data[i])

        if num <= 1 or result <=1 :

                result += num

        else:

                result *= num

 

print(result) 

 

// C++

# include <bits/stdc++.h>

 

using namespace std;

 

string str;

 

int main(void) {

        cin >> str;

       

        // 첫 번째 문자를 숫자로 변경한 값을 대입

        long long result = str[0] - '0'; # 0에 해당하는 아스키 코드를 숫자로 변경하여 result에 대입

 

        for (int i = 1; i < str.size(); i++) {

                // 두 수 중에서 하나라도 '0' 혹은 '1' 인 경우, 곱하기보다는 더하기 수행

                int num = str[i] - 'o';

                if (num <= i || result <= 1) result += num;

               else result *= num;

        }

 

        cout << result << '\n';

 

//Java

import java.util.*;

 

public class Main {

        pubic static void main(String[] args) {

                Scanner sc = new Scanner(System.in);

 

        // 첫 번째 문자를 숫자로 변경한 값을 대입

        long result = str.charAt(0) - '0'; // string 내부 특정 문자에 접근하기 위해 charAt 메소드 호출 

        for (int i = 1; i < str.length(); i++) {

                // 두 수 중에서 하나라도 '0' 혹은 '1'인 경우, 곱하기보다는 더하기 수행

                int num = str.charAt(i) - '0';

                if (num <= 1 || result <= 1) {

                        result += num;

                }

                else {

                         result *= num;

                        }

                 }

               System.out.printIn(result);

        }