프로그래머스 코딩테스트 입문 60%

2025년 04월·자바

피자 나눠 먹기 (1)

📑 문제 설명

머쓱이네 피자가게는 피자를 일곱 조각으로 잘라 줍니다. 피자를 나눠먹을 사람의 수 n이 주어질 때, 모든 사람이 피자를 한 조각 이상 먹기 위해 필요한 피자의 수를 return 하는 solution 함수를 완성해보세요.

📌 제한 사항

  • 1 ≤ n ≤ 100
class Solution {
    public int solution(int n) {
        return (n + 6) / 7;
    }
}

✏️ 어떤 수 n을 m으로 나눌 때, 항상 올림하려면 (n + (m - 1)) / m 쓰기

 

모음 제거

📑 문제 설명

영어에선 a, e, i, o, u 다섯 가지 알파벳을 모음으로 분류합니다. 문자열 my_string이 매개변수로 주어질 때 모음을 제거한 문자열을 return하도록 solution 함수를 완성해주세요.

📌 제한 사항

  • my_string은 소문자와 공백으로 이루어져 있습니다.
  • 1 ≤ my_string의 길이 ≤ 1,000
class Solution {
    public String solution(String my_string) {
        return my_string.replaceAll("[aeiou]", "");
    }
}

✍🏻 정규표현식(Regex)

더보기

정규표현식이란? 문자열에서 "특정 패턴"을 찾거나, 바꾸거나, 검사하는 데 사용하는 특별한 규칙(문법)

패턴 의미 예시
  안에 있는 문자 중 하나  
  안에 없는 문자  
  아무 문자 하나  
  앞 문자가 0번 이상 반복  
  앞 문자가 1번 이상 반복  
  앞 문자가 0번 또는 1번  
  정확히 n번 반복  
  숫자 (0~9)  
  알파벳/숫자/밑줄  
  공백 문자  

 

암호 해독

📑 문제 설명

군 전략가 머쓱이는 전쟁 중 적군이 다음과 같은 암호 체계를 사용한다는 것을 알아냈습니다.

  • 암호화된 문자열 cipher를 주고받습니다.
  • 그 문자열에서 code의 배수 번째 글자만 진짜 암호입니다.

문자열 cipher와 정수 code가 매개변수로 주어질 때 해독된 암호 문자열을 return 하도록 solution 함수를 완성해주세요.

📌 제한 사항

  • 1 ≤ cipher의 길이 ≤ 1,000
  • 1 ≤ code ≤ cipher의 길이
  • cipher는 소문자와 공백으로만 구성되어 있습니다.
  • 공백도 하나의 문자로 취급합니다.
class Solution {
    public String solution(String cipher, int code) {
        StringBuilder sb = new StringBuilder();
        for (int i = code - 1; i < cipher.length() ; i += code) {
            sb.append(cipher.charAt(i));
        }
        return sb.toString();
    }
}

✏️ 문자열 인덱싱 charAt() 쓰는 거 까먹지 말자

 

대문자와 소문자

📑 문제 설명

문자열 my_string이 매개변수로 주어질 때, 대문자는 소문자로 소문자는 대문자로 변환한 문자열을 return 하도록 solution 함수를 완성해주세요.

📌 제한 사항

  • 1 ≤ my_string의 길이 ≤ 1,000
  • my_string은 영어 대문자와 소문자로만 구성되어 있습니다.
class Solution {
    public String solution(String my_string) {
        StringBuilder sb = new StringBuilder();
        for (char c : my_string.toCharArray()) {
            if (Character.isUpperCase(c)) {
                sb.append(Character.toLowerCase(c));
            } else {
                sb.append(Character.toUpperCase(c));
            }
        }
        return sb.toString();
    }
}

✏️ toCharArray()는 이제 약간 익숙해졌는데 Character.isUpperCase() 또 새로운 메서드 배움

 

인덱스 바꾸기

