본문 바로가기

코딩테스트

[JAVA] 일반 수학 1단계

2745 진법 변환

진법 변환 방법 참고

[수학] 진법 변환 방법 정리 + 소수점 (2진수, 8진수, 10진수, 16진수) (tistory.com)

 

[수학] 진법 변환 방법 정리 + 소수점 (2진수, 8진수, 10진수, 16진수)

진법이란? 진법이란 수를 표기하는 기수법의 하나로 몇 개의 기본 숫자를 이용하여 수를 표시하는 방법입니다. 자리값이 올라감에 따라서 수가 일정하게 커지는 규칙을 이용하고 수를 표시합니

coding-factory.tistory.com

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.io.IOException;
//import java.io.BufferedWriter;
//import java.io.OutputStreamWriter;

import java.util.Arrays;


public class Main {
  public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    String num="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    char[] arr = num.toCharArray();

    StringTokenizer st = new StringTokenizer (br.readLine(), " ");
    String s =st.nextToken();
    int a = Integer.parseInt(st.nextToken());

    int tmp=1;
    int sum=0;

    for (int i=s.length()-1;i>=0;i--){
      char c = s.charAt(i);

      for (int j=0;j<arr.length;j++){
        if (c==arr[j]){
          sum += j*tmp;
        }
      }
      tmp *= a;
    }

    System.out.println(sum);
  }
}

문자의 숫자 치환은 num 인덱스를 이용한다.

또한 자바는 거듭제곱 계산을 위해 Math.pow(제곱수, 지수)를 이용해야 하는데 위와 같이 따로 지수 tmp를 선언했다.

코드의 단점....num 배열을 계속 반복해서 좀 오래걸린다.

더 빠르게 하고 싶다면 그냥 if문으로 문자와 숫자를 구별한 뒤 적당히 아스키코드에서 값을 뺴자. (아마 -55)

 


11005 진법 변환2

 

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.io.IOException;
//import java.io.BufferedWriter;
//import java.io.OutputStreamWriter;


public class Main {
  public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    String num="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    char[] arr = num.toCharArray();

    StringTokenizer st = new StringTokenizer (br.readLine(), " ");
    int a = Integer.parseInt(st.nextToken());
    int b = Integer.parseInt(st.nextToken());

    String s = "";

    while(a!=0){
      int k = a%b;
      a/=b;
      s=s+ arr[k];
    }

    String str = new StringBuilder(s).reverse().toString();
    System.out.println(str);
  }
}

수학 어렵다...ㅜ

마찬가지로 StringBuilder()의 reverse() 메서드를 이용했다.

 


2720 세탁소 사장 동혁

문제 자체가 어렵지는 않았는데 Double형에서 Int형으로 바꾸는 등 형변환에서 에러가 좀 있었다.

JAVA는 몫연산자를 따로 지원하지 않는다. 대신 Int형 변수에 저장하면 자동으로 나머지는 버려진다.

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.io.IOException;
import java.io.BufferedWriter;
import java.io.OutputStreamWriter;


public class Main {
  public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    int t = Integer.parseInt(br.readLine());  //테스트 케이스 개수
    int quarter = 25;  //쿼터 0.25$
    int dime = 10;  //다임 0.10$
    int nickel = 5;  //니켈 0.05$
    int penny = 1;  //페니 0.01$
    StringBuilder sb = new StringBuilder();
    
    for (int i = 0; i < t; i++) {
        int c = Integer.parseInt(br.readLine());
        sb.append(c / quarter + " ");
        c %= quarter;
        sb.append(c / dime + " ");
        c %= dime;
        sb.append(c / nickel + " ");
        c %= nickel;
        sb.append(c / penny + "\n");
    }
    System.out.print(sb);
  }
}

Double형을 쓰지 않고 그냥 Int형을 이용해서 계산했다. 

자릿수만 적당히 맞추면 나머지랑 몫은 같으니...이게 더 쉬운 방식인것 같다.

 

헉...Double과 double 형은 다르다.

Double은 객체이고 null 초기화 및 사용이 가능하고, 산술연산이 안된다.

double은 기본 데이터 유형으로 산술연산이 가능하고 null 사용이 안된다.

https://smin1620.tistory.com/287

 

[Java] int와 Integer는 뭐가 다를까?

최근에 자바를 공부하고 있는데, 공부하면서 이상한 점을 발견했다. 파이썬에서는 고민조차 안했던 건데;;; int와 Integer는 대체 무슨 차이일까? 자바 코드 아키텍처도 살짝 다르게 작성하던데 왜

smin1620.tistory.com

위를 참고하면 더 쉽게 이해가 가능하다.

UnBoxing : Wrapper class -> 기본 타입

Boxing : 기본 타입 -> Wrapper class

또한 Wrapper class는 값을 비교하는 것이 아닌 주소값을 비교하므로 ==가 아닌 wquals를 사용한다.


2903 중앙 이동 알고리즘

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.io.IOException;
//import java.io.BufferedWriter;
//import java.io.OutputStreamWriter;


public class Main {
  public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    int a = Integer.parseInt(br.readLine());  //테스트 케이스 개수
    int b=2;

