import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int [] number = new int[N+1];
for(int i=0;i<N;i++)
number[i] = Integer.parseInt(br.readLine());
for(int i = 0;i<N;i++) {
for(int j=1;j<N;j++) {
if(number[j] < number[j-1]) {
int temp = number[j];
number[j] = number[j-1];
number[j-1] = temp;
}
}
}
for(int i=0;i<N;i++)
System.out.println(number[i]);
}
}
Arrays.sort를 쓰면 더 빠르고 짧게 정렬할 수 있다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
public class Main {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int [] number = new int[N];
for(int i=0;i<N;i++)
number[i] = Integer.parseInt(br.readLine());
Arrays.sort(number);
for(int i=0;i<N;i++)
System.out.println(number[i]);
}
}
실패 코드 1 : String으로 특정 순서에 있는 문자를 가져오는 charAt를 통해 가져왔다. 결과는 메모리초과
이유는 String 클래스 문자열의 최대 가능 길이는 2,147,483,647이기 때문에 뜬 것 같다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int k = Integer.parseInt(st.nextToken());
String number = "";
int a = 0;
for(int i=1;i<=N;i++) {
number+=i;
a += Math.log10(i)+1;
if(a>=k)
break;
}
if (a>k)
System.out.println(number.charAt(k-1));
else
System.out.println("-1");
}
}
실패 코드 2 : String 대신에 ArrayList로 해보았다. 결과는 메모리초과
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int k = Integer.parseInt(st.nextToken());
ArrayList<String> list = new ArrayList<>();
int a=0;
boolean check = false;
for(int i=1;i<=N;i++) {
a+=Math.log10(i)+1;
list.add(Integer.toString(i));
if(a>=k) {
check = true;
a = k-(a-(int)Math.log10(i)-1)-1;
break;
}
}
if(check)
System.out.println(list.get(list.size()-1).charAt(a));
else
System.out.println("-1");
}
}
실패 코드 3 : 해당 숫자만 String형태로 가져와서 원하는 숫자 1개를 찾아서 출력한다. 잘나오는 것 같은데 틀렸다고 뜬다.. 왜그러지.. 조금 있다가 다시 풀어봐야겠다...슈벌탱
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int k = Integer.parseInt(st.nextToken());
int a=0;
boolean check = false;
String temp="";
for(int i=1;i<=N;i++) {
a+=Math.log10(i)+1;
if(a>=k) {
check = true;
a = k-(a-(int)Math.log10(i)-1)-1;
temp = Integer.toString(i);
break;
}
}
if(check)
System.out.println(temp.charAt(a));
else
System.out.println("-1");
}
}
성공 코드 : 첫번째부터 마지막 수까지 계속하면 메모리초과, 런타임이 뜬다.
수를 줄이기 위해서 첫번째 while 문에서 9,99,999안에 k가 있는지 판단하면서 length와 처음 입력한
k의 자리 수 보다 적은 9*11111..꼴의 수를 가져온다.
while 문을 빠져나온 뒤 k의 자리수 보다 적은 9*111...꼴의 수에 +1을 해줘서 자리 수를 맞춰주고,
(k-1)/length를 더해줘서 원하는 정확한 int형의 값을 가져온다.
만약 가지고 온 수가 N보다 높으면 입력한 수보다 높은 수를 출력하기 바랬기 때문에 -1출력
N보다 작다면 (k-1)%length를 통해 원하는 수의 index값을 가져와서 출력해준다.
어렵다..
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int k = Integer.parseInt(st.nextToken());
long finalNumber = 0;
long length = 1;
long numberOfDigits = 9;
while (k > length * numberOfDigits) {
k -= (length * numberOfDigits);
finalNumber += numberOfDigits;
length++;
numberOfDigits *=10;
}
finalNumber = (finalNumber+1)+ (k-1)/length;
if(finalNumber > N) {
System.out.println(-1);
}else {
int index = (int) ((k-1)%length);
System.out.println(String.valueOf(finalNumber).charAt(index));
}
}
}
초기 코드 1 : 각 숫자의 자리수를 Math.log10(i)+1를 통해 구한다. 결과는 시간초과
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int count = 0;
for(int i=1;i<=N;i++)
count += Math.log10(i)+1;
System.out.println(count);
}
}
초기 코드 2 : String으로 반복문이 돌때마다 +i를 해준 뒤 string의 길이를 length()로 출력해보았다.
결과는 메모리초과
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
String count = "";
for(int i=1;i<=N;i++)
count += i;
System.out.println(count.length());
}
}
맞은 코드
일단 i의 수 120을 입력했다는 가정으로 보면
1의 자리이상 120개 + 2의 자리이상 120-9(1의 자리)개 + 3의 자리이상 120-9-90(2의 자리)개로 더 해주는 방식으로 풀었다.
결과는 맞았습니다!!
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int count = 0;
for(int i=1;i<=N;i*=10)
count += N - (i-1);
System.out.println(count);
}
}
- 많은 경우의 수를 고려했을 때 해결책은 평론가 수 - (소시지 수와 평론가 수의 최대공약수)로 나왔다.
- 최대공약수를 구하는 것을 재귀로 하려고하다가 재귀로하면 시간이 오래 걸린다는 말을 들어서 반복문으로 해결했다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
int cutting = 0;
while (true) {
n = n % m;
if (n == 0)
break;
if (m%n == 0)
{
cutting += (m / n - 1)*n;
break;
}
else {
cutting += (m / n)*n;
m = m % n;
}
}
System.out.println(cutting);
}
}