📑 문제 설명

문자열 my_string과 정수 num1, num2가 매개변수로 주어질 때, my_string에서 인덱스 num1과 인덱스 num2에 해당하는 문자를 바꾼 문자열을 return 하도록 solution 함수를 완성해보세요.

📌 제한 사항

  • 1 < my_string의 길이 < 100
  • 0 ≤ num1, num2 < my_string의 길이
  • my_string은 소문자로 이루어져 있습니다.
  • num1 ≠ num2
class Solution {
    public String solution(String my_string, int num1, int num2) {
        char[] arr = my_string.toCharArray();
        
        char temp = arr[num1];
        arr[num1] = arr[num2];
        arr[num2] = temp;
        
        return String.valueOf(arr);
    }
}

// 다른 풀이
class Solution {
    public String solution(String my_string, int num1, int num2) {
        StringBuilder sb = new StringBuilder(my_string);
        
        char temp = my_string.charAt(num1);
        sb.setCharAt(num1, my_string.charAt(num2));
        sb.setCharAt(num2, temp);
        
        return String.valueOf(sb);
    }
}

✏️ replace()는 해당 문자가 문자열에 나타날 때 전부 바꿈

✏️ char[] arr을 문자열로 변환할 때는 new String(arr) 또는 String.valueOf(arr) 사용하기

 

중복된 문자 제거

📑 문제 설명

문자열 my_string이 매개변수로 주어집니다. my_string에서 중복된 문자를 제거하고 하나의 문자만 남긴 문자열을 return 하도록 solution 함수를 완성해주세요.

📌 제한 사항

  • 1 ≤ my_string의 길이 ≤ 110
  • my_string은 대문자, 소문자, 공백으로 구성되어 있습니다.
  • 대문자와 소문자를 구분합니다.
  • 공백(" ")도 하나의 문자로 구분합니다.
  • 중복된 문자 중 가장 앞에 있는 문자를 남깁니다.
import java.util.stream.Collectors;
import java.util.Arrays;

class Solution {
    public String solution(String my_string) {
        return Arrays.stream(my_string.split(""))
                     .distinct()
                     .collect(Collectors.joining());  // ✏️
    }
}

✏️ collect(Collectors.joining()) 스트림을 다시 하나의 문자열로 이어붙이기

 

배열 자르기

📑 문제 설명

정수 배열 numbers와 정수 num1, num2가 매개변수로 주어질 때, numbers의 num1번째 인덱스부터 num2번째 인덱스까지 자른 정수 배열을 return 하도록 solution 함수를 완성해보세요.

📌 제한 사항

  • 2 ≤ numbers의 길이 ≤ 30
  • 0 ≤ numbers의 원소 ≤ 1,000
  • 0 ≤ num1 < num2 < numbers의 길이
class Solution {
    public int[] solution(int[] numbers, int num1, int num2) {
        int[] answer = new int[num2 - num1 + 1];
        for (int i = num1, j = 0; i <= num2; i++, j++) {
            answer[j] = numbers[i];
        }
        return answer;
    }
}

// 다른 풀이
import java.util.Arrays;

class Solution {
    public int[] solution(int[] numbers, int num1, int num2) {
        return Arrays.copyOfRange(numbers, num1, num2 + 1);
    }
}

✍🏻 Arrays

더보기
int[] arr = {5, 2, 3, 1, 4};

// 오름차순 정렬
Arrays.sort(arr);
System.out.println(Arrays.toString(arr));  // [1, 2, 3, 4, 5]

// 처음부터 지정한 길이만큼 복사
int[] arr2 = Arrays.copyOf(arr, 3);
System.out.println(Arrays.toString(arr2));  // [1, 2, 3]

// 범위를 지정해서 복사
int[] arr3 = Arrays.copyOfRange(arr, 1, 3);
System.out.println(Arrays.toString(arr3)); // [2, 3]