    for (int i=0;i<a;i++){
      b=b*2-1;
    }

    System.out.println(b*b);
  }
}

위와 같은...저런 규칙이 있다고 한다.

규칙만 찾으면 쉬운데 규칙 찾기가 너무 어려움

 


2292 벌집

 

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.io.IOException;
//import java.io.BufferedWriter;
//import java.io.OutputStreamWriter;


public class Main {
  public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    int a = Integer.parseInt(br.readLine()); 
    int b=1; //지나가는 방 개수
    int d=1;
    
    if (a==1)
      System.out.println(b);
    else{
      while(d<a){
        b+=1;
        d+=6*(b-1);
      }
      System.out.println(b);
    }
  }
}

 


1193 분수찾기

대각선 1(1/1)

대각선 2(1/2, 2/1)

대각선 3(3/1, 2/2, 1/3) ...이런식으로 볼 때, 

n번째 대각선에서 n이 홀수이면 대각선 칸의 개수는 홀수이고, 왼쪽 아래에서 오른쪽 위 방향으로 향한다.

반대로 n이 짝수이면 대각선 칸의 개수는 짝수이고, 오른쪽 위에서 왼쪽 아래 방향으로 향한다.

 

또한 같은 대각선 내 분자, 분모의 합을 T라고 할때 같은 n번대각선의 T값은 일정하고

T값이 짝수일때 대각선 칸의 개수는 홀수이고, 왼쪽 아래에서 오른쪽 위 방향으로 향한다. 반대도 마찬가지임.

 

만약 T가 짝수이면

분자 = 현재 대각선의 개수 - (입력받은 X - 직전 대각선 까지칸의 누적합 개수 -1)

분모 = 입력받은 X - 직전 대각선 까지칸의 누적합 개수

가 된다.

홀수 일때는 반대.

현재 대각선 판단은  X <= 직전 대각선 누적합 + 현재 대각선 개수로 한다.

 

예를 들어, X=14라고 할때

14 <= 1+2+3+4+5 이므로 5번째 대각선(현재 대각선 개수는 5)에 위치한 분수를 출력하는 것이다.

또한 분모 = 5 -(14 - (1+2+3+4) -1) = 2, 분자 = 14 - (1+2+3+4) = 4가 된다.

 

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.io.IOException;
//import java.io.BufferedWriter;
//import java.io.OutputStreamWriter;


public class Main {

  public static void main(String[] args) throws IOException {

    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    int X = Integer.parseInt(br.readLine());

    int cross_count = 1, prev_count_sum = 0;

    while (true) {
      // 직전 대각선 누적합 + 해당 대각선 개수 이용한 범위 판별
      if (X <= prev_count_sum + cross_count) {	

        if (cross_count % 2 == 1) {	// 대각선의 개수가 홀수라면 
          // 분자가 큰 수부터 시작
          // 분자는 대각선상 블럭의 개수 - (X 번째 - 직전 대각선까지의 블럭 개수 - 1) 
          // 분모는 X 번째 - 직전 대각선까지의 블럭 개수
          System.out.print((cross_count - (X - prev_count_sum - 1)) + "/" + (X - prev_count_sum));
          break;
        } 

        else {	// 대각선의 개수가 짝수라면 
          // 홀수일 때의 출력을 반대로 
          System.out.print((X - prev_count_sum) + "/" + (cross_count - (X - prev_count_sum - 1)));
          break;
        }

      } else {
        prev_count_sum += cross_count;
        cross_count++;
      }
    }
  }
}

너무 어려워...🥲

다들 규칙은 쉽고 코드가 어렵다는데 난 규칙부터 어려워서 슬펐다..

 


2869 달팽이는 올라가고 싶다

 

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.io.IOException;
import java.io.BufferedWriter;
import java.io.OutputStreamWriter;


public class Main {
  public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    StringTokenizer st =  new StringTokenizer(br.readLine(), " ");
    int a = Integer.parseInt(st.nextToken()); //낮에 올라가는 m
    int b = Integer.parseInt(st.nextToken()); //밤에 내려가는 m
    int v = Integer.parseInt(st.nextToken()); //우물의 m

    v=v-b; // 최소한의 날짜를 구하기 위해 down 빼주기
    int day = v/(a-b);

    if (v%(a-b) != 0) { //나머지가 있으면 m가 약간 남은 것이므로 +1
      day++;
    }

    System.out.println(day);
  }
}

옛날에 메이플스토리 만화책에서 나왔던 문제...아직까지 기억난다.

 


# 회고

 

수학 싫다....너무 어렵다...

하기싫다 2단계도 남았나봐

 

이번에는 특히 Wrapper class와 기본자료형의 차이를 중요하게 배웠다.

'코딩테스트' 카테고리의 다른 글

[JAVA] 기하: 직사각형과 삼각형  (1) 2024.01.23
[JAVA] 약수, 배수와 소수  (0) 2024.01.22
[JAVA] 2차원 배열  (0) 2024.01.18
[JAVA] 심화 1  (0) 2024.01.17
[JAVA] 문자열  (0) 2024.01.16