티스토리 뷰

1️⃣ 치킨 쿠폰

 

문제 설명

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

 

제한사항

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

입출력 예

chicken result
100 11
1,081 120

 

입출력 예 #1

  • 100마리를 주문하면 쿠폰이 100장 발급되므로 서비스 치킨 10마리를 주문할 수 있습니다.
  • 10마리를 주문하면 쿠폰이 10장 발급되므로 서비스 치킨 1마리를 주문할 수 있습니다.
  • 따라서 10 + 1 = 11 을 return합니다.

입출력 예 #2

  • 1081마리를 주문하면 쿠폰이 1081장 발급되므로 서비스 치킨 108마리를 주문할 수 있습니다. 그리고 쿠폰이 1장 남습니다.
  • 108마리를 주문하면 쿠폰이 108장 발급되므로 서비스 치킨 10마리를 주문할 수 있습니다. 그리고 쿠폰이 8장 남습니다.
  • 10마리를 주문하면 쿠폰이 10장 발급되므로 서비스 치킨 1마리를 주문할 수 있습니다.
  • 1마리를 주문하면 쿠폰이 1장 발급됩니다.
  • 가지고 있는 쿠폰이 총 10장이므로 서비스 치킨 1마리를 추가로 주문할 수 있습니다.
  • 따라서 108 + 10 + 1 + 1 = 120 을 return합니다.

 

💻 나의 풀이

class Solution {
    public int solution(int chicken) {
        int answer = 0;   //서비스 치킨의 수
        
        while(chicken/10 > 0) {
            answer += chicken/10;  //서비스 치킨의 수
            chicken = chicken/10 + chicken%10;   //총 치킨의 수
        }
        return answer;
    }
}

 

먼저 while (chicken / 10 > 0)  을 통해 chicken이 10 이상일 때까지 반복합니다.

문제에서 한 마리를 서비스로 준다고 했으므로 서비스 치킨의 수를 담는 answerchicken을 10으로 나눈 몫을 더합니다. 

총 치킨의 수를 담는 chicken을 10으로 나눈 몫과 나머지의 합으로 갱신합니다.

반복문이 종료되면 최종적으로 answer에 누적된 서비스 치킨의 수를 반환합니다.

 


 

2️⃣ 이진수 더하기

 

문제 설명

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

 

제한사항

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

입출력 예

bin1 bin2 result
"10" "11" "101"
"1001" "1111" "11000"

 

입출력 예 #1

  • 10 + 11 = 101 이므로 "101" 을 return합니다.

입출력 예 #2

  • 1001 + 1111 = 11000 이므로 "11000"을 return합니다.

 

💻 나의 풀이

class Solution {
    public String solution(String bin1, String bin2) {
        // 정수로 변환
        int n = Integer.parseInt(bin1, 2);
        int m = Integer.parseInt(bin2, 2);
        int sum = n+m;  // 두 정수의 합
        
        // 두 정수의 합을 다시 이진수 문자열로 변환
        String answer = Integer.toBinaryString(sum);
        
        return answer;
    }
}

 

두 수를 합해야 하는데 정수로 변환해서 합하자! > 그 다음 다시 이진수로 바꾸면 되는거 아닌가?

하는 단순한 생각으로 접근했습니다..

Integer.parseInt 메소드로 먼저 이진수 문자열들을 정수로 변환해준 후, 변환된 두 정수를 합한 값을 sum에 저장해줬습니다.

그리고 다시 이진수로 바꿔야겠죠? 이번엔 Integer.toBinaryString 메소드를 이용해서 이진수 문자열로 변환한 후, 값을 반환해줬습니다.

분명 더 효율적인 접근방법이 있을 거 같습니다. 😅

 

 

🔎 다른 사람의 풀이

class Solution {
    public String solution(String bin1, String bin2) {
        return Integer.toString(Integer.parseInt(bin1, 2) + Integer.parseInt(bin2, 2),2);
    }
}

 

접근 방식은 같지만 이렇게 한 줄로 끝내버리면 되네요..

 


 

3️⃣ A로 B 만들기

 

문제 설명

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

 

제한사항

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

입출력 예

before after result
"olleh" "hello" 1
"allpe" "apple" 0

 

입출력 예 #1

  • "olleh"의 순서를 바꾸면 "hello"를 만들 수 있습니다.

입출력 예 #2

  • "allpe"의 순서를 바꿔도 "apple"을 만들 수 없습니다.

💻 나의 풀이

import java.util.Arrays;

class Solution {
    public int solution(String before, String after) {
        char[] a = before.toCharArray();
        char[] b = after.toCharArray();
        
        Arrays.sort(a);
        Arrays.sort(b);
        
        if(Arrays.equals(a, b)) {
            return 1; 
        } else 
            return 0;
    }
}

 

주어진 문자열 before, after을 toCharArray() 메서드를 사용하여 문자 배열로 변환합니다.

그리고 변환된 문자 배열을 Arrays.sort() 메서드를 사용하여 정렬하게 되면 알파벳 순서로 정렬됩니다.

배열 내용을 비교하는 것이기 때문에 Arrays.equals() 메서드를 사용해 정렬된 두 배열의 내용이 동일한지 확인해줍니다.

 

before의 순서를어떻게 바꿔서 after가 되는지 알까? => 굳이 순서를 맞춘다기 보다는 둘 다 오름차순 정렬을 해버린다면 만약 같은 단어이면 똑같겠지! 한 글자라도 틀린 게 있으면 안똑같은거지!

이 발상이 포인트 같습니다.

 

반환 값의 자료형이 int 이므로 동일 확인 결과에 따라 정수값인 1과 0을 반환하도록 해줍니다.

sort로 알파벳을 정렬한다는 것을 몰랐을 수도 있는데 얼마전에 자바의 정석 강의를 열심히 봐서 기억을 하고 있었습니다. 👍

 


 

4️⃣ k의 개수

 

문제 설명

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

 

제한사항

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

입출력 예

i j k result
1 13 1 6
10 50 5 5
3 10 2 0

 

입출력 예 #1

  • 본문과 동일합니다.

입출력 예 #2

  • 10부터 50까지 5는 15, 25, 35, 45, 50 총 5번 등장합니다. 따라서 5를 return 합니다.

입출력 예 #3

  • 3부터 10까지 2는 한 번도 등장하지 않으므로 0을 return 합니다.

💻 나의 풀이

class Solution {
    public int solution(int i, int j, int k) {
        int answer = 0;
        
        for (int a = i; a <= j; a++) {  // i부터 j까지
            int n = a;  // 현재 숫자를 저장
            // 현재 숫자의 각 자릿수를 확인
            while (n > 0) {
                int num = n % 10;  // 현재 자릿수를 얻음
                if (num == k) {  // 현재 자릿수가 k와 일치하면
                    answer++;   // answer 증가
                }
                n /= 10;  // 다음 자릿수로 이동
            }
        }
        return answer;  // 최종 결과
    }
}

 

문자열로 바꾸어서 확인을 해야하나 고민하다가

언젠가 다른 문제에서 썼었던 10으로 나눈 나머지로 자릿수를 얻고 몫을 사용해 다음 자릿수로 이동하는 방법을 사용했습니다.

i부터 j까지 순회하면서 각 숫자 a에 대해 현재 숫자 n을 a로 초기화하고, 숫자의 각 자릿수르 확인하는 while 루프르 실행합니다.

n%10을 사용하여 현재 자릿수를 얻고, num에 저장합니다.

num과 k를 비교해서 일치하면 answer를 증가시키고, n/-10을 사용해 다음 자릿수로 이동합니다.

이렇게 모든 자릿수를 확인해줍니다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함