# 거슴름 돈: 답안 예시
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);
}
}