2745 진법 변환
진법 변환 방법 참고
[수학] 진법 변환 방법 정리 + 소수점 (2진수, 8진수, 10진수, 16진수) (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
위를 참고하면 더 쉽게 이해가 가능하다.
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 |