// 배열 비교
boolean isEqual = Arrays.equals(arr2, arr3);
System.out.println(isEqual);  // false

// 배열 전체 값 채우기
Arrays.fill(arr2, 9);
System.out.println(Arrays.toString(arr2));  // [9, 9, 9]

// 이진탐색
int idx = Arrays.binarySearch(arr, 4);
System.out.println(idx);  // 3

 

외계행성의 나이

📑 문제 설명

우주여행을 하던 머쓱이는 엔진 고장으로 PROGRAMMERS-962 행성에 불시착하게 됐습니다. 입국 심사에서 나이를 말해야 하는데, PROGRAMMERS-962 행성에서는 나이를 알파벳으로 말하고 있습니다. a는 0, b는 1, c는 2, ..., j는 9입니다. 예를 들어 23살은 cd, 51살은 fb로 표현합니다. 나이 age가 매개변수로 주어질 때, PROGRAMMERS-962식 나이를 return 하도록 solution 함수를 완성해주세요.

📌 제한 사항

  • age는 자연수입니다.
  • age ≤ 1,000
  • PROGRAMMERS-962 행성은 알파벳 소문자만 사용합니다.
class Solution {
    public String solution(int age) {
        StringBuilder sb = new StringBuilder();
        
        String str = String.valueOf(age);

        for (char c : str.toCharArray()) {
            sb.append((char)('a' + (c - '0')));
        }
        
        return String.valueOf(sb);
    }
}

✏️ 숫자 ↔ 문자 변환이 필요할 때 아스키코드 계산 떠올리기

 

피자 나눠 먹기 (2)

📑 문제 설명

머쓱이네 피자가게는 피자를 여섯 조각으로 잘라줍니다. 피자를 나눠먹을 사람의 수 n이 매개변수로 주어질 때, n명이 주문한 피자를 남기지 않고 모두 같은 수의 피자 조각을 먹어야 한다면 최소 몇 판을 시켜야 하는지를 return 하도록 solution 함수를 완성해보세요.

📌 제한 사항

  • 1 ≤ n ≤ 100
class Solution {
    public int solution(int n) {
        int gcd = getGCD(6, n);
        int lcm = 6 * n / gcd;
        return lcm / 6;
    }
    
    private int getGCD(int a, int b) {
        if (b == 0) return a;
        return getGCD(b, a % b);
    }
}

✍🏻 최대공약수와 최소공배수

더보기

유클리드 호제법

 

약수 구하기

📑 문제 설명

정수 n이 매개변수로 주어질 때, n의 약수를 오름차순으로 담은 배열을 return 하도록 solution 함수를 완성해주세요.

📌 제한 사항

  • 1 ≤ n ≤ 10,000
class Solution {
    public int[] solution(int n) {
        List<Integer> list = new ArrayList<>();
        for (int i = 1; i <= n; i++) {
            if (n % i == 0) {
                list.add(i);
            }
        }
        
        int[] arr = new int[list.size()];
        for (int i = 0; i < list.size(); i++) {
            arr[i] = list.get(i);
        }
        
        return arr;
    }
}

// 다른 풀이
class Solution {
    public int[] solution(int n) {
        List<Integer> list = new ArrayList<>();
        for (int i = 1; i <= n; i++) {
            if (n % i == 0) {
                list.add(i);
            }
        }
        
        return list.stream()
                   .mapToInt(x -> x)
                   .toArray();
    }
}

✏️ 리스트를 배열로 바꿀때 스트림 사용하기 !

 

합성수 찾기

📑 문제 설명

약수의 개수가 세 개 이상인 수를 합성수라고 합니다. 자연수 n이 매개변수로 주어질 때, n 이하의 합성수의 개수를 return 하도록 solution 함수를 완성해주세요.

📌 제한 사항

  • 1 ≤ n ≤ 100
