문제

 

생각한 방법 / 수도코드

s번째까지만 my_string을 출력한다.

overwrite_string을 출력한다.

s번째부터 나머지 my_string을 출력한다.

 

이 때 출력이 아니라 solution 함수를 작성하는 것이므로, 

return 값으로 답이 나와야한다.

 

String의 concat을 사용해서 기존 answer에 각각 글자를 갖다 붙인다.

 

완성된 코드

package bj_project;

import java.util.Scanner;

public class day0414 {
	public static void main(String[] args) {
		
	String answer = Solution.solution("Program29b8UYP", "merS123", 7 );
	System.out.println(answer);	
	}

}
class Solution {
	public static String solution (String my_string, String overwrite_string, int s) {
		String answer = "";
		
		for (int i = 0 ; i < s ; i ++) {
			answer = answer.concat(String.valueOf(my_string.charAt(i)));
		}
		answer = answer.concat(overwrite_string);
		for (int i = s + overwrite_string.length(); i < my_string.length(); i++) {
			answer = answer.concat(String.valueOf(my_string.charAt(i)));
		}
		return answer;
		
	}
	
}

결론 / 알게된 점

1. 메인클래스에서 Solution.solution()으로 쓰려면 class Solution 내의 solution 함수가 static이어야 한다.

static(정적) 메서드는  클래스이름으로 직접 호출이 가능하다. 

static을 사용하지 않으면 인스턴스 메서드가 되는데, 이 경우에는 new 로 객체를 생성한 다음에 호출해야한다.

그래서 static으로 선언해주었다.

 

2. String은 불변객체이기 때문에 concat()은 결합한 결과를 리턴할 뿐, answer 자체를 바꾸지 않는다고 한다.

그러므로 기존의 answer에 리턴값을 저장 해주어야한다.

이 부분 수정하였다. 


 

'알고리즘(백준)' 카테고리의 다른 글

1월 17일: 백준 20361번(JAVA)  (2) 2025.01.18
1월 16일 : 백준 25191번(JAVA)  (1) 2025.01.16
1월 13일: 백준 11098번(JAVA)  (4) 2025.01.13
1월 12일: 백준 27434번(JAVA-> PYTHON)  (1) 2025.01.12
1월 12일: 백준 11365번  (1) 2025.01.12

https://www.acmicpc.net/problem/20361

한 번 틀렸었던 문제

 

틀렸을때 코드는 arr.add를 사용했는데, 이 코드는 알고보니 해당 index번호에 배열하나를 추가해버리는 코드였던 것이다!!

그래서 아래와 같이 수정완료:)

package bjquiz;
import java.util.ArrayList;
import java.util.Scanner;
	public class day0115 {
		public static void main(String[] args) {
			Scanner sc = new Scanner(System.in);
            int N = sc.nextInt(); //전체 컵의 숫자
            int X = sc.nextInt(); //공이 든 번호
            int K = sc.nextInt(); //바꾸는 횟수
            ArrayList<Integer> arr = new ArrayList<Integer>(N);
            for(int i=0; i<N; i++) {
            arr.add(i, 0); } //모든 컵에 0을 다 입력해두고
            arr.set(X-1, 1); //X에 해당하는 컵에는 1을 입력한다
            for(int i=1; i<=K; i++) { //하나씩 바꾼다
            int a = sc.nextInt();
            int b = sc.nextInt();
            int temp=arr.get(a-1);
            arr.set(a-1, arr.get(b-1));
            arr.set(b-1, temp); }
			System.out.println(arr.indexOf(1)+1); 
           } 
    }

 

 

결론

ArrayList를 쓸 때 index 자리에 해당하는 값을 삽입하려면 arr.set을 써야한다. (arr.add아님!)

두 수의 자리를 바꿀 때 순서 주의하기

A를 temp에 넣고, B를 A에 넣고, temp를 B에 넣어야한다! 잘 확인하자!


배고픈데 치킨이 왠말 ㅠㅠ

 

엄청 간단하게 풀렸다.

package bjquiz;

 

import java.math.BigInteger;

import java.util.Scanner;

 

