프로그래머스 Java - Lv. 1 [11~20]

6720·2023년 2월 2일
post-thumbnail

👨‍🏫 이번 목표

프로그래머스 코딩테스트 Lv. 1 Java로 11부터 20까지 풀기 (최신순 정렬 기준)

📒 문제 풀이

깃허브 링크

11 서울에서 김서방 찾기


문제 설명

String형 배열 seoul의 element중 "Kim"의 위치 x를 찾아, "김서방은 x에 있다"는 String을 반환하는 함수, solution을 완성하세요. seoul에 "Kim"은 오직 한 번만 나타나며 잘못된 값이 입력되는 경우는 없습니다.

제한 사항

  • seoul은 길이 1 이상, 1000 이하인 배열입니다.
  • seoul의 원소는 길이 1 이상, 20 이하인 문자열입니다.
  • "Kim"은 반드시 seoul 안에 포함되어 있습니다.

입출력 예

seoulreturn
["Jane", "Kim"]"김서방은 1에 있다"

문제 접근

배열에서의 Kim의 위치를 찾으면 될 것 같음.

코드

import java.util.*;

class Solution {
    public String solution(String[] seoul) {
        return "김서방은 " + Arrays.asList(seoul).indexOf("Kim") + "에 있다";
    }
}

indexOf(): 배열에서 가장 첫번째에 있는 특정값의 인덱스 출력

한줄평

문자열이랑 관련된게 나오면 손이 너무 떨린다

12 소수 찾기


문제 설명

1부터 입력받은 숫자 n 사이에 있는 소수의 개수를 반환하는 함수, solution을 만들어 보세요.

소수는 1과 자기 자신으로만 나누어지는 수를 의미합니다.(1은 소수가 아닙니다.)

제한 조건

  • n은 2이상 1000000이하의 자연수입니다.

입출력 예

nresult
104
53

문제 접근

딱 에라스토테네스의 체와 관련된 문제가 나옴. 그걸로 풀면 될듯.

코드

class Solution {
    public boolean[] checkPrime;
    public int solution(int n) {
        int answer = 0;
        is_prime(n);
        
        for (int i = 0; i <= n; i++) {
            if (!checkPrime[i]) answer++;
        }
        
        return answer;
    }
    public void is_prime(int num) {
        checkPrime = new boolean[num + 1];
        
        if (num < 2) return;
        checkPrime[0] = checkPrime[1] = true;
        
        for (int i = 2; i <= Math.sqrt(num); i++) {
            if (checkPrime[i] == true) continue;
            
            for (int j = i * i; j < checkPrime.length; j += i) {
                checkPrime[j] = true;
            }
        }
    }
}

한줄평

마침 딱 어제 공부해서 다행이었네.

13 수박수박수박수박수박수?


문제 설명

길이가 n이고, "수박수박수박수...."와 같은 패턴을 유지하는 문자열을 리턴하는 함수, solution을 완성하세요. 예를들어 n이 4이면 "수박수박"을 리턴하고 3이라면 "수박수"를 리턴하면 됩니다.

제한 조건

  • n은 길이 10,000이하인 자연수입니다.

입출력 예

nreturn
3"수박수"
4"수박수박"

문제 접근

n/2를 하면 수박의 개수가 나오는데 이 부분에서 홀수라면 수를 하나 더 출력하고, 그렇지 않으면 바로 반환하도록 하면 될 것 같음.

코드

class Solution {
    public String solution(int n) {
        return n % 2 == 0 ? "수박".repeat(n/2) : "수박".repeat(n/2).concat("수");
    }
}

한줄평

여기와서 다시 보니깐 변수 정리를 해주면 좋았을 듯.

14 문자열을 정수로 바꾸기


문제 설명

문자열 s를 숫자로 변환한 결과를 반환하는 함수, solution을 완성하세요.

제한 조건

  • s의 길이는 1 이상 5이하입니다.
  • s의 맨앞에는 부호(+, -)가 올 수 있습니다.
  • s는 부호와 숫자로만 이루어져있습니다.
  • s는 "0"으로 시작하지 않습니다.

문제 접근

Integer.parseInt() 사용해서 바로 반환되도록 하면 될 듯.

코드

class Solution {
    public int solution(String s) {
        return Integer.parseInt(s);
    }
}

알고리즘 ver

