알고리즘 풀이 방법입니다.
문제(Problem) -> 생각(Think) -> 해결책(Solution) -> 리뷰(Review) 를 통해서 정리해서 작성합니다.
Problem📄

https://programmers.co.kr/learn/courses/30/lessons/12933

 

코딩테스트 연습 - 정수 내림차순으로 배치하기

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

programmers.co.kr


Think🤔

long값 n을 받으면 그 값을 거꾸로 뒤집는 것

StringBuilder의 reverse를 이용해도 되고, char[] 배열을 이용해도 된다.


Solution✍
import java.util.Arrays;

class Solution {
    public long solution(long n) {
        // 문자형으로 반환
        String str = String.valueOf(n);
        // Char 배열에 넣기 위해 배열 생성
        char[] ch = new char[str.length()];
        
        // 정답 answer
        String answerStr = "";
        
        for(int i=0; i<str.length(); i++){
            ch[i] = str.charAt(i);
        }
        
        Arrays.sort(ch);
        
        for(int i=str.length()-1; i>=0; i--){
            answerStr += ch[i];
        }
        long answer = Long.parseLong(answerStr);
        
        return answer;
    }
}

Review🤩
import java.util.Arrays;

class Solution {
    public long solution(long n) {
        String str = String.valueOf(n);
        char[] ch = str.toCharArray();
        Arrays.sort(ch);
        StringBuilder sb = new StringBuilder(new String(ch,0,ch.length));
        
        return Long.parseLong(sb.reverse().toString());
    }
}

2번째 있는 코드였는데, 한번 보고 직접 구현해보았다.

직접 구현해 볼때 sb 생성할때 StringBuilder() 안에 그냥 ch만 넣으면 안되고 new String을 이용해서 넣을 수 있다는 것을 알게 되었다.

 

궁금해서 String.class를 찾아본 결과

생성하는 부분을 찾을 수 있었다.


 

 

알고리즘 풀이 방법입니다.
문제(Problem) -> 생각(Think) -> 해결책(Solution) -> 리뷰(Review) 를 통해서 정리해서 작성합니다.
Problem📄

https://programmers.co.kr/learn/courses/30/lessons/12947

 

코딩테스트 연습 - 하샤드 수

양의 정수 x가 하샤드 수이려면 x의 자릿수의 합으로 x가 나누어져야 합니다. 예를 들어 18의 자릿수 합은 1+8=9이고, 18은 9로 나누어 떨어지므로 18은 하샤드 수입니다. 자연수 x를 입력받아 x가 하

programmers.co.kr

13의 모든 자릿수의 합은 4, 13은 4로 나누어 떨어지지 않으므로 13은 하샤드 수가 아닙니다.


Think🤔

하샤드 수?라는 것은

자릿수의 합이 9이고 원래의 값을 자릿수 합으로 나눴을때 나누어 떨어지면 하샤드 수가 되므로

true를 반환시키면 된다.

 

각 자릿수의 합을 구하고, 나눠 떨어지면 true를 반환하게 하면 된다.


Solution✍
class Solution {
    public boolean solution(int x) {
        
        // String으로 변환
        String str = x+"";
        
        // 자릿수 합
        int hab=0;
        
        // x값 변환 안되게 tmp 사용
        int tmp = x;
        
        // 자릿수 hab에 누적해서 더해줌
        while(tmp > 0){
            hab += tmp%10;
            tmp = tmp/10;
        }
        
        // 나눴을때 나머지가 없으면 true를 리턴
        if(x % hab == 0){
            return true;
        }
        
        return false;
    }
}
class Solution {
    public boolean solution(int x) {
        
        String []str = String.valueOf(x).split("");
        
        int hab = 0;
        for(int i=0; i<str.length; i++){
            hab += Integer.parseInt(str[i]);
        }
        
        if(x % hab == 0){
            return true;
        }
        
        return false;
    }
}

Review🤩

split 키워드를 보고 바로 이전으로 돌아와서 split로 짜는 방법을 생각해봤다!


 

알고리즘 풀이 방법입니다.
문제(Problem) -> 생각(Think) -> 해결책(Solution) -> 리뷰(Review) 를 통해서 정리해서 작성합니다.
Problem📄

https://programmers.co.kr/learn/courses/30/lessons/12948

 

코딩테스트 연습 - 핸드폰 번호 가리기