public class day0116 {

public static void main(String[] args) {

 

Scanner sc = new Scanner(System.in);

int N = sc.nextInt(); //치킨의 개수

int A = sc.nextInt(); //콜라의 개수

int B = sc.nextInt(); //맥주의 개수

 

int eat, drink;

 

drink = A/2 + B;

 

if (N>drink) {

eat = drink;

}else {

eat = N;

}

 

System.out.println(eat);

}

}


나 이틀이나 안풀고뭐햇지?ㅠㅠ

자바로 어떻게 풀지 고민했었던 문제.

최근 들어서 ArrayList에 MemberDTO형식을 넣는 것을 드디어 이해했기 때문에 이번에도 이 방법을 써보려고 했다.

 

10의 9승까지 입력해야하므로 int대신 long을 사용. 10의 9승은 백만이고, long은 백만을 충분히 커버가능하다.

 

처음에는 HashMap을 사용해서 연봉과 선수이름을 쌍으로 넣어주고, 그 묶음들을 순서대로 ArrayList에 저장한 후

for반복문을 돌려가며 가장 높은 연봉을 가진 List번호의 선수이름값을 String expensive로 뽑아와서 저장하려고 했다.

그러다가 HashMap은 순서가 보장되지 않으므로 순차가 보장되는 TreeMap을 쓰게 되었고...

놀랍게도 TreeMap의 메소드 중에 lastKey()라는 놀라운 기능을 발견 ㅋㅋㅋ

그래서 저번에 고민했던 것과는 다르게 쉽게 마무리되었다.

 

완성된 코드는 아래와 같다.

 

package bjquiz2025;

 

import java.util.Scanner;

import java.util.TreeMap;

 

public class day0113 {

public static void main(String[] args) {

Scanner sc = new Scanner (System.in);

 

 

int times = sc.nextInt();

for (int i =0; i<times; i++) {

int N = sc.nextInt();

TreeMap<Long, String> map = new TreeMap<Long, String>();

for(int j=0; j<N; j++) {

long wage = sc.nextLong();

String name = sc.next();

map.put(wage, name); //연봉과 이름 정보를 map에 넣는다

}

String expensive = map.get(map.lastKey());

System.out.println(expensive);

}

 

}

}

 

결론

순서가 보장된 키와 밸류의 한 쌍 묶음을 쓰고싶을때는 TreeMap을 써보자

TreeMap에 있는 lastKey, firstKey는 각각 가장 큰 값, 가장 작은 값을 반환해주는 아주 멋진 기능이다.

(해당 기능은 해쉬맵에는 없다)


한 번 틀린 적이 있는 문제.

예제는 다 맞는데 왜 맞지 못하는지 고민해보려고 한다.

 

https://www.acmicpc.net/problem/27434

 

기존에 풀었던 방법

import java.util.Scanner;

 

public class day0112 {

public static void main(String[] args) {

 

Scanner sc =new Scanner(System.in);

 

int N = sc.nextInt();

int num = 1;

for(int i =2; i<=N; i++) {

num *= i;

}

 

if(N==0) {

System.out.println(1);

}else if(N==1) {

System.out.println(1);

}else {

System.out.println(num);

}

}

}

 

근데 생각해보니 N의 범위가 무려 십만까지이다. 이 경우 일반적인 int로는 불가능

BigInteger를 사용하거나, long을 사용해야하는데...

Java에서 long 타입은 최대값이 **9,223,372,036,854,775,807 (약 101810^{18})**으로 제한되어 있습니다. 따라서, 100,000!은 long 타입에 절대 담을 수 없습니다. 팩토리얼 값은 매우 빠르게 증가하기 때문에 100,000!의 값은 long은 물론이고 **BigInteger**를 사용해야만 계산하고 저장할 수 있습니다.

라고 챗지피티가 말했다 ㅎㅎ 심지어 절대 안된다고 ㅋㅋ

그래서 BigInteger의 기능에 대해서 공부하면서 이 문제를 풀어야 할 것 같다.

 

일단 BigInteger 를 스캐너로 입력받아주는데, 여기서 for 문을 그대로 쓸 수가 없다.

아무래도 BigInteger와 int값이 호환이 안되는 것 같다.

 

