프로그래머스 Java - Day 24 [수학 시뮬레이션 문자열 조건문 반복문]

6720·2023년 1월 13일
post-thumbnail

[20230113]

👨‍🏫 이번 목표

프로그래머스 코딩테스트 입문 Java로 Day 24 수학 시뮬레이션 문자열 조건문 반복문 풀기

📒 문제 풀이 (Day 24 수학 시뮬레이션 문자열 조건문 반복문)

치킨 쿠폰

프로그래머스 치킨은 치킨을 시켜먹으면 한 마리당 쿠폰을 한 장 발급합니다. 쿠폰을 열 장 모으면 치킨을 한 마리 서비스로 받을 수 있고, 서비스 치킨에도 쿠폰이 발급됩니다. 시켜먹은 치킨의 수 chicken이 매개변수로 주어질 때 받을 수 있는 최대 서비스 치킨의 수를 return하도록 solution 함수를 완성해주세요.

제한사항

  • chicken은 정수입니다.
  • 0 ≤ chicken ≤ 1,000,000

입출력 예

chickenresult
10011
1,081120
class Solution {
    public int count_coupon = 0; // 남은 쿠폰 수
    public int count_chicken = 0; // 총 서비스 치킨 수
    public int service = 0; // 한 번에 나온 서비스 수
    
    public int solution(int chicken) {
        int answer = -1;
        
        coupon(chicken);
        answer = count_chicken;
        
        return answer;
    }
    
    public void coupon(int chicken) {        
        service = chicken / 10;
        count_coupon += chicken % 10;
        count_chicken += service;
        
        if (service != 0) coupon(service);
        
        while (count_coupon / 10 >= 1) {
            count_chicken += count_coupon / 10;
            count_coupon = (count_coupon % 10) + (count_coupon / 10);
        }

        return;
    }
}

재귀 문제로 적합한 문제

EX) 1081번 시켜먹은 치킨
coupon(1081)
1081번에서 나온 서비스 수: 108번
남은 쿠폰 수: 1개
총 서비스 치킨 수: 108번
coupon(108)
108번에서 나온 서비스 수: 10번
남은 쿠폰 수: 1+8개
총 서비스 치킨 수: 108+10번
coupon(10)
10번에서 나온 서비스 수: 1번
남은 쿠폰 수: 1+8+0개
총 서비스 치킨 수: 108+10+1번
coupon(1)
1번에서 나온 서비스 수: 0번
남은 쿠폰 수: 1+8+0+1개
총 서비스 치킨 수: 108+10+1+0번

남은 쿠폰 수가 10개 이상 이라면
총 서비스 치킨 수: 108+10+1+0+1번
남은 쿠폰 수: 0개

이진수 더하기

이진수를 의미하는 두 개의 문자열 bin1과 bin2가 매개변수로 주어질 때, 두 이진수의 합을 return하도록 solution 함수를 완성해주세요.

제한사항

  • return 값은 이진수를 의미하는 문자열입니다.
  • 1 ≤ bin1bin2의 길이 ≤ 10
  • bin1과 bin2는 0과 1로만 이루어져 있습니다.
  • bin1과 bin2는 "0"을 제외하고 0으로 시작하지 않습니다.

입출력 예

bin1bin2result
"10""11""101"
"1001""1111""11000"
import java.util.*;

class Solution {
    public String solution(String bin1, String bin2) {
        String answer = "";
        
        answer = Integer.toBinaryString(Integer.parseInt(bin1, 2) + Integer.parseInt(bin2, 2));
        
        return answer;
    }
}

Integer.toBinaryString(int i): 10진수 → 2진수 String
Integer.parseInt(String s, int radix): 16진수 → 10진수 int
만약 16진수라면 radix가 16이 되고 2진수나 8진수가 되면 각각 2, 8을 대입하면 됨.

A로 B 만들기

문자열 before와 after가 매개변수로 주어질 때, before의 순서를 바꾸어 after를 만들 수 있으면 1을, 만들 수 없으면 0을 return 하도록 solution 함수를 완성해보세요.

제한사항

  • 0 < before의 길이 == after의 길이 < 1,000
  • before와 after는 모두 소문자로 이루어져 있습니다.

입출력 예

beforeafterresult
"olleh""hello"1
"allpe""apple"0
class Solution {
    public int solution(String before, String after) {
        int answer = 1;
        
        int[] before_arr = new int[26];
        int[] after_arr = new int[26];
        
        for (int i = 0; i < before.length(); i++) {
            before_arr[(int)before.charAt(i)-97]++;
            after_arr[(int)after.charAt(i)-97]++;
        }
        
        for (int i = 0; i < before_arr.length; i++) {
            if (before_arr[i] != after_arr[i]) return 0;
        }
        
        return answer;
    }
}

before의 순서를 바꾸라는게 순서를 뒤집으라는게 아니라 글자를 이리저리 옮기라는 뜻임.
즉, before의 알파벳 구성이 after의 알파벳 구성과 같으면 됨.

k의 개수

1부터 13까지의 수에서, 1은 1, 10, 11, 12, 13 이렇게 총 6번 등장합니다. 정수 ijk가 매개변수로 주어질 때, i부터 j까지 k가 몇 번 등장하는지 return 하도록 solution 함수를 완성해주세요.

제한사항

  • 1 ≤ i < j ≤ 100,000
  • 0 ≤ k ≤ 9

입출력 예

ijkresult
11316
105055
31020
class Solution {
    public int solution(int i, int j, int k) {
        int answer = 0;
        
        for (int a = i; a <= j; a++) {
            String str = Integer.toString(a);
            for (int b = 0; b < str.length(); b++) {
                int ch = str.charAt(b) - 48;
                if (ch == k) answer++;
            }
        }
        
        return answer;
    }
}

✨ 후기

1) 4문제 남았다!

2) 기록표

profile
뭐라도 하자

0개의 댓글