프로그래머스 모바일은 개인정보 보호를 위해 고지서를 보낼 때 고객들의 전화번호의 일부를 가립니다. 전화번호가 문자열 phone_number로 주어졌을 때, 전화번호의 뒷 4자리를 제외한 나머지 숫자

programmers.co.kr


Think🤔

맨 마지막 4자리를 제외한 나머지는 *으로 보이게 만들면 된다.

문자열의 길이만큼 반복문을 돌리고 만약 끝에서 4번째가 되면 숫자가 보이게 한다.

 

substring을 이용해서 풀 수 있다.


Solution✍
class Solution {
    public String solution(String phone) {
        String answer = "";
        for(int i=0; i<phone.length(); i++){
            if(4 >= phone.length()-i){
                answer += phone.charAt(i);
            }else{
                answer += "*";
            }
        }
        return answer;
    }
}

 

String.toCharArray()

문자열을 한 글자씩 쪼개서 char타입에 넣어주는 메소드

다시 합쳐서 문자열을 만들 수 있음.

 

이 방법으로도 풀어본다.

class Solution {
    public String solution(String phone) {
        
        char[] ch = phone.toCharArray();
        
        for(int i=0; i<phone.length()-4; i++){
            ch[i] = '*';
        }
        
        return String.valueOf(ch);
    }
}

 

substring

substring은 두 가지 방법이 있고,

첫 번째는 인자값을 하나만 받는 함수

인자값은 int 형으로 substring 하고자 하는 문자열의 앞에서 부터 몇번째 위치인가를 지정하는 값.

index 위치하여 그 이후의 모든 문자열을 리턴

class Solution {
    public String solution(String phone) {
        String answer = "";
        
        for(int i=0; i<phone.length()-4; i++){
            answer += "*";
        }
        
        answer += phone.substring(phone.length()-4);
        
        return answer;
    }
}

마지막 4자리 전까지 "*"로 출력하고 나머지는 phone에 있는 마지막 4개를 substring으로 잘라서 가져오면 된다.


Review🤩
return ch+"";

이렇게 리턴할 경우 ch값이 하나이면 String으로 변환되지만 지금 같은 경우 에러가 발생한다.


 

알고리즘 풀이 방법입니다.
문제(Problem) -> 생각(Think) -> 해결책(Solution) -> 리뷰(Review) 를 통해서 정리해서 작성합니다.
Problem📄

https://programmers.co.kr/learn/courses/30/lessons/12954

 

코딩테스트 연습 - x만큼 간격이 있는 n개의 숫자

함수 solution은 정수 x와 자연수 n을 입력 받아, x부터 시작해 x씩 증가하는 숫자를 n개 지니는 리스트를 리턴해야 합니다. 다음 제한 조건을 보고, 조건을 만족하는 함수, solution을 완성해주세요.

programmers.co.kr


Think🤔

파라미터로 int x,n값을 받고

x를 누적해서 n만큼 더해주는 값을 차례대로 answer 배열에 long타입 형태로 넣어주면 되는 문제

class Solution {
    public long[] solution(int x, int n) {
        long[] answer = new long[n];
        int tmp = x;
        for(int i=0; i<n; i++){
            answer[i] = x;
            x = x + tmp;
        }
        return answer;
    }
}

이렇게 하니 두 개의 테스트 케이스를 통과하지 못한다.

x의 범위도 int값 안에 있어서 딱히 for문 안에 있는 int가 문제는 아닌 것 같다.

class Solution {
    public long[] solution(int x, int n) {
        long[] answer = new long[n];
        int tmp = x;
        for(int i=0; i<n; i++){
            answer[i] = x;
            x = tmp * (i+2);
        }
        return answer;
    }
}

마찬가지로 이 방법도 실패했다..

n은 1000 이하인 자연수라고 했는데

0이 들어올때를 생각해보자

n이 0이면 0을 보내줘야 한다.. 혹시 이 부분 떄문에 안되는 걸까?

 

파라미터로 long 타입으로 받은 값이 알고보니 범위를 넘어가는 것 같다.

만약 x가 최댓값인 10,000,000 이고, n이 1000이하인 자연수이니 1000이라고 가정하면

1,000 * 10,000,000 = 10,000,000,000 이므로 마지막 부분에서 int 범위를 넘어가게 된다.

 

고로 다른 방법을 이용해서 풀어야 되거나 아니면 파라미터 값을 int형인 long타입으로 바꾸면 된다.


Solution✍

 