시도1

package bjquiz2025;

 

import java.math.BigInteger;

import java.util.Scanner;

 

public class day0112 {

public static void main(String[] args) {

 

Scanner sc =new Scanner(System.in);

 

BigInteger N = sc.nextBigInteger(); //입력받는 값

BigInteger i = new BigInteger("1");

BigInteger num = new BigInteger("1");

BigInteger count = new BigInteger("1");

 

//System.out.println("BigIntegerN값 출력"+N.abs());

 

while(N.compareTo(i) ==0 || N.compareTo(i)==-1) { //N이 2보다 작거나 같을때

num =N.multiply(i);

i= i.add(count);

}

 

if(N.equals("0")) {

System.out.println(1);

}else if(N.equals("1")) {

System.out.println(1);

}else {

System.out.println(num.abs());

}

}

}

난리난리...ㅋㅋfor문을 쓸 수 없는 줄 알고 이렇게 작성했는데, valueOf를 쓰면 더 쉬운 방법이 있었다.

문제점은 입력받는 값은 BigInteger를 쓰지 않아도 된다는 사실.

 

package bjquiz2025;

 

import java.math.BigInteger;

import java.util.Scanner;

 

public class day0112 {

public static void main(String[] args) {

 

Scanner sc =new Scanner(System.in);

 

int N = sc.nextInt(); //10만까지니까 BigInteger를 사용해 입력받을 필요는 없다.

 

BigInteger num = BigInteger.ONE; //초기화 하는 코드

 

for(int i =1; i<=N; i++) {

num = num.multiply(BigInteger.valueOf(i));

}

 

 

if(N==0) {

System.out.println(1);

}else if(N==1) {

System.out.println(1);

}else {

System.out.println(num);

}

}

}

그래서 이렇게 작성했는데 아니 시간초과가 떠버렸다ㅠㅠ

여기서 시간을 줄이는 것은 내 범위를 벗어나서, 언어를 파이썬으로 바꿔서 실행해보려고 한다.

마침 파이썬에는 팩토리얼 함수가 아예 있는 것 같다.

 

결국 파이썬으로 해결. 큰 수 팩토리얼 정도는 내가 배운 범위 내에서의 자바가 어려운 것 같으니 

파이썬 코드를 암기해두자

import math;

number = int(input());

i = math.factorial(number);

print(i);

https://www.acmicpc.net/problem/11365

오늘은 잘 모르는 것을 푸니깐 두 개를 풀어보려고한다.

자바에서 글자를 뒤집는 것은 좀 하기 힘들었던것 같은데, 검색해보니 의외로 쉬운 방법이 있었다.

 

바로 StringBuilder 클래스를 이용하는것. StringBuilder 클래스의 reverse()라는 함수를 사용하면 말 그대로 reverse처리를 할 수 있다. 

 

Scanner의 nextLine()을 사용했는데, 이 경우 엔터키를 치면 입력이 종료되는 상황이 발생하였다.

검색해보니 nextLine()을 이용하되, while(true)를 써서 계속 입력받을 수 있도록 만들어야 한다.

그렇다면 언제까지 입력받을 것인가? 이 것은 String 변수에서 equalsIngnoreCase를 사용해주면 된다.

 

그래서 아래가 완성된 코드

package bjquiz2025;

 

import java.util.Scanner;

 

public class day0112 {

public static void main(String[] args) {

 

Scanner sc = new Scanner(System.in);

 

while(true) {

String sen = sc.nextLine();

 

if(sen.equalsIgnoreCase("END")) {

break;

}

StringBuilder sentence = new StringBuilder(sen);

StringBuilder reverse = sentence.reverse();

System.out.println(sentence);

}

 

 

 


결론

1. JAVA에서 String을 빈칸까지 입력받을 때에는 sc.nextLine()을 써주며

엔터키눌려도 입력받고 싶으면 while(true)와 if, sc.equalsIgnoreCase(), break를 사용해서 조절해준다.

2. StringBuilder클래스의 reverse()함수를 사용하면 자바에서도 손쉽게 글자를 reverse할 수 있다. 


+ Recent posts