Code Signal -Arcade
코드시그널
아케이드 문제 관련 풀이들을 구글링하면서 찾아가는 일지를 하나씩하나씩 기록하고자 합니당.
주로 자바 위주로 풀이를 올릴예정이고, 추가로 공부하고 있는 파이썬이나 코틀린, GO, 자바스크립트 더 나아가 스위프트까지...
되는대로 가능한대로 구글링하고 정답맞추면 바로 패스!!
이런식으로 좋은 코드이든 말든 짜집기한 결과물들을 개인적 소장을 위해 기록합니다. ^^
참고 사이트들은 아래에 링크로 남겨둘터이니 자세하고 더욱 깊은 내용들은 링크로 들어가보세요!
Palindrome Rearranging
회문을 재정리 해라.
문제를 볼까요.
주어진 문자열이 있습니다. 이 문자열의 각 문자들을 재 정리 했을때, 회문이 될 수 있는 지 확인해보라는 것입니다.
항상.. 말은 쉽죠..? 한번 풀어보겠습니다.
입력값을 봤을때, 변화를 주면 회문이 될 수 있는지를 보고, 되면, true 안되면 false 를 반환하면 됩니다.
예전에 회문에 대해 풀었던 기억이 있어서 참고를 해볼께요.
String string2 =
new StringBuilder(a).reverse().toString();
if(a.equals(string2)){
return true;
}else{
return false;
}
이런 식으로 했었군요.. 그냥 reverse시켜서 회문이 되면 true 안되면 false...흠...
이걸로는 도움이 안되지만 일단 reverse를 기억해보면서 들어갔습니다... 뭔가 쓸만한게 있을꺼야.. 하면서 말이죠.
하지만 택도 없었습니다.
일단 답을 보여드릴께요.
boolean palindromeRearranging(String inputString) {
int [] check = new int [26];
int t = 0;
for(int i =0 ; i< inputString.length(); i++){
check[inputString.charAt(i) - 'a'] ++;
}
int te = 0;
for(int i =0; i<check.length; i++){
if(check[i] != 0) te ++;
}
for(int i : check)
if(i % 2 == 1) t ++;
return inputString.length() % 2 == t;
}
알파벳은 26자이니깐 일단 그 만큼의 배열을 선언해줍니다. int [] check = new int [26] ;
입력값의 알파벳의 순서에 따라 몇개씩 있는지 축적해주기 위해서입니다.
그리고나서 반복문을 통해서 주어지 문자열을 알파벳 배열에 넣어줍니다. Check배열에는 각 알파벳 순서대로
들어가게 되어있고, 만약 여러개가 있다면, 그것을 축적해서 숫자로만 몇개 들어있다.. 이런식으로 들어가게 됩니다.
이 작업을 해줄 해당 코드 입니다.
for(int i =0 ; i< inputString.length(); i++){
check[inputString.charAt(i) - 'a'] ++;
}
이렇게 되고나서 Check 를 출력해보면...
System.out.println("check = " + Arrays.toString(check));
//output
//inputString: "aabb"
//check = [2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
이해가 되시나요? 이런식으로 주어진 문자열을 구분해줍니다.
그리고 나서 알파벳의 갯수가 짝수개씩 있는지 확인해줍니다.
만약 짝수개라면 회문이 가능하다는 것이죠.
그리고 홀수개의 알파벳이 있다면, 그 홀수의 알파벳의 종류가 몇가지인지 확인해줍니다.
한가지 이상이라면 똑같은
for(int i : check)
{ if(i % 2 == 1) t ++; }
회문으로 생성이 불가해집니다.
마지막으로는 그러한 회문 비율이 양쪽 대칭이 될 수 있는지 확인해주는 코드를 넣어서 true/false로 리턴하게 해줍니다.
return inputString.length() % 2 == t;
좀 어렵게 푼겁니다.. 답안 앨리트들은 훨씬 간단해요..
아무튼 클리어!
앨리트들의 답안 코드를 볼께요.
boolean palindromeRearranging(String inputString) {
int map = 0;
for(int i=0; i<inputString.length(); i++) {
map ^= 1 << (inputString.charAt(i) - 'a');
}
return map == 0 || (map & -map) == map;
}
정말이지.. 간단합니다.
map 이라는 변수를 선언해주고,
반복문을 통해서, 주어진 문자열의 각 문자요소를 비트 연산을 통해서 구해냈습니다..
이해하려면 한참 걸리는 수듄이기 떄문에.. 패쓰... 암튼 심박하네요..
다음 앨리트..답안.
boolean palindromeRearranging(String inputString) {
int []niz = new int[26];
for(int i=0; i<inputString.length(); i++)
niz[inputString.charAt(i)-97]++;
int cnt=0;
for(int i=0; i<niz.length; i++)
if(niz[i]%2!=0)
cnt++;
return cnt<=1;
}
ㅇ
오우 좀더 가뿐해 보이네요.
이분은 저랑 비슷하게 하셨네요.
알파벳 수만틈 배열을 선언해준뒤.
아스키코드 97 은 'a'를 나타냅니다. 즉 그것을 CharAt(i)에 빼주어 해당 위치에 들어가게 해줍니다.
그리고 나서 그 문자열의 갯수가 짝수가 아니라면, cnt ++를 해주고, (즉 홀수 인경우)
Cnt가 1보다 작거나 같으면 true 아니라면 false를 반환하게 하여 가뿐하게 푸셨네요...
아무튼 어려운 코드의 세상이였습니다.
'Algorithm > Java' 카테고리의 다른 글
#19_Code Signal Arcade >> Are Equally Strong (0) | 2019.11.21 |
---|---|
#17_Code Signal Arcade >> Array Change (0) | 2019.11.19 |
#16_Code Signal Arcade >> Are Similar? (0) | 2019.11.18 |