class Solution {
    public long[] solution(int x, int n) {
        long[] answer = new long[n];
        long sum = 0;
        for(int i=0; i<n; i++){
            sum = (long)x * (i+1);
            answer[i] = sum;
        }
        return answer;
    }
}

x 를 명시적 형변환 (long)으로 바꿧더니 해결 되었다.

 

class Solution {
    public long[] solution(int x, int n) {
        long[] answer = new long[n];
        answer[0] = x;
        for(int i=1; i<n; i++){
            answer[i] = answer[i-1] +x;
        }
        return answer;
    }
}

처음 배열 값에 x를 넣고 전의 배열 값에 x를 추가시켜줌으로 해결


Review🤩

타입의 중요성을 다시 한번 느꼇고, 이런 디테일한 부분에서 예외가 발생한 줄은 몰랐다.


 

알고리즘 풀이 방법입니다.
문제(Problem) -> 생각(Think) -> 해결책(Solution) -> 리뷰(Review) 를 통해서 정리해서 작성합니다.
Problem📄

https://programmers.co.kr/learn/courses/30/lessons/12932

 

코딩테스트 연습 - 자연수 뒤집어 배열로 만들기

자연수 n을 뒤집어 각 자리 숫자를 원소로 가지는 배열 형태로 리턴해주세요. 예를들어 n이 12345이면 [5,4,3,2,1]을 리턴합니다. 제한 조건 n은 10,000,000,000이하인 자연수입니다. 입출력 예 n return 12345

programmers.co.kr


Think🤔

12345를 넣으면 그대로 뒤집어서 마지막 부터 넣어주는 것

Long 값으로 n을 받는다

그럼 이것을 스트링으로 바꿔서 뒤집은 다음 다시 long형태로 바꿔줄 수 있다.

 

split로 쪼개서 String배열을 만들어서 넣어줄 수 있다.

 

long의 값을 이용해서 일의 자리를(제일 오른쪽값) 바로 int[]에 넣을 수 있다.


Solution✍
import java.util.Arrays;

class Solution {
    public int[] solution(long n) {
        String tmp = Long.toString(n);
        
        int[] answer = new int[tmp.length()];
        
        int count=0;
        for(int i=tmp.length()-1; i>=0; i--){
            answer[count] = Character.getNumericValue(tmp.charAt(i));
            count++;
        }
        
        return answer;
    }
}

1. 롱 타입의 n을 String 타입으로 바꿔준다.

2. 반환하기 위한 answer을 tmp의 글자수와 똑같이 만든다.

3. 마지막에 있는 charAt을 int형으로 바꾼다.

 

Character.getNumericValue(tmp.charAt(i));

- 숫자형태의 char을 int형으로 반환 시키는 메서드이다.

 

import java.util.Arrays;
import java.util.Collections;

class Solution {
    public int[] solution(long n) {
        String s = String.valueOf(n);
        StringBuilder sb = new StringBuilder(s);
        
        // sb 거꾸로
        // sb = sb.reverse();
        sb.reverse();
        
        int[] answer = new int[sb.length()];
        
        String[] sbStr = sb.toString().split("");
        
        for(int i=0; i<sb.length(); i++){
            answer[i] = Integer.parseInt(sbStr[i]);
        }
        
        
        return answer;
    }
}

1. s(String) 에 n(문자열로 치환)을 넣는다.

2. StringBuilder(싱글 스레드에 사용 지금 메인 하나이니 싱글 스레드임) 객체 생성

3. reverse() 메소드를 이용해 sb문자열 거꾸로

4. 정수 배열 answer 생성 sb 글자수 만큼

5. sbStr(String[]) sb를 쪼개서 배열에 넣어줌

6. 쪼갠 String값 int형으로 바꿔서 answer에 담아서 넣어줌

 

String[] split(String regex)

- split 함수는 입력받은 정규 표현식 또는 특정 문자를 기준으로 문자열을 나누어 배열(Array)에 저장 하는 것

 

전화번호 예제

String str = "010-1234-5678";
String[] phone = str.split("-");

하면 String phone에는 ["010","1234","5678"] 이 들어가게 된다.

 

class Solution {
    public int[] solution(long n) {
        String tmp = n+"";
        
        int[] answer = new int[tmp.length()];
        
        int count = 0;
        while(n > 0){
            answer[count] = (int)(n % 10);
            n = n / 10;
            count++;
        }
        
        return answer;
    }
}