class Solution {
    public int solution(String s) {
        int answer = 0;
        char[] arr = s.toCharArray();
        boolean plusOrMinus = true;
        
        for (char ch : arr) {
            if (ch == '-') {
                plusOrMinus = false;
                continue;
            } else if (ch == '+') continue;
            answer = (ch - '0') + answer * 10;
        }
        
        return plusOrMinus == true ? answer : answer * -1;
    }
}

한줄평

뭐지.. 난이도 올라가기 전까지 하루 2문제로 늘려야 하나..

알고리즘으로 바꿔서 풀까 생각을 해봤는데 실무에서 알고리즘의 비중은 생각보다 낮다고 해서 차라리 알고리즘에 투자하기 보다 문법이나 함수 사용을 더 익숙하게 하는 편이 나을 거 같음.

그래도 쉬우니깐 풀었음.

15 시저 암호


문제 설명

어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식을 시저 암호라고 합니다. 예를 들어 "AB"는 1만큼 밀면 "BC"가 되고, 3만큼 밀면 "DE"가 됩니다. "z"는 1만큼 밀면 "a"가 됩니다. 문자열 s와 거리 n을 입력받아 s를 n만큼 민 암호문을 만드는 함수, solution을 완성해 보세요.

제한 조건

  • 공백은 아무리 밀어도 공백입니다.
  • s는 알파벳 소문자, 대문자, 공백으로만 이루어져 있습니다.
  • s의 길이는 8000이하입니다.
  • n은 1 이상, 25이하인 자연수입니다.

입출력 예

snresult
"AB"1"BC"
"z"1"a"
"a B z"4"e F d"

문제 접근

아스키 코드를 사용해야 할 듯.

대문자가 65-90, 소문자가 97-122이니깐 이 범위를 넘어가면 다시 맨 앞으로 돌아가는 형태로 구현해주면 될 듯.

코드

class Solution {
    public String solution(String s, int n) {
        char[] arr = s.toCharArray();
        char ch;
        
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] == ' ') continue;
            if ((arr[i] <= 90 && arr[i] + n > 90) || (arr[i] <= 122 && arr[i] + n > 122)) arr[i] -= 26;
            arr[i] += n;
        }
        return new String(arr);
    }
}

처음에 90과 97 사이에 있으면 -26, 122 넘으면 -26하려고 했는데 대문자 상태에서 +8 이상을 해버리니깐 소문자 영역까지 들어가는 문제가 생겨서 &&와 ||를 사용해서 조건을 만들어줬음.

한줄평

오늘은 하루 더 풀어봐야겠음. 만약에 1레벨이 계속 이 난이도면 더 풀어야 할 것 같음.

16 약수의 합


문제 설명

정수 n을 입력받아 n의 약수를 모두 더한 값을 리턴하는 함수, solution을 완성해주세요.

제한 사항

  • n은 0 이상 3000이하인 정수입니다.

입출력 예

nreturn
1228
56

문제 접근

말 그대로 약수 구해서 다 더하면 될 거 같음.

대신 Math.sqrt()까지만 반복되도록 해서 시간 복잡도를 낮춰야 겠음.

코드

class Solution {
    public int solution(int n) {
        int answer = 0;
        for (int i = 1; i <= Math.sqrt(n); i++) {
            if (n % i != 0) continue;
            answer += i;
            
            if (n == 1) continue;
            if (i == Math.sqrt(n)) continue;
            else answer += n/i;
        }
        return answer;
    }
}

한줄평

n이 숫자가 적어서 그런지 다들 시간 복잡도 생각 안하고 코드 짠 것 같음.

한 문제만 더 풀어야지

17 이상한 문자 만들기


문제 설명

문자열 s는 한 개 이상의 단어로 구성되어 있습니다. 각 단어는 하나 이상의 공백문자로 구분되어 있습니다. 각 단어의 짝수번째 알파벳은 대문자로, 홀수번째 알파벳은 소문자로 바꾼 문자열을 리턴하는 함수, solution을 완성하세요.

제한 사항

  • 문자열 전체의 짝/홀수 인덱스가 아니라, 단어(공백을 기준)별로 짝/홀수 인덱스를 판단해야합니다.
  • 첫 번째 글자는 0번째 인덱스로 보아 짝수번째 알파벳으로 처리해야 합니다.

입출력 예

sreturn
"try hello world""TrY HeLlO WoRlD"