class Solution {
    public int solution(int n) {
        boolean[] isPrime = new boolean[n + 1];
        Arrays.fill(isPrime, true);
        isPrime[0] = false;
        isPrime[1] = false;

        for (int i = 2; i * i <= n; i++) {
            if (isPrime[i]) {
                for (int j = i * i; j <= n; j += i) {
                    isPrime[j] = false;
                }
            }
        }

        int count = 0;
        for (int i = 1; i <= n; i++) {
            if (!isPrime[i]) {  // 소수가 아닌 수
                count++;
            }
        }

        return count - 1;
    }
}

✍🏻 소수 판별

더보기

에라토스테네스의 체

 

369게임

📑 문제 설명

머쓱이는 친구들과 369게임을 하고 있습니다. 369게임은 1부터 숫자를 하나씩 대며 3, 6, 9가 들어가는 숫자는 숫자 대신 3, 6, 9의 개수만큼 박수를 치는 게임입니다. 머쓱이가 말해야하는 숫자 order가 매개변수로 주어질 때, 머쓱이가 쳐야할 박수 횟수를 return 하도록 solution 함수를 완성해보세요.

📌 제한 사항

  • 1 ≤ order ≤ 1,000,000
class Solution {
    public int solution(int order) {
        return (int) String.valueOf(order)
                           .chars()
                           .filter(x -> x == '3' || x == '6' || x == '9')
                           .count();
    }
}

✏️ count()는 long 타입 반환이니까 int로 변환하기

 

숫자 찾기

📑 문제 설명

정수 num과 k가 매개변수로 주어질 때, num을 이루는 숫자 중에 k가 있으면 num의 그 숫자가 있는 자리 수를 return 하고 없으면 -1을 return 하도록 solution 함수를 완성해보세요.

📌 제한 사항

  • 0 < num < 1,000,000
  • 0 ≤ k < 10
  • num에 k가 여러 개 있으면 가장 처음 나타나는 자리를 return 합니다.
class Solution {
    public int solution(int num, int k) {
        char[] arr = String.valueOf(num).toCharArray();
        
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] == (char)(k + '0')) {
                return i + 1; 
            }
        }
        
        return -1;
    }
}

// 다른 풀이
class Solution {
    public int solution(int num, int k) {
        String s = String.valueOf(num);
        int idx = s.indexOf(String.valueOf(k));
        return idx == -1 ? -1 : idx + 1;
    }
}

'자바' 카테고리의 다른 글

프로그래머스 코딩 기초 트레이닝 🔥 조건문 / 반복문  (0) 2025.05.01
프로그래머스 코딩 기초 트레이닝 🔥 출력 / 연산 / 문자열  (0) 2025.04.30
프로그래머스 코딩테스트 입문 40%  (0) 2025.04.27
프로그래머스 코딩테스트 입문 20%  (0) 2025.04.25
자바 입출력 정리  (0) 2025.04.25
'자바' 카테고리의 다른 글
  • 프로그래머스 코딩 기초 트레이닝 🔥 조건문 / 반복문
  • 프로그래머스 코딩 기초 트레이닝 🔥 출력 / 연산 / 문자열
  • 프로그래머스 코딩테스트 입문 40%
  • 프로그래머스 코딩테스트 입문 20%
토토이
토토이
토토이 님의 블로그 입니다.
  • 토토이
    토토이 님의 블로그
    토토이
    • 분류 전체보기 (18)
      • KT 에이블스쿨 (5)
      • 복습 (1)
      • 자바 (11)
      • 뻐꿈 (0)
  • 태그

    AICE
    java
    스택
    에이블스쿨
    인프런
    자격증
    자바
    취준
    코딩테스트
    코테
    프로그래머스
  • 블로그 메뉴

    • 홈
    • 태그
    • 글쓰기
  • hELLO· Designed By정상우.v4.10.3
토토이
프로그래머스 코딩테스트 입문 60%
상단으로

티스토리툴바