1. 문자열 추가로 String형으로 변환

2. answer 배열 길이 String 길이

3. while문을 이용해 나머지 값 넣어주기

4. 10으로 나누면서 끝 자릿수 출력

 

(int)n % 10

을 헀는데 실패가 한 3개 나왔던 것 같다.

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

라는 조건 때문에 아마도 n의 값이 int형 범위에서 벗어난 것 아닐까? 근데 10으로 나누면 제일 큰값이 들어와도 나뉘면 값이 맞게 들어간다.

반례를 찾아야 증명이 가능하다.

먼저 (int)n이 시작되면 10,000,000,000 값이 들어와있을때 int 범위인 2,147,483,647이 되어버리고 거기서 % 10을 하기 때문에 값이 다르게 나온다.!!


Review🤩

다양한 방법으로 풀어보았고, int 와 long의 차이점 값의 범위에 대해서 알게 되었고,

StringBuilder에 대해서 다시 복습했다.

그리고 몰랐던 숫자형태의 char를 int형으로 반환 시키는 메서드도 알게 되었고, 또 split에 대해서 복습했다.


알고리즘 풀이 방법입니다.
문제(Problem) -> 생각(Think) -> 해결책(Solution) -> 리뷰(Review) 를 통해서 정리해서 작성합니다.
Problem📄

https://programmers.co.kr/learn/courses/30/lessons/12935

 

코딩테스트 연습 - 제일 작은 수 제거하기

정수를 저장한 배열, arr 에서 가장 작은 수를 제거한 배열을 리턴하는 함수, solution을 완성해주세요. 단, 리턴하려는 배열이 빈 배열인 경우엔 배열에 -1을 채워 리턴하세요. 예를들어 arr이 [4,3,2,1

programmers.co.kr


Think🤔

가지고 있는 배열 중에서 제일 작은 배열을 빼고, 만약에 뺄 때 length가 1이면 -1을 배열에 담아서 리턴해준다.

가장 작은 배열을 찾을 수 있는 방법은 Math.min으로 비교해서 제일 작은 값을 찾던가, 또는

ArrayList에 담아서 sort 정렬을 하고 제일 마지막 값을 뺴도 된다.

 

Math.min으로 비교하고, 그다음 배열을 옮겨주는 과정에서 제일 작은 값을 비교해서 answer에 넣어준다.


Solution✍
import java.util.*;

class Solution {
    public int[] solution(int[] arr) {
        // 빈 배열인 경우 -1 리턴
        if(arr.length <= 1){
            int[] answer = {-1};
            return answer;
        }
        
        //하나 뺀 값의 크기
        int[] answer = new int[arr.length-1];
        
        // 제일 작은 수 if문으로도 가능
        int small = arr[0];
        for(int i=0; i<arr.length; i++){
            small = Math.min(small,arr[i]);
        }
        
        // count로 answer은 차례차례 넣어준다
        int count = 0;
        for(int i=0; i<arr.length; i++){
            if(arr[i] == small){
                continue;
            }else{
                answer[count++] = arr[i];
            }
        }
        
        return answer;
    }
}

int count = 0;을 쓰는 이유는

answer[i] = arr[i]를 하게 되면 continue해서 넘어간 배열부분이 있는데

그러면 만약에 중간에 [10,9,8,  ,12,13] 제일 작은 값이 들어가면 이 부분을 그냥 넘어가기 때문이다.

count++;를 뒤에다 적어줘도 상관은 없다.

import java.util.*;

class Solution {
    public int[] solution(int[] arr) {
        
        if(arr.length <= 1){
            int[] answer = {-1};
            return answer;
        }
        
        int[] answer = new int[arr.length-1];
        
        int small = arr[0];
        for(int i=0; i<arr.length; i++){
            if(arr[i] <= small){
                small = arr[i];
            }
        }
        
        int count = 0;
        for(int i=0; i<arr.length; i++){
            if(arr[i] == small){
                continue;
            }else{
                answer[count] = arr[i];
                count++;
            }
        }
        
        return answer;
    }
}

count++를 따로 두고, Math.min말고 if문 이용


Review🤩
if (arr.length <= 1) 
	return new int[]{ -1 };

if문을 answer에 안담고 return에서 생성과 동시에 보내는 다른 사람의 풀이도 보고 신기했다.

stream으로 한 줄로 짜는 사람도 있는데 스트림은 넘 어려워서 -ㅅ-;;


 

+ Recent posts