피자 나눠 먹기 (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 |