Code Signal -Arcade
코드시그널
아케이드 문제 관련 풀이들을 구글링하면서 찾아가는 일지를 하나씩하나씩 기록하고자 합니당.
주로 자바 위주로 풀이를 올릴예정이고, 추가로 공부하고 있는 파이썬이나 코틀린, GO, 자바스크립트 더 나아가 스위프트까지...
되는대로 가능한대로 구글링하고 정답맞추면 바로 패스!!
이런식으로 좋은 코드이든 말든 짜집기한 결과물들을 개인적 소장을 위해 기록합니다. ^^
참고 사이트들은 아래에 링크로 남겨둘터이니 자세하고 더욱 깊은 내용들은 링크로 들어가보세요! \
Delete Digit
한 숫자를 지워라
이 문제는 주어진 숫자가 있을 때, 한 숫자를 지웠을 경우 가장 큰 숫자가 남도록 함수를 정의하라는 문제입니다.
예를 들어 152 라는 숫자가 있습니다. 여기서 각 숫자하나를 지워보면 경우의 수는
15, 12, 52 가 됩니다. 이중 가장 큰 수는 52가 되므로 리턴값은 52가 됩니다.
보기보다 간단합니다. 그러나 이런 경우는 어떨까요
861452 복잡합니다.
숫자가 커지면 커질 수록 경우의 수도 늘어나고 어떤 숫자가 큰지 비교도 하는 작업이 많아집니다.
당시에 저는 코드에 대한 무지 때문에 즉흥적으로 코드를 작성 했으므로
부족한 코드이지만 참고 바랍니다.
답안입니다.
먼저 같은 코멘트 없는 순수 코드만 보여드립니다.
int deleteDigit(int n){
String sample = Integer.toString(n);
int size = sample.length();
char temp[] = new char[size];
for(int i = 0; i< size; i++){
temp[i] = sample.charAt(i);
}
List<Character> check = new ArrayList<Character>();
for (char c : temp) {
check.add(c);
}
List<Character> check2 = new ArrayList<Character>();
check2.addAll(check);
List<Integer> results = new ArrayList<Integer>();
StringBuilder let = new StringBuilder();
char temp2[] = new char[size-1];
int scale = 0, comb =0;
for(int i = 0; i<check.size(); i++){
check.remove(i);
for(char x : check){
temp2[scale++] = x;
}
scale = 0;
comb = Integer.parseInt(let.append(temp2).toString());
results.add(comb);
let.setLength(0);
check.clear();
check.addAll(check2);
}
return results.stream().max(Integer::compare).orElse(-1);
}
코멘트를 붙여서 부연 설명을 추가했습니다. 코드에 대한 설명은 아래 코드를 보시는게 나을 겁니다.
첫번째 테스트 152 를 가정해서 진행하였습니다.
int deleteDigit(int n){
String sample = Integer.toString(n);
int size = sample.length();
char temp[] = new char[size];
// 각 숫자를 char로 한 글자씩 자른다.
for(int i = 0; i< size; i++){
temp[i] = sample.charAt(i);
}
// temp=[1, 5, 2]
List<Character> check = new ArrayList<Character>();
// temp의 문자들을 check리스트에 넣어준다. (다시 보니 한번에 해줘도 될듯한데 왜이렇게 했을까 싶네요. ㅎㅎ)
for (char c : temp) {
check.add(c);
}
// check2에 check를 복사해서 넣어준다. check를 리셋 해줄 때 사용합니다. check = [1, 5, 2]
List<Character> check2 = new ArrayList<Character>();
check2.addAll(check);
//최종 결과를 넣는 리스트
List<Integer> results = new ArrayList<Integer>();
//stringbuilder를 통해 char상태의 배열을 쉽게 이용합니다.
StringBuilder let = new StringBuilder();
//temp보다는 1사이즈 작은 문자 배열을 선언해줍니다. 이를 이용해서 result 에 값을 추가
char temp2[] = new char[size-1];
//반복문에 사용되는 변수들 선언.
int scale = 0, comb =0;
for(int i = 0; i<check.size(); i++){
// check의 요소 하나를 제거합니다. 순서대로 반복...check = [5,2]
check.remove(i);
System.out.println(check);
// check에서 한 요소를 뺀 나머지를 temp2에 넣어줍니다. temp2 = [5,2]
for(char x : check){
temp2[scale++] = x;
}
// 반복작업을 위해 필요한 변수들 리셋과 다른 작업들을 해줍니다.
scale = 0;
//stringbuilder let을 활용해서 temp2에 있는 요소들을 붙여주어 형변환하고 숫자로 만들어서 Comb에 넣어줍니다.
// 52라는 숫자가 Comb에 들어가는 것이죠.
comb = Integer.parseInt(let.append(temp2).toString());
//comb의 값들을 result에 추가해줍니다. result = [52, ]
results.add(comb);
//let을 썻으니 다시 리셋해주는 방법! Stringbuilder를 리셋하는 방법은 setlength를 0으로 해주면 됩니다.
let.setLength(0);
//리스트 리셋 방법은 Clear()를 사용합니다.
check.clear();
//check는 다음 요소도 써야하니 비웠다가 다시 addall로 Check2를 복사해줍니다. (약간 번거롭네요 ㅋㅋ 수정해야하지만 그냥 합니다.)
check.addAll(check2);
System.out.println("reset check");
}
//최종적으로 결과 값들이 들어있는 Result를 stream()함수를 통해 max()함수를 활용하여 제일 큰 값을 만들어서 리턴시킵시다.
// result = [52, 12, 13]
return results.stream().max(Integer::compare).orElse(-1);
}
이제 엘리트 분들의 답안을 감상하자...
JAVA
int deleteDigit(int n)
{
int max = 0;
for (int t = 1; t < n; t *= 10)
max = Math.max(n / 10 / t * t + n % t, max);
return max;
}
이 코드를 보면 전 뭐한 걸까 싶습니다. 코드를 보면, 간단하게 Math.max()를 통해서 숫자 계산을 통해 max값을 끌어내는 듯합니다. for조건문을 보면, t *=10 으로 하여 한자릿수 마다 t가 1, 10, 100, 이런식으로 늘어나서, 최종적으로는 n의 자릿수 만큼 늘어납니다.
이 t의 변수를 활용해서 n / 10 / t * t + n% t를 하면 어찌 되려나요.
152/10/1*1+152%1 = 15
152/10/10*10+152%10 = 12
152/10/100*100+152%100 = 52
이렇게 되는 군요. 이해가 안되시면 아래의 코드를 for문을 이렇게 바꾸세요.
for (int t = 1; t < n; t *= 10){
max = Math.max(n / 10 / t * t + n % t, max);
System.out.println((n / 10 / t * t)+"___"+(n % t));
System.out.println(max);
}
/*
15___0
15
10___2
15
0___52
52
*/
이렇게 보니 이해가 되네요.. 역시 수학을 잘해야하는건가?ㅋ
Python3
def deleteDigit(n):
n = str(n)
return max(int(''.join(n[:i]+n[i+1:])) for i in range(len(n)))
JS
function deleteDigit(n) {
s = n.toString()
return Math.max(...[...Array(s.length).keys()].map(i=>Number(s.slice(0,i)+s.slice(i+1))))}
공감 버튼♥ 눌러주시면 더욱 많은 포스팅을 올리는데 힘이 됩니다!
부탁드려요 돈드는거 아니잖아요~
'Algorithm > Java' 카테고리의 다른 글
#52_Code Signal Arcade >> Longest Word (0) | 2020.07.02 |
---|---|
#50_Code Signal Arcade >> Chess Knight (0) | 2020.06.28 |
#49_Code Signal Arcade >> Line Encoding (0) | 2020.06.27 |