문제 접근

우선 단어 단위로 나눈다음에 인덱스가 짝수면 toUpperCase()하면 될 듯.

코드

class Solution {
  public String solution(String s) {
      String answer = "";
      int cnt = 0;
      String[] array = s.split("");
      
      for(String str : array) {
          cnt = str.contains(" ") ? 0 : cnt + 1;
          answer += cnt % 2 == 0 ? str.toLowerCase() : str.toUpperCase(); 
      }
      return answer;
  }
}

이건 다른 사람 코드 보고 했음.

split(””)을 쓰면 공백 하나하나를 배열에 저장해서 원본 복구시킬 때 같이 복구됨.

한줄평

오늘 3문제 풀었는데 점점 난이도 올라가는거 보니깐 걍 1문제씩 풀면 건강에 좋을 듯

18 자릿수 더하기


문제 설명

자연수 N이 주어지면, N의 각 자릿수의 합을 구해서 return 하는 solution 함수를 만들어 주세요. 예를들어 N = 123이면 1 + 2 + 3 = 6을 return 하면 됩니다.

제한사항

  • N의 범위 : 100,000,000 이하의 자연수

입출력 예

Nanswer
1236
98724

문제 접근

한 자리 씩 %10 해주면서 계산하면 될 듯?

코드

public class Solution {
    public int solution(int n) {
        int answer = 0;
        while (n > 0) {
            answer += n % 10;
            n /= 10;
        }
        return answer;
    }
}

한줄평

while에 true 쓰는 거 별로 좋은 선택은 아니라고 하는데 그러면 while을 쓸 이유가 한 1/2은 없어지는디..

19 자연수 뒤집어 배열로 만들기


문제 설명

자연수 n을 뒤집어 각 자리 숫자를 원소로 가지는 배열 형태로 리턴해주세요. 예를들어 n이 12345이면 [5,4,3,2,1]을 리턴합니다.

제한 조건

  • n은 10,000,000,000이하인 자연수입니다.

입출력 예

nreturn
12345[5,4,3,2,1]

문제 접근

우선 자연수를 split 사용해서 배열로 나눠준 다음에 거꾸로 뒤집으면 될 듯.

코드

class Solution {
    public int[] solution(long n) {
        String[] arr = Long.toString(n).split("");
        int length = arr.length;
        int[] answer = new int[length];
        
        for (int i = 0; i < length; i++) {
            answer[length - i - 1] = Integer.parseInt(arr[i]);
        }
        
        return answer;
    }
}

한줄평

StringBuilder에서 reverse를 사용하거나 %10을 사용하는 등 방법은 많은 듯.

확실히 Integer.parseInt 까지 사용하는게 많이 무거워보이긴 했음.

20 정수 내림차순으로 배치하기


문제 설명

함수 solution은 정수 n을 매개변수로 입력받습니다. n의 각 자릿수를 큰것부터 작은 순으로 정렬한 새로운 정수를 리턴해주세요. 예를들어 n이 118372면 873211을 리턴하면 됩니다.

제한 조건

  • n은 1이상 8000000000 이하인 자연수입니다.

입출력 예

nreturn
118372873211

문제 접근

이번에는 정렬이 필요해서 배열 변환이 꼭 필요할 것 같음.

배열로 변환해서 람다로 대충 내림차순 만들어주면 될 것 같음.

코드

import java.util.*;

class Solution {
    public long solution(long n) {
        long answer = 0;
        String[] arr = Long.toString(n).split("");
        Arrays.sort(arr, (e1, e2) -> {
            return Integer.parseInt(e2) - Integer.parseInt(e1);
        });
        return Long.parseLong(String.join("", arr));
    }
}

한줄평

다른 사람들은 StringBuilder 쓰거나 이런 식으로 한 줄로 끝내버림

public int reverseInt(int n){
	res = "";
	Integer.toString(n).chars().sorted().forEach(c -> res = Character.valueOf((char)c) + res);
	return Integer.parseInt(res);
}

✨ 후기

1) 문자열 너무 어렵다..

2) 가끔가면 함수 사용하는게 옳은 것인지, 아니면 알고리즘 풀이 능력을 키워야 하는지 잘 모르겠다. stream으로만 푸는 것도 썩 좋아보이진 않는데, 여러가지 풀이법을 작성해야 하나?

profile
뭐라도 하자

0개의 댓글