프로그래머스 코딩테스트 입문 Lv.0 100문제 Java 풀이
프로그래머스 코딩테스트 입문 Lv.0 100문제
https://school.programmers.co.kr/learn/challenges/beginner?order=recent
입문 문제가 기초 트레이닝 문제보다 오히려 더 쉬운 것 같습니다.
정답률 높은 순으로 풀면 자신감이 붙어서 좋습니다.
한 문제에서 오래 막히는 경우, 질문으로 코드 남겨서 반례 요청 후 다른 문제 풀고 다시 와서 풀면 효율적입니다.
난이도 Lv. 0 100문제 풀이
옹알이 (1)
class Solution {
public int solution(String[] babbling) {
int answer = 0;
String[] removeArr = { "aya", "ye", "woo", "ma" };
for (int i = 0; i < babbling.length; i++) {
for (String removeStr : removeArr) {
babbling[i] = babbling[i].replaceFirst(removeStr, " ");
}
}
for (String str : babbling) {
if (str.replaceAll(" ", "").equals("")) {
answer++;
}
}
return answer;
}
}
다음에 올 숫자
class Solution {
public int solution(int[] common) {
int answer = 0;
int lastValue = common[common.length-1];
int diffA = common[1] - common[0];
int diffB = common[2] - common[1];
if (diffA == diffB) {
// 등차수열
answer = lastValue + diffA;
} else {
// 등비수열
int ratio = common[1] / common[0];
answer = lastValue * ratio;
}
return answer;
}
}
연속된 수의 합
import java.util.*;
class Solution {
public int[] solution(int num, int total) {
int[] answer = new int[num];
for (int i = -1000; i <= total; i++) {
int sum = 0;
int[] sumArr = new int[num];
for (int j = 1; j <= num; j++) {
sumArr[j-1] = (i+j);
sum += (i+j);
}
if (sum == total) {
answer = sumArr;
break;
}
}
return answer;
}
}
아래처럼 수식을 이용해서 start 숫자를 정해주면 더 효율적으로 풀 수 있습니다.
class Solution {
public int[] solution(int num, int total) {
int[] answer=new int[num];
int start = (total/num) + ((1-num)/2);
for(int i=0; i<num; i++) {
answer[i] = start++;
}
return answer;
}
}
종이 자르기
class Solution {
public int solution(int M, int N) {
int m_cut = M - 1;
int n_cut = (N - 1) * M;
return m_cut + n_cut;
}
}
class Solution {
public int solution(int M, int N) {
return M * N - 1;
}
}
문자열 밀기
class Solution {
public int solution(String A, String B) {
int answer = -1;
for (int i = 0; i < A.length(); i++) {
String change_A = A.substring(A.length() - i, A.length()) + A.substring(0, A.length() - i);
if (change_A.equals(B)) {
answer = i;
break;
}
}
return answer;
}
}
class Solution {
public int solution(String A, String B) {
return B.repeat(2).indexOf(A);
}
}
잘라서 배열로 저장하기
class Solution {
public String[] solution(String my_str, int n) {
String[] answer = new String[(my_str.length() +n -1) / n];
String str = "";
for (int i = 0; i < my_str.length(); i++) {
str += my_str.charAt(i);
if (i % n == n-1 || i == my_str.length()-1) {
answer[i / n] = str;
str = "";
}
}
return answer;
}
}
7의 개수
import java.util.*;
class Solution {
public int solution(int[] array) {
StringBuilder sb = new StringBuilder();
for (int v : array) {
sb.append(String.valueOf(v));
}
String allStr = sb.toString();
return allStr.length() - allStr.replace("7", "").length();
}
}
모든 숫자를 String으로 더하고, 7 제거한 숫자의 개수를 빼는 방식입니다.
class Solution {
public int solution(int[] array) {
int answer = 0;
for(int a : array){
while(a ? 0){
if(a % 10 == 7){
answer++;
}
a /= 10;
}
}
return answer;
}
}
1자리씩 검사하여 7의 개수를 더하는 방식입니다.
문자열 정렬하기 (2)
import java.util.*;
class Solution {
public String solution(String my_string) {
String answer = "";
char[] c_arr = new char[my_string.length()];
for (int i = 0; i < my_string.length(); i++) {
char c = my_string.charAt(i);
if (Character.isUpperCase(c)) {
c = Character.toLowerCase(c);
}
c_arr[i] = c;
}
Arrays.sort(c_arr);
return String.valueOf(c_arr);
}
}
import java.util.*;
class Solution {
public String solution(String my_string) {
char[] c_arr = my_string.toLowerCase().toCharArray();
Arrays.sort(c_arr);
return String.valueOf(c_arr);
}
}
세균 증식
class Solution {
public int solution(int n, int t) {
int answer = n;
for (int i = 0; i < t; i++) {
answer *= 2;
}
return answer;
}
}
제곱수 판별하기
class Solution {
public int solution(int n) {
return (int) Math.sqrt(n) * 10 / 10 == Math.sqrt(n) ? 1 : 2;
}
}
class Solution {
public int solution(int n) {
return Math.sqrt(n) % 1 == 0 ? 1 : 2;
}
}
문자열안에 문자열
class Solution {
public int solution(String str1, String str2) {
return str1.replace(str2, "").equals(str1)? 2 : 1;
}
}
아래처럼 contains 함수로 문자열 안에 문자열이 존재하는지 확인할 수도 있습니다.
class Solution {
public int solution(String str1, String str2) {
return str1.contains(str2) ? 1 : 2;
}
}
OX퀴즈
class Solution {
public String[] solution(String[] quiz) {
String[] answer = new String[quiz.length];
for (int i = 0; i < quiz.length; i++) {
String[] unitQuiz = quiz[i].split(" ");
int leftNum = Integer.parseInt(unitQuiz[0]);
int rightNum = Integer.parseInt(unitQuiz[2]);
int resultNum = Integer.parseInt(unitQuiz[4]);
int ansQuiz = 0;
if (unitQuiz[1].equals("-")) {
ansQuiz = leftNum - rightNum;
} else {
ansQuiz = leftNum + rightNum;
}
if (ansQuiz == resultNum) {
answer[i] = "O";
} else {
answer[i] = "X";
}
}
return answer;
}
}
자릿수 더하기
class Solution {
public int solution(int n) {
String str_n = String.valueOf(n);
int answer = 0;
for (char c : str_n.toCharArray()) {
answer += c - '0';
}
return answer;
}
}
n의 배수 고르기
import java.util.*;
class Solution {
public int[] solution(int n, int[] numlist) {
ArrayList<Integer> list = new ArrayList<>();
for (int v : numlist) {
if (v % n == 0) {
list.add(v);
}
}
int[] answer = new int[list.size()];
for (int i = 0; i < list.size(); i++) {
answer[i] = list.get(i);
}
return answer;
}
}
숫자 찾기
class Solution {
public int solution(int num, int k) {
int answer = -1;
String num_str = String.valueOf(num);
for (int i = 0; i < num_str.length(); i++) {
if (num_str.charAt(i) - '0' == k) {
answer = i + 1;
break;
}
}
return answer;
}
}
class Solution {
public int solution(int num, int k) {
int answer = String.valueOf(num).indexOf(String.valueOf(k));
return answer == -1 ? -1 : answer+1;
}
}
배열의 유사도
import java.util.*;
class Solution {
public int solution(String[] s1, String[] s2) {
HashMap<String, String> hashMap = new HashMap<>();
for (String s : s1) {
hashMap.put(s, "");
}
for (String s : s2) {
hashMap.put(s, "");
}
return s1.length + s2.length - hashMap.size();
}
}
키만 필요하고, 값은 필요하지 않아서 아래처럼 HashSet을 사용하면 좋습니다.
import java.util.*;
class Solution {
public int solution(String[] s1, String[] s2) {
Set<String> set = new HashSet<>(Arrays.asList(s1));
int answer = 0;
for (String s : s2) {
if (set.contains(s)) {
answer++;
}
}
return answer;
}
}
문자열 계산하기
class Solution {
public int solution(String my_string) {
String[] strArr = my_string.split(" ");
int answer = Integer.parseInt(strArr[0]);
for (int i = 2; i < strArr.length; i += 2) {
String sep = strArr[i-1];
int num = Integer.parseInt(strArr[i]);
if (sep.equals("+")) {
answer += num;
} else {
answer -= num;
}
}
return answer;
}
}
가장 큰 수 찾기
import java.util.*;
class Solution {
public int[] solution(int[] array) {
int[] answer = {};
int[] sort_array = Arrays.copyOf(array, array.length);
Arrays.sort(sort_array);
int max = sort_array[sort_array.length - 1];
for (int i = 0; i < array.length; i++) {
if (array[i] == max) {
answer = new int[]{ max, i };
}
}
return answer;
}
}
편지
class Solution {
public int solution(String message) {
return message.length() * 2;
}
}
약수 구하기
import java.util.*;
class Solution {
public int[] solution(int n) {
ArrayList<Integer> list = new ArrayList<>();
for (int i = 1; i <= n; i++) {
if (n % i == 0) {
list.add(i);
}
}
int[] answer = new int[list.size()];
for (int i = 0; i < list.size(); i++) {
answer[i] = list.get(i);
}
return answer;
}
}
한 번만 등장한 문자
import java.util.*;
class Solution {
public String solution(String s) {
String answer = "";
String[] sArr = s.split("");
Arrays.sort(sArr);
boolean same = false;
String nextStr = "";
for (int i = 0; i < sArr.length-1; i++) {
String curStr = sArr[i];
nextStr = sArr[i+1];
if (curStr.equals(nextStr)) {
same = true;
} else if (same == false) {
answer += curStr;
} else {
same = false;
}
}
if (same == false) {
answer += sArr[sArr.length-1];
}
return answer;
}
}
class Solution {
public String solution(String s) {
int[] alpha = new int[26];
for(char c : s.toCharArray()){
alpha[c - 'a']++;
}
StringBuilder answer = new StringBuilder();
for(int i = 0; i < 26; i++){
if(alpha[i] == 1){
answer.append((char)(i + 'a'));
}
}
return answer.toString();
}
}
인덱스 바꾸기
class Solution {
public String solution(String my_string, int num1, int num2) {
String answer = "";
char str1 = my_string.charAt(num1);
char str2 = my_string.charAt(num2);
return my_string.substring(0, num1) + str2 + my_string.substring(num1+1, num2) + str1 + my_string.substring(num2+1, my_string.length());
}
}
class Solution {
public String solution(String my_string, int num1, int num2) {
char[] charArr = my_string.toCharArray();
charArr[num1] = my_string.charAt(num2);
charArr[num2] = my_string.charAt(num1);
return String.valueOf(charArr);
}
}
영어가 싫어요
import java.util.*;
class Solution {
public long solution(String numbers) {
HashMap<String, String> hashMap = new HashMap<>();
hashMap.put("zero", "0");
hashMap.put("one", "1");
hashMap.put("two", "2");
hashMap.put("three", "3");
hashMap.put("four", "4");
hashMap.put("five", "5");
hashMap.put("six", "6");
hashMap.put("seven", "7");
hashMap.put("eight", "8");
hashMap.put("nine", "9");
String subStr = "";
String result = "";
for (int i = 0; i < numbers.length(); i++) {
subStr += numbers.charAt(i);
if (hashMap.containsKey(subStr)) {
result += hashMap.get(subStr);
subStr = "";
}
}
return Long.parseLong(result);
}
}
아래처럼, replace를 사용하면 더 간결하게 구현할 수 있습니다.
import java.util.*;
class Solution {
public long solution(String numbers) {
String[] numArr = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};
for (int i = 0; i < numArr.length; i++) {
numbers = numbers.replace(numArr[i], String.valueOf(i));
}
return Long.parseLong(numbers);
}
}
대문자와 소문자
import java.util.*;
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();
}
}
암호 해독
import java.util.*;
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();
}
}
369게임
class Solution {
public int solution(int order) {
String str = String.valueOf(order);
String remove_str = str.replaceAll("[369]", "");
return str.length() - remove_str.length();
}
}
가까운 수
import java.util.*;
class Solution {
public int solution(int[] array, int n) {
int answer = 0;
Arrays.sort(array);
int min_diff = array[array.length-1] + n;
for (int i = 0; i < array.length; i++) {
int cur_diff = Math.abs(array[i] - n);
if (min_diff > cur_diff) {
min_diff = cur_diff;
answer = array[i];
}
}
return answer;
}
}
삼각형의 완성조건 (1)
import java.util.*;
class Solution {
public int solution(int[] sides) {
int answer = 2;
Arrays.sort(sides);
if (sides[2] < sides[0] + sides[1]) {
answer = 1;
}
return answer;
}
}
중복된 문자 제거
import java.util.*;
class Solution {
public String solution(String my_string) {
Set<Character> set = new LinkedHashSet<>();
for (char c : my_string.toCharArray()) {
set.add(c);
}
String answer = "";
for (char c : set) {
answer += c;
}
return answer;
}
}
LinkedHashSet을 사용하면 순서를 유지하며 중복이 제거됩니다.
import java.util.*;
class Solution {
public String solution(String my_string) {
String[] strArr = my_string.split("");
Set<String> set = new LinkedHashSet<>(Arrays.asList(strArr));
return String.join("", set);
}
}
위와 같이, 더 간략하게 구현이 가능합니다.
k의 개수
class Solution {
public int solution(int i, int j, int k) {
int answer = 0;
String str_k = String.valueOf(k);
for (int num = i; num <= j; num++) {
String str = String.valueOf(num);
for (char c : str.toCharArray()) {
if (str.indexOf(str_k) != -1) {
str = str.replaceFirst(str_k, "");
answer++;
}
}
}
return answer;
}
}
import java.util.*;
class Solution {
public int solution(int i, int j, int k) {
StringBuilder sb = new StringBuilder();
for (int num = i; num <= j; num++) {
sb.append(num);
}
String allStr = sb.toString();
return allStr.length() - allStr.replace(String.valueOf(k), "").length();
}
}
A로 B 만들기
import java.util.*;
class Solution {
public int solution(String before, String after) {
String[] beforeArr = before.split("");
StringBuilder after_sb = new StringBuilder(after);
for (String str : beforeArr) {
int i = after_sb.toString().indexOf(str);
if (i != -1) {
after_sb.deleteCharAt(i);
}
}
return after_sb.toString().isEmpty() ? 1 : 0;
}
}
class Solution {
public int solution(String before, String after) {
String[] beforeArr = before.split("");
for (String str : beforeArr) {
int i = after.indexOf(str);
if (i != -1) {
after = after.replaceFirst(str, "");
}
}
return after.isEmpty() ? 1 : 0;
}
}
import java.util.*;
class Solution {
public int solution(String before, String after) {
char[] beforeSort = before.toCharArray();
char[] afterSort = after.toCharArray();
Arrays.sort(beforeSort);
Arrays.sort(afterSort);
return String.valueOf(beforeSort).equals(String.valueOf(afterSort)) ? 1 : 0;
}
}
이진수 더하기
class Solution {
public String solution(String bin1, String bin2) {
int sum = Integer.parseInt(bin1, 2) + Integer.parseInt(bin2, 2);
return Integer.toString(sum, 2);
}
}
치킨 쿠폰
class Solution {
public int solution(int chicken) {
int service = 0;
while (chicken >= 10) {
int new_service = chicken / 10;
service += new_service;
chicken = chicken % 10 + new_service;
}
return service;
}
}
로그인 성공?
import java.util.*;
class Solution {
public String solution(String[] id_pw, String[][] db) {
String answer = "fail";
HashMap<String, String> hashMap = new HashMap<>();
for (int i = 0; i < db.length; i++) {
hashMap.put(db[i][0], db[i][1]);
}
if (hashMap.containsKey(id_pw[0])) {
if (id_pw[1].equals(hashMap.get(id_pw[0]))) {
answer = "login";
} else {
answer = "wrong pw";
}
}
return answer;
}
}
아래처럼 HashMap을 사용하지 않고 간략하게 풀 수 있습니다.
class Solution {
public String solution(String[] id_pw, String[][] db) {
String answer = "fail";
for (String[] user : db) {
if (id_pw[0].equals(user[0])) {
if (id_pw[1].equals(user[1])) {
answer = "login";
} else {
answer = "wrong pw";
}
}
}
return answer;
}
}
등수 매기기
import java.util.*;
class Solution {
public int[] solution(int[][] score) {
int n = score.length;
int[] totalScore = new int[n];
int[] ranks = new int[n];
// 학생들의 총점 계산
for (int i = 0; i < n; i++) {
totalScore[i] = score[i][0] + score[i][1];
}
// 각 학생의 등수 계산
for (int i = 0; i < n; i++) {
int rank = 1;
for (int j = 0; j < n; j++) {
if (totalScore[j] > totalScore[i]) {
rank++;
}
}
ranks[i] = rank;
}
return ranks;
}
}
아래처럼, ArrayList의 indexOf 함수를 이용하여 등수를 매기면 좋습니다.
import java.util.*;
class Solution {
public int[] solution(int[][] score) {
ArrayList<Integer> list = new ArrayList<>();
for (int[] v : score) {
list.add(v[0] + v[1]);
}
int[] answer = new int[score.length];
Collections.sort(list, Collections.reverseOrder());
for (int i = 0; i < score.length; i++) {
answer[i] = list.indexOf(score[i][0] + score[i][1]) + 1;
}
return answer;
}
}
/2로 평균을 구하지 않고, 합계로 등수를 매기면 정확도가 높아집니다.
특이한 정렬
import java.util.*;
class Solution {
public int[] solution(int[] numlist, int n) {
PriorityQueue<Integer> pq = new PriorityQueue<>(
(a, b) -> {
int diffA = Math.abs(a - n);
int diffB = Math.abs(b - n);
if (diffA != diffB) {
// 절대값 차이가 다르면 절대값 치이 오름차순
return diffA - diffB;
} else {
// 절대값 차이가 같으면 숫자 내림차순
return b - a;
}
}
);
for (int num : numlist) {
pq.add(num);
}
int[] answer = new int[pq.size()];
int i = 0;
while(!pq.isEmpty()) {
answer[i++] = pq.poll();
}
return answer;
}
}
우선순위 큐 객체를 생성하며 정렬 조건을 설정하면, 쉽게 정렬할 수 있습니다.
유한소수 판별하기
class Solution {
public int solution(int a, int b) {
int answer = 1;
for (int i = 2; i <= b; i++) {
if (a % i == 0 && b % i == 0) {
a /= i;
b /= i;
}
}
while (b > 1) {
if (b % 2 == 0) {
b /= 2;
continue;
}
if (b % 5 == 0) {
b /= 5;
continue;
}
return 2;
}
return answer;
}
}
class Solution {
public int solution(int a, int b) {
int answer = 1;
for (int i = 2; i <= b; i++) {
if (a % i == 0 && b % i == 0) {
a /= i;
b /= i;
}
}
while (b % 2 == 0) {
b /= 2;
}
while (b % 5 == 0) {
b /= 5;
}
if (b != 1) {
answer = 2;
}
return answer;
}
}
분모에서 2의 배수, 5의 배수를 모두 제거한 뒤 남은 수가 1이 아니면 무한소수입니다.
겹치는 선분의 길이
import java.util.*;
class Solution {
public int solution(int[][] lines) {
int answer = 0;
HashMap<List<Integer>, Integer> map = new HashMap<>();
for (int i = 0; i < lines.length; i++) {
for (int j = lines[i][0]; j < lines[i][1]; j++) {
map.put(Arrays.asList(j, j+1), map.getOrDefault(Arrays.asList(j, j+1), 0) +1);
}
}
for (Integer cnt : map.values()) {
if (cnt > 1) {
answer++;
}
}
return answer;
}
}
HashMap 키로 배열을 사용하면 같은 내용이어도 다른 객체이므로 값을 찾기 어렵습니다.
Arrays.asList로 생성한 리스트를 사용하면 내부 요소들을 비교하여 동일한 키로 인식합니다.
import java.util.*;
class Solution {
public int solution(int[][] lines) {
int answer = 0;
HashMap<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < lines.length; i++) {
for (int j = lines[i][0]; j < lines[i][1]; j++) {
map.put(j, map.getOrDefault(j, 0) +1);
}
}
for (Integer cnt : map.values()) {
if (cnt > 1) {
answer++;
}
}
return answer;
}
}
리스트를 생성하고 해시맵의 키로 사용하는 과정에서 오버헤드가 발생하므로 수정하였습니다.
평행
class Solution {
public int solution(int[][] dots) {
int answer = 0;
if (check(dots[0], dots[1]) == check(dots[2], dots[3])) {
return 1;
}
if (check(dots[0], dots[2]) == check(dots[1], dots[3])) {
return 1;
}
if (check(dots[0], dots[3]) == check(dots[1], dots[2])) {
return 1;
}
return answer;
}
public double check(int[] dot1, int[] dot2) {
return (double) (dot2[1] - dot1[1]) / (dot2[0] - dot1[0]);
}
}
두 점 사이의 기울기를 (y2−y1) / (x2−x1)로 구해서 비교하여 평행 여부를 체크합니다.
저주의 숫자 3
class Solution {
public int solution(int n) {
int answer = 0;
int cnt = 0;
int i = 0;
while (cnt != n) {
i++;
if (i % 3 == 0) {
continue;
}
String i_str = String.valueOf(i);
boolean isThree = false;
for (char c : i_str.toCharArray()) {
if (c == '3') {
isThree = true;
break;
}
}
if (isThree == true) {
continue;
}
cnt++;
if (cnt == n) {
answer = i;
}
}
return answer;
}
}
아래처럼 contains를 사용하면 간결하게 문자열 포함 여부를 알 수 있습니다.
class Solution {
public int solution(int n) {
for (int i = 1; i <= n; i++) {
String str = String.valueOf(i);
if (i % 3 == 0 || str.contains("3")) {
n++;
}
}
return n;
}
}
외계어 사전
import java.util.*;
class Solution {
public int solution(String[] spell, String[] dic) {
Arrays.sort(spell);
String spellStr = String.join("", spell);
for (int i = 0; i < dic.length; i++) {
String[] dicArr = dic[i].split("");
Arrays.sort(dicArr);
String dicStr = String.join("", dicArr);
if (spellStr.equals(dicStr)) {
return 1;
}
}
return 2;
}
}
삼각형의 완성조건 (2)
class Solution {
public int solution(int[] sides) {;
int side_3_min = Math.abs(sides[0] - sides[1]) +1;
int side_3_max = sides[0] + sides[1] -1;
return side_3_max - side_3_min +1; // side_3_min이 제거되기 때문에, 경우의 수 +1 추가
}
}
삼각형 두 변 a, b가 있을 때 마지막 변 c를 구하는 공식은 | a - b | +1 <= c <= a + b -1 입니다.
삼각형의 불등식에서 c는 두 변의 차보다 크고, 두 변의 합보다 작아야 하기 때문입니다.
class Solution {
public int solution(int[] sides) {
int min = Math.min(sides[0], sides[1]);
return min + min - 1;
}
}
위 코드는 3번째 변으로 가능한 경우의 수를 구하는 간략화된 공식입니다.
안전지대
class Solution {
public int solution(int[][] board) {
int answer = 0;
int[][] moves = new int[][]{ {-1,-1},{-1,0},{-1,1},
{0,-1},{0,0},{0,1},
{1,-1},{1,0},{1,1} };
for (int i = 0; i < board.length; i++) {
for (int j = 0; j < board[i].length; j++) {
boolean flag = true;
for (int[] move : moves) {
int row = i + move[0];
int col = j + move[1];
if (row < 0 || row >= board.length || col < 0 || col >= board[i].length) {
continue;
}
int moveVal = board[row][col];
if (moveVal == 1) {
flag = false;
}
}
if (flag) {
answer++;
}
}
}
return answer;
}
}
숨어있는 숫자의 덧셈 (2)
class Solution {
public int solution(String my_string) {
int answer = 0;
String str = "";
for (char c : my_string.toCharArray()) {
if (c - '0' >= 0 && c - '0' <= 9) {
str += c;
} else {
if (!str.isEmpty()) {
answer += Integer.parseInt(str);
str = "";
}
}
}
if (!str.isEmpty()) {
answer += Integer.parseInt(str);
}
return answer;
}
}
아래처럼 정규표현식과 split을 이용하면 더욱 간결하게 구현할 수 있습니다.
class Solution {
public int solution(String my_string) {
int answer = 0;
String[] strArr = my_string.replaceAll("[a-zA-Z]", " ").split(" ");
for (String str : strArr) {
if (!str.isEmpty()) {
answer += Integer.parseInt(str);
}
}
return answer;
}
}
다항식 더하기
import java.util.*;
class Solution {
public String solution(String polynomial) {
int xSum = 0;
int iSum = 0;
String[] poly_arr = polynomial.split(" ");
for (int i = 0; i < poly_arr.length; i++) {
String poly = poly_arr[i];
if (poly.equals("+")) {
continue;
}
if (poly.contains("x")) {
// x인 경우
String xSumStr = poly.substring(0, poly.indexOf("x"));
if (xSumStr.equals("")) {
xSum++;
} else {
xSum += Integer.parseInt(xSumStr);
}
} else {
// 상수인 경우
iSum += Integer.parseInt(poly);
}
}
// 수식 더하기
StringBuilder sb = new StringBuilder();
if (xSum != 0) {
if (xSum == 1) {
sb.append("x");
} else {
sb.append(xSum).append("x");
}
}
if (iSum != 0) {
if (xSum != 0) {
sb.append(" + ");
}
sb.append(iSum);
}
return sb.toString();
}
}
최댓값 만들기 (2)
import java.util.*;
class Solution {
public int solution(int[] numbers) {
Arrays.sort(numbers);
int plus_max = numbers[numbers.length -1] * numbers[numbers.length -2];
int minus_max = numbers[0] * numbers[1];
return Math.max(plus_max, minus_max);
}
}
캐릭터의 좌표
import java.util.*;
class Solution {
public int[] solution(String[] keyinput, int[] board) {
int[] answer = {0, 0};
HashMap<String, int[]> moveMap = new HashMap<>();
moveMap.put("up", new int[]{0, 1});
moveMap.put("down", new int[]{0, -1});
moveMap.put("left", new int[]{-1, 0});
moveMap.put("right", new int[]{1, 0});
int x_range = (board[0] - 1) / 2;
int y_range = (board[1] - 1) / 2;
int min_x = -x_range;
int max_x = x_range;
int min_y = -y_range;
int max_y = y_range;
for (String v : keyinput) {
if (v.equals("up") && answer[1] == max_y) {
continue;
}
if (v.equals("down") && answer[1] == min_y) {
continue;
}
if (v.equals("left") && answer[0] == min_x) {
continue;
}
if (v.equals("right") && answer[0] == max_x) {
continue;
}
int[] move = moveMap.get(v);
answer[0] += move[0];
answer[1] += move[1];
}
return answer;
}
}
직사각형 넓이 구하기
class Solution {
public int solution(int[][] dots) {
int answer = 0;
int x1 = -1;
int x2 = -1;
int y1 = -1;
int y2 = -1;
for (int[] v : dots) {
if (x1 == -1) {
x1 = v[0];
} else if (x2 == -1 && x1 != v[0]) {
x2 = v[0];
}
if (y1 == -1) {
y1 = v[1];
} else if (y2 == -1 && y1 != v[1]) {
y2 = v[1];
}
}
if (x2 < x1) {
int temp = x1;
x1 = x2;
x2 = temp;
}
if (y2 < y1) {
int temp = y1;
y1 = y2;
y2 = temp;
}
return (x2 - x1) * (y2 - y1);
}
}
배열 원소의 길이
class Solution {
public int[] solution(String[] strlist) {
int[] answer = new int[strlist.length];
for (int i = 0; i < strlist.length; i++) {
answer[i] = strlist[i].length();
}
return answer;
}
}
컨트롤 제트
class Solution {
public int solution(String s) {
int answer = 0;
String[] sArr = s.split(" ");
int prev_num = 0;
for (int i = 0; i < sArr.length; i++) {
String cur_str = sArr[i];
if ("Z".equals(cur_str)) {
answer -= prev_num;
} else {
int cur_num = Integer.parseInt(cur_str);
answer += cur_num;
prev_num = cur_num;
}
}
return answer;
}
}
아래처럼, 스택을 이용하기 좋은 문제입니다.
import java.util.*;
class Solution {
public int solution(String s) {
int answer = 0;
Deque<Integer> stack = new ArrayDeque<>();
for (String str : s.split(" ")) {
if (str.equals("Z")) {
stack.pop();
} else {
stack.push(Integer.parseInt(str));
}
}
for (int v : stack) {
System.out.println(v);
answer += v;
}
return answer;
}
}
소인수분해
import java.util.*;
class Solution {
public int[] solution(int n) {
ArrayList<Integer> list = new ArrayList<>();
while (n > 1) {
for (int i = 2; i <= n; i++) {
if (n % i == 0) {
n /= i;
if (!list.contains(i)) {
list.add(i);
}
break;
}
}
}
int[] answer = new int[list.size()];
for (int i = 0; i < list.size(); i++) {
answer[i] = list.get(i);
}
return answer;
}
}
while (n > 1) 하는 이유는, 1은 더이상 나눌 수 없기 떄문입니다.
import java.util.*;
class Solution {
public int[] solution(int n) {
Set<Integer> set = new LinkedHashSet<>();
while (n > 1) {
for (int i = 2; i <= n; i++) {
if (n % i == 0) {
n /= i;
set.add(i);
break;
}
}
}
int[] answer = new int[set.size()];
int i = 0;
for (int v : set) {
answer[i] = v;
i++;
}
return answer;
}
}
ArrayList 대신 LinkedHashSet을 사용하면 더 쉽게 중복을 제거할 수 있습니다.
숨어있는 숫자의 덧셈 (1)
class Solution {
public int solution(String my_string) {
int answer = 0;
for (int i = 0; i < my_string.length(); i++) {
char c = my_string.charAt(i);
if (c > '0' && c <= '9') {
answer += c - '0';
}
}
return answer;
}
}
아래처럼 toCharArray()를 사용하면 쉽게 문자를 추출할 수 있습니다.
class Solution {
public int solution(String my_string) {
int answer = 0;
for (char c : my_string.toCharArray()) {
if (c > '0' && c <= '9') {
answer += c - '0';
}
}
return answer;
}
}
문자열 정렬하기 (1)
import java.util.*;
class Solution {
public int[] solution(String my_string) {
ArrayList<Integer> list = new ArrayList<>();
for (char c : my_string.toCharArray()) {
int i = c - '0';
if (i >= 0 && i <= 9) {
list.add(i);
}
}
int[] answer = new int[list.size()];
for (int i = 0; i < list.size(); i++) {
answer[i] = list.get(i);
}
Arrays.sort(answer);
return answer;
}
}
아래처럼 replaceAll으로 String의 모든 영어 소문자를 제거할 수 있습니다.
import java.util.*;
class Solution {
public int[] solution(String my_string) {
my_string = my_string.replaceAll("[a-z]", "");
int[] answer = new int[my_string.length()];
for (int i = 0; i < answer.length; i++) {
answer[i] = my_string.charAt(i) - '0';
}
Arrays.sort(answer);
return answer;
}
}
모음 제거
import java.util.*;
class Solution {
public String solution(String my_string) {
StringBuilder sb = new StringBuilder();
Set<Character> set = new HashSet<>(Arrays.asList('a', 'e', 'i', 'o', 'u'));
for (char c : my_string.toCharArray()) {
if(!set.contains(c)) {
sb.append(c);
}
}
return sb.toString();
}
}
mport java.util.*;
class Solution {
public String solution(String my_string) {
return my_string.replaceAll("[aeiou]", "");
}
}
팩토리얼
class Solution {
public int solution(int n) {
int answer = 0;
int sum = 0;
int cnt = 0;
while (true) {
if (sum == n) {
break;
} else if (sum > n) {
cnt--;
break;
}
cnt++;
sum = factorial(cnt);
}
return cnt;
}
public int factorial(int i) {
if (i == 0) {
return 1;
}
return i * factorial(i-1);
}
}
class Solution {
public int solution(int n) {
int answer = 0;
for (int i = 1; factorial(i) <= n; i++) {
answer = i;
}
return answer;
}
public int factorial(int i) {
if (i == 1) {
return 1;
}
return i * factorial(i-1);
}
}
최댓값 만들기(1)
import java.util.*;
class Solution {
public int solution(int[] numbers) {
Arrays.sort(numbers);
return numbers[numbers.length-1] * numbers[numbers.length-2];
}
}
합성수 찾기
class Solution {
public int solution(int n) {
int answer = 0;
for (int i = 1; i <= n; i++) {
int cnt = 0;
for (int j = 1; j <= i; j++) {
if (i % j == 0) {
cnt++;
}
if (cnt == 3) {
answer++;
break;
}
}
}
return answer;
}
}
주사위의 개수
class Solution {
public int solution(int[] box, int n) {
return (box[0] / n) * (box[1] / n) * (box[2] / n);
}
}
배열 회전시키기
class Solution {
public int[] solution(int[] numbers, String direction) {
int[] answer = new int[numbers.length];
if (direction.equals("right")) {
answer[0] = numbers[numbers.length-1];
for (int i = 0; i < numbers.length-1; i++) {
answer[i+1] = numbers[i];
}
} else {
for (int i = 1; i < numbers.length; i++) {
answer[i-1] = numbers[i];
}
answer[numbers.length-1] = numbers[0];
}
return answer;
}
}
공 던지기
class Solution {
public int solution(int[] numbers, int k) {
return numbers[(k-1) * 2 % numbers.length];
}
}
2차원으로 만들기
import java.util.*;
class Solution {
public int[][] solution(int[] num_list, int n) {
ArrayList<Integer[]> list = new ArrayList<>();
Integer[] i_arr = new Integer[n];
for (int i = 0; i < num_list.length; i++) {
if (i % n == 0) {
i_arr = new Integer[n];
}
i_arr[i % n] = num_list[i];
if (i % n == 0) {
list.add(i_arr);
}
}
int[][] answer = new int[list.size()][];
for (int i = 0; i < list.size(); i++) {
int[] intArr = new int[n];
Integer[] integerArr = list.get(i);
for (int j = 0; j < integerArr.length; j++) {
intArr[j] = integerArr[j].intValue();
}
answer[i] = intArr;
}
return answer;
}
}
배열의 개수가 정해진 경우, 위와 같이 ArrayList를 사용하면 코드가 복잡해질 수 있습니다.
import java.util.*;
class Solution {
public int[][] solution(int[] num_list, int n) {
int[][] answer = new int[num_list.length / n][n];
for (int i = 0; i < num_list.length; i++) {
answer[i / n][i % n] = num_list[i];
}
return answer;
}
}
점의 위치 구하기
class Solution {
public int solution(int[] dot) {
int answer = 0;
int x = dot[0];
int y = dot[1];
if (x > 0 && y > 0) {
answer = 1;
} else if (x > 0) {
answer = 4;
} else if (y > 0) {
answer = 2;
} else {
answer = 3;
}
return answer;
}
}
구슬을 나누는 경우의 수
class Solution {
public int solution(int balls, int share) {
return combination(balls, share);
}
public int combination(int n, int m) {
if (m == 0 || n == m) {
return 1;
}
return combination(n - 1, m) + combination(n -1, m -1);
}
}
순서가 없는 서로 다른 n개에서 m개를 선택하는 조합 코드입니다.
combination(4, 2) == 6
(3, 2)=3
(2, 2)=1, (2, 1)=2
(1, 1)=1, (1, 0)=1
(3, 1)=3
(2, 1)=2, (2, 0)=1
위 combination 재귀 함수를 디버깅하면 이런 형태입니다.
return 로직을 한번에 계산하지 말고, 앞부분 (3, 2) 계산 후 뒷부분(3, 1)을 계산하면 이해가 쉽습니다.
(2, 1)처럼 중복 호출이 발생하니, 메모이제이션으로 계산한 값을 저장해두고 재사용하면 효율적입니다.
가위 바위 보
class Solution {
public String solution(String rsp) {
String answer = "";
for (int i = 0; i < rsp.length(); i++) {
char c = rsp.charAt(i);
switch(c) {
case '2':
c = '0';
break;
case '0':
c = '5';
break;
case '5':
c = '2';
break;
}
answer += c;
}
return answer;
}
}
문자열은 아래처럼 StringBuilder로 더하는 것이 좋습니다.
import java.util.*;
class Solution {
public String solution(String rsp) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < rsp.length(); i++) {
char c = rsp.charAt(i);
switch(c) {
case '2':
c = '0';
break;
case '0':
c = '5';
break;
case '5':
c = '2';
break;
}
sb.append(c);
}
return sb.toString();
}
}
모스부호 (1)
import java.util.*;
class Solution {
public String solution(String letter) {
String answer = "";
HashMap<String, String> map = new HashMap<>();
map.put(".-", "a");
map.put("-...", "b");
map.put("-.-.", "c");
map.put("-..", "d");
map.put(".", "e");
map.put("..-.", "f");
map.put("--.", "g");
map.put("....", "h");
map.put("..", "i");
map.put(".---", "j");
map.put("-.-", "k");
map.put(".-..", "l");
map.put("--", "m");
map.put("-.", "n");
map.put("---", "o");
map.put(".--.", "p");
map.put("--.-", "q");
map.put(".-.", "r");
map.put("...", "s");
map.put("-", "t");
map.put("..-", "u");
map.put("...-", "v");
map.put(".--", "w");
map.put("-..-", "x");
map.put("-.--", "y");
map.put("--..", "z");
String[] strArr = letter.split(" ");
for (String str : strArr) {
answer += map.get(str);
}
return answer;
}
}
개미 군단
class Solution {
public int solution(int hp) {
int answer = 0;
answer += hp / 5;
hp %= 5;
answer += hp / 3;
hp %= 3;
return answer += hp;
}
}
순서쌍의 개수
class Solution {
public int solution(int n) {
int cnt = 0;
for (int i = 1; i <= n; i++) {
if (n % i == 0) {
cnt++;
}
}
return cnt;
}
}
진료순서 정하기
import java.util.*;
class Solution {
public int[] solution(int[] emergency) {
PriorityQueue<Integer> pq = new PriorityQueue<>(Collections.reverseOrder());
for (int v : emergency) {
pq.add(v);
}
int[] answer = new int[emergency.length];
int lank = 1;
while (!pq.isEmpty()) {
int num = pq.poll();
int num_i = 0;
for (int i = 0; i < emergency.length; i++) {
if (emergency[i] == num) {
num_i = i;
break;
}
}
answer[num_i] = lank;
lank++;
}
return answer;
}
}
외계행성의 나이
class Solution {
public String solution(int age) {
String[] universe_age = {"a", "b", "c", "d", "e", "f", "g", "h", "i", "j"};
String answer = "";
for (char c : String.valueOf(age).toCharArray()) {
answer += universe_age[c - '0'];
}
return answer;
}
}
배열 자르기
class Solution {
public int[] solution(int[] numbers, int num1, int num2) {
int[] answer = new int[num2 - num1 +1];
for (int i = num1; i <= num2; i++) {
answer[i - num1] = numbers[i];
}
return answer;
}
}
import java.util.*;
class Solution {
public int[] solution(int[] numbers, int num1, int num2) {
return Arrays.copyOfRange(numbers, num1, num2+1);
}
}
짝수의 합
class Solution {
public int solution(int n) {
int answer = 0;
for (int i = 2; i <= n; i += 2) {
answer += i;
}
return answer;
}
}
양꼬치
class Solution {
public int solution(int n, int k) {
int service_k = n / 10;
return (n * 12000) + ((k - service_k) * 2000);
}
}
각도기
class Solution {
public int solution(int angle) {
int answer = 0;
if (angle < 90) {
answer = 1;
} else if (angle == 90) {
answer = 2;
} else if (angle < 180) {
answer = 3;
} else {
answer = 4;
}
return answer;
}
}
특정 문자 제거하기
class Solution {
public String solution(String my_string, String letter) {
int letter_i = my_string.indexOf(letter);
while (letter_i != -1) {
my_string = my_string.substring(0, letter_i) + my_string.substring(letter_i +1, my_string.length());
letter_i = my_string.indexOf(letter);
}
return my_string;
}
}
아래처럼 replace 함수를 이용하면 더 간결하게 할 수 있습니다.
class Solution {
public String solution(String my_string, String letter) {
return my_string.replace(letter, "");
}
}
문자 반복 출력하기
import java.util.*;
class Solution {
public String solution(String my_string, int n) {
StringBuilder sb = new StringBuilder();
for (char c : my_string.toCharArray()) {
for (int i = 0; i < n; i++) {
sb.append(c);
}
}
return sb.toString();
}
}
짝수 홀수 개수
class Solution {
public int[] solution(int[] num_list) {
int[] answer = new int[2];
for (int num : num_list) {
if (num % 2 == 0) {
answer[0]++;
} else {
answer[1]++;
}
}
return answer;
}
}
직각삼각형 출력하기
import java.util.Scanner;
public class Solution {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
for (int i = 0; i < n; i++) {
for (int j = 0; j <= i; j++) {
System.out.print("*");
}
System.out.println();
}
}
}
아래처럼 repeat 함수를 사용하면 더 간결하게 문자열을 반복할 수 있습니다.
import java.util.Scanner;
public class Solution {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
for (int i = 1; i <= n; i++) {
System.out.println("*".repeat(i));
}
}
}
문자열 뒤집기
import java.util.*;
class Solution {
public String solution(String my_string) {
StringBuilder sb = new StringBuilder();
for (int i = my_string.length()-1; i >= 0; i--) {
sb.append(my_string.charAt(i));
}
return sb.toString();
}
}
배열 뒤집기
class Solution {
public int[] solution(int[] num_list) {
int[] answer = new int[num_list.length];
for (int i = num_list.length-1; i >= 0; i--) {
answer[num_list.length-1 - i] = num_list[i];
}
return answer;
}
}
class Solution {
public int[] solution(int[] num_list) {
int[] answer = new int[num_list.length];
for (int i = 0; i < num_list.length; i++) {
answer[i] = num_list[num_list.length-1 -i];
}
return answer;
}
}
나이 출력
class Solution {
public int solution(int age) {
return 2022 - age + 1;
}
}
아이스 아메리카노
class Solution {
public int[] solution(int money) {
int[] answer = new int[2];
answer[0] = money / 5500;
answer[1] = money % 5500;
return answer;
}
}
class Solution {
public int[] solution(int money) {
int[] answer = { money / 5500, money % 5500 };
return answer;
}
}
옷가게 할인 받기
class Solution {
public int solution(int price) {
int answer = 0;
if (price >= 500000) {
answer = (int) (price * 0.8);
} else if (price >= 300000) {
answer = (int) (price * 0.9);
} else if (price >= 100000) {
answer = (int) (price * 0.95);
} else {
answer = price;
}
return answer;
}
}
배열의 평균값
class Solution {
public double solution(int[] numbers) {
int sum = 0;
for (int num : numbers) {
sum += num;
}
return (double) sum / numbers.length;
}
}
int 둘 중 하나를 double로 형변환 하면, 나눈 결과값이 정수가 아니라 실수로 나옵니다.
피자 나눠 먹기 (3)
class Solution {
public int solution(int slice, int n) {
return (n + slice -1) / slice;
}
}
class Solution {
public int solution(int slice, int n) {
return (int) Math.ceil((double) n / slice);
}
}
피자 나눠 먹기 (2)
class Solution {
public int solution(int n) {
int cnt = 1;
while (true) {
if (cnt * 6 % n == 0) {
break;
}
cnt++;
}
return cnt;
}
}
피자 나눠 먹기 (1)
class Solution {
public int solution(int n) {
// 올림 한 실수 값을 정수로 반환
return (int) Math.ceil((double) n / 7);
}
}
class Solution {
public int solution(int n) {
return (n + 6) / 7;
}
}
짝수는 싫어요
import java.util.*;
class Solution {
public int[] solution(int n) {
ArrayList<Integer> list = new ArrayList<>();
for (int i = 1; i <= n; i += 2) {
list.add(i);
}
int[] answer = new int[list.size()];
for (int i = 0; i < list.size(); i++) {
answer[i] = list.get(i);
}
return answer;
}
}
최빈값 구하기
import java.util.*;
class Solution {
public int solution(int[] array) {
int answer = 0;
HashMap<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < array.length; i++) {
map.put(array[i], map.getOrDefault(array[i], 0) + 1);
}
int maxCnt = 0;
// 가장 자주 나오는 값 확인
for (Integer key : map.keySet()) {
int cnt = map.get(key);
if (maxCnt < cnt) {
maxCnt = cnt;
answer = key;
}
}
// 최빈값이 여러개인지 체크
for (Integer key : map.keySet()) {
int cnt = map.get(key);
if (maxCnt == cnt && answer != key) {
return -1;
}
}
return answer;
}
}
아래처럼, 하나의 for문에서 if else로 최빈값을 갱신하는 방식의 풀이도 좋습니다.
import java.util.*;
class Solution {
public int solution(int[] array) {
int maxCount = 0;
int answer = 0;
Map<Integer, Integer> map = new HashMap<>();
for(int number : array) {
int count = map.getOrDefault(number, 0) + 1;
if (count > maxCount) {
maxCount = count;
answer = number;
} else if (count == maxCount) {
answer = -1;
}
map.put(number, count);
}
return answer;
}
}
중앙값 구하기
import java.util.*;
class Solution {
public int solution(int[] array) {
Arrays.sort(array);
return array[array.length / 2];
}
}
}
나머지 구하기
class Solution {
public int solution(int num1, int num2) {
return num1 % num2;
}
}
배열 두 배 만들기
class Solution {
public int[] solution(int[] numbers) {
for (int i = 0; i < numbers.length; i++) {
numbers[i] *= 2;
}
return numbers;
}
}
분수의 덧셈
class Solution {
public int[] solution(int numer1, int denom1, int numer2, int denom2) {
int numer = (numer1 * denom2) + (numer2 * denom1);
int denom = denom1 * denom2;
int gcd = 0;
// 분자와 분모의 최대공약수 구하기
for (int i = denom; i > 0; i--) {
if (numer % i == 0 && denom % i == 0) {
gcd = i;
break;
}
}
// 분자와 분모의 최대공약수로 약분하여 기약분수 만들기
return new int[] { numer / gcd, denom / gcd };
}
}
숫자 비교하기
class Solution {
public int solution(int num1, int num2) {
return num1 == num2? 1 : -1;
}
}
두 수의 나눗셈
class Solution {
public int solution(int num1, int num2) {
return (int) ( (double) num1 / num2 * 1000);
}
}
몫 구하기
class Solution {
public int solution(int num1, int num2) {
return num1 / num2;
}
}
두 수의 곱
class Solution {
public int solution(int num1, int num2) {
return num1 * num2;
}
}
두 수의 차
class Solution {
public int solution(int num1, int num2) {
return num1 - num2;
}
}
두 수의 합
class Solution {
public int solution(int num1, int num2) {
return num1 + num2;
}
}
머쓱이보다 키 큰 사람
import java.util.*;
class Solution {
public int solution(int[] array, int height) {
int answer = 0;
for (int v : array) {
if (v > height) {
answer++;
}
}
return answer;
}
}
중복된 숫자 개수
import java.util.*;
class Solution {
public int solution(int[] array, int n) {
int answer = 0;
Arrays.sort(array);
for (int v : array) {
if (v > n) {
break;
}
if (v == n) {
answer++;
}
}
return answer;
}
}
Leave a comment