enoch012 / JavaBasicStudy

Java 기초 스터디 (2023.09 ~ 10)
0 stars 1 forks source link

11월 5일 / 코딩테스트 연습(jaeyeon) #34

Open jaeyyyyy opened 1 year ago

jaeyyyyy commented 1 year ago

문제 1

문제

입출력 예

x return
10 true
12 true
11 false
13 false

입출력 예 1

입출력 예 2

입출력 예 3

입출력 예 4

문제 풀이

자릿수 구하는 방법은 보통 두 가지로 나뉜다. 하나는 문자열로 바꿔서 구하는 방법이고, 나는.. 형 변환하기 싫어서 아래처럼 했다.

int n = 12345;
ArrayList<Integer> arrNum = new ArrayList<>();
while(n > 0) {
    arrNum.add(n % 10);
    n /= 10;
}
System.out.println(arrNum); // [5, 4, 3, 2, 1]

숫자를 반복해서 10으로 나눠가면서, 10으로 나머지 연산을 하면 일의 자리를 얻어낼 수 있다. 문제 푸는 데 쓰일 일이 많은데 잘.. 안 외워짐.

class Solution {
    public boolean solution(int x) {   
        int x2 = x; // 정수 x
        int sum = 0; // 자릿수의 합
        while(x > 0) {
            sum += x % 10;
            x /= 10;
        }

        return x2 % sum == 0;
    }
}

회고

문자열로 바꾸는 방법으로도 풀어봤다.

class Solution {
    public boolean solution(int x) {
        String[] number = String.valueOf(x).split("");
        int sum = 0;

        for (int i =0; i < number.length; i++) {
            sum += Integer.valueOf(number[i]);
        }
        return x % sum == 0;
    }
}
jaeyyyyy commented 1 year ago

문제 2

문제

입출력 예

a b return
3 5 12
3 3 3
5 3 12

문제 풀이

import java.util.*;

class Solution {
    public long solution(int a, int b) {
        long answer = 0;
        int[] number = {a,b};
        Arrays.sort(number);
        for(int i = number[0]; i <= number[1]; i++){
            answer += i;
        }
        return answer;
    }
}

arrays.sort를 왜 썼을까요..저도 모르겠습니다. 순서대로 정렬해야된다는 생각에 그만... 다양한 수를 정렬해야한다면 모를까 두 개 밖에 안되는데 if(a<b) 로 조건을 거는게 더 보기편했을거라는 생각이 듭니다..

회고

간단한 문제인데 기록한 이유는 다른 사람의 코드를 보다가 for 문 안에 삼항연산자를 넣은 경우도 있어서이다. 정리해두면 도움이 될 것 같다.

10월 29일 / 문제 3 에서 for 문의 조건문에 i에 대한 조건문이 아닌 다른 조건문을 넣을 수도 있다는 점을 기록했다. 10월 29일 / 문제 1 에서 배열 선언 시, 배열의 길이에 삼항연산자를 넣을 수 있다는 점을 기록했다.

두 가지를 합친 느낌이다. 삼항연산자는 생각보다 훨씬 다양한 곳에서 이용 가능하고, for문도 다양하게 표현 가능하다는 것을 알게 됐다.

class Solution {
  public long solution(int a, int b) {
      long answer = 0;
      for (int i = ((a < b) ? a : b); i <= ((a < b) ? b : a); i++) 
              // 'a<b'가 참이면 i=a, 거짓이면 i=b, 'a<b'가 참이면 i<=b, 거짓이면 i<=a 
          answer += i;

      return answer;
  }
}

아래처럼 for 문안에 메서드를 사용할 수도 있다.

class Solution {
  public long solution(int a, int b) {
      long answer = 0;
      for (int i = Math.min(a, b) ; i <= Math.max(a, b); i++) {
          answer += i;
      }

      return answer;
  }
}
jaeyyyyy commented 1 year ago

문제 3

문제

1-1. 입력된 수가 짝수라면 2로 나눕니다. 1-2. 입력된 수가 홀수라면 3을 곱하고 1을 더합니다.

  1. 결과로 나온 수에 같은 작업을 1이 될 때까지 반복합니다.

예를 들어, 주어진 수가 6이라면 6 → 3 → 10 → 5 → 16 → 8 → 4 → 2 → 1 이 되어 총 8번 만에 1이 됩니다. 위 작업을 몇 번이나 반복해야 하는지 반환하는 함수, solution을 완성해 주세요. 단, 주어진 수가 1인 경우에는 0을, 작업을 500번 반복할 때까지 1이 되지 않는다면 –1을 반환해 주세요.

입출력 예

n result
6 8
16 4
626331 -1

입출력 예 1

입출력 예 2

입출력 예 3

문제 풀이

while(i<500)인 동안 주어진 수가 1일 때, 짝수일 때, 홀수일 때를 조건문으로 나누어 작성하면 된다.

class Solution {
    public int solution(int num) {

        int i = 0;
        while (i < 500) {
            if(num == 1){ // 주어진 수가 1이 되면
                return i;
            } else if(num % 2 == 0) { // 주어진 수가 짝수면
                num /= 2;
            } else {
                num = (num * 3) + 1; // 주어진 수가 홀수면
            }
            i++;
        }

        return -1;
    }
}

이렇게 작성하면 되는데 테스트 케이스 3번은 틀리게 된다. 왜 그럴까? 테스트 3번은 626331를 num값으로 준다. 626331은 계산과정에서 500번을 시도해도 1이 되지 못하고 int의 범위를 넘기게 된다. (※ int의 범위는 -2,147,483,648 부터 2,147,483,647 까지이다.)

이 문제를 해결하려면

  1. num을 long num이라고 넣어주거나,
  2. 새로운 변수를 선언하고 num 값을 넣어주어야 한다. (long a = num;)

    
    class Solution {
    public int solution(int num) {
        long num2 = num;
        int i = 0;
        while (i < 500) {
            if(num2 == 1){ // 주어진 수가 1이 되면
                return i;
            } else if(num2 % 2 == 0) { // 주어진 수가 짝수면
                num2 /= 2;
            } else {
                num2 = (num2 * 3) + 1; // 주어진 수가 홀수면
            }
            i++;
        }
    
        return -1;
    }
    }


## 회고
int와 long 의 최대값, 최소값에 대해 잘 알고 있어야 풀리는 문제였다. 문제를 풀다보면 int 범위를 벗어나는 값을 많이 만나게 될 것 같다. 그때마다 자료형에 유의하며 문제를 풀어야겠다.