Code Signal -Arcade
코드시그널
아케이드 문제 관련 풀이들을 구글링하면서 찾아가는 일지를 하나씩하나씩 기록하고자 합니당.
주로 자바 위주로 풀이를 올릴예정이고, 추가로 공부하고 있는 파이썬이나 코틀린, GO, 자바스크립트 더 나아가 스위프트까지...
되는대로 가능한대로 구글링하고 정답맞추면 바로 패스!!
이런식으로 좋은 코드이든 말든 짜집기한 결과물들을 개인적 소장을 위해 기록합니다. ^^
참고 사이트들은 아래에 링크로 남겨둘터이니 자세하고 더욱 깊은 내용들은 링크로 들어가보세요!
또다시 오랜만에 포스팅을 하게되었습니다.
현재 33번 문제까지 풀었습니다. 그동안 진도를 쭈욱쭈욱 뽑았는데 ,, 이제 더이상 진도를 나가기에는 머리가 빠질거 같아서 다시 되돌아와 복습하는 기회삼아 천천히 정리하려고 하고 있습니다. ^^
자 ... 제 블로그에는 12번이지만 문제 13번을 볼까요?? (첨에 1번과 2번을 같이 풀어버려서 그래용...)
Reverse In Parentheses
입력되는 값을 거꾸로 반환해주라는 것입니다. 대신 특정 문자기호를 인식하여 그 문자가 읽혔을 때,
해당구역을 거꾸로 문자를 반환해서 보여주라는 것입니다.
이번 문제는 예시를 보면 이해가 빠릅니다.
foo(bar)baz 라고 했을 때, ()가 인식이 되면,
그 부분만 rab 로 반환을 해주면 되고. 최종 리턴값은 foorabbaz 로 리턴이 되면 됩니다.
먼저 답안 코드를 볼까요?
이거랑
이거..
보시다 시피 극혐... 간단하게 보면, reverse string , reverse in parentheses 를 활용해서 리턴값을 주는 것입니다.
일단 이 코드를 써보시고, 테스트를 돌려보면 더 이해하기 쉬우니 테스트를 돌려볼께요.
테스트를 돌려보면 첫번째 테스트의 값들이 나옵니다. 아래와 같이요.
이 테스트를 보면 output값들이 보이는데요.
중간중간 제가 system.out.println으로 출력하는 부분들이 나오는 것이죠.
좀더 자세히 출력 부분들을 보자면, 맨 처음 입력값이 들어오면 그것들을 쭈욱 훑어보게 하는 부분이 필요합니다.
왜냐하면 ()부분을 찾아서 그 부분을 거꾸로 바꿔줘야 하니깐요.
그렇다면 그 () 를 찾는 로직은 어떻게 될까요?
int rStart =0 ; |
출력되는 부분을 제외하곤 바로 이부분입니다. 자세히 볼까요?
먼저, 바뀌어야 할 부분의 문자열 순서의 시작점과 끝점을 넣어줄 숫자형 변수를 선언해줍니다.
int rstart 와 int rend 가 되겠죠. 단, 끝부분은 편하게 입력값의 길이만큼으로 한정해둡니다. (별 상관없이 0해두댐)
그리고 반복문을 통해 '(' 와 ')' 의 시작점과 끝점 위치를 i 값을 통해 찾아서 다시 그 변수들에게 넣어줍니다.
이렇게 하면, 어떠한 문자열이 나와도, 그 특정 특수문자를 인식하여 그 위치를 넣어주는 겁니다.
물론 if 문을 통해서 그런경우 넣어주고 아니면 그냥 다음으로 패스하게 만듭니다.
(여기서 문자는 ' ' 로 감싸줘야함~!!!!!!!!!!!!!!!!)
자, 이제 마지막에 rEnd 값까지 찾앗다면, 그 값을 찾은 상태로, string temp 라는 문자변수에다가 넣어줍니다.
여기서 temp 는 substring 을 통해서 rStart +1 에서부터 rEnd 까지의 문자열을 선택해줍니다.
이렇게 해주면, temp 는 ()를 제외한 그 안의 문자열만 들어가게 됩니다. 꼭 범위를 잘 확인해주세요!
만약 () 다 들어가야한다면 범위를 다르게 설정해주면 되겠죠?
substring 의 사용법은 구글링하시면 쉽게 나오니 다른 로직을 원하시는 분은 찾아보셔요~가 아니라.. 여기 링크...
(https://jamesdreaming.tistory.com/81) 구찮으니껭...
그리고 나서 return 값으로 진행을 하는데요. 여기서 리턴값은 굉장히 깁니다.
왜냐하면 혹시 reverse 해줘야 할 부분이 문장 가운데 일 수도 있으니까 이렇게 되는 건데, (맞나? ㅋ)
reverseinparentheses 의 리턴값은 a로 되어잇기 때문에, 여기서 ( )가 발견 되었을 때, 바뀔 부분을 찾아서 ( ) 를 다 때어주고 나머지 문자열 부분들이 앞뒤가 잇다면 그 부분들을 다시 붙여 주는 형식으로 리턴시키는 거랍니다~.
(이해가 안되시면,,, 댓글... ㄱㄱ )
아무튼 그렇게 햇다면, 중간에 reverseString 부분이 보일겁니다. 이부분은 아까 맨 위의 코드에 해당하지요.
여기는 바로 거꾸로 문자열을 반환하는 부분입니다.
String reverseString(String a){ char [] test = a.toCharArray(); String show = ""; for(int i = test . length -1 ; i>= 0 ; i--){
show += Character.toString(test[i]); } return show; } |
이 부분은 간단합니다. 입력되는 스트링값을 새로운 char[] 안에다가 넣어준뒤 for문을 통해서 거꾸로 반환해주는 겁니다. 수동수동.하는 느낌으로다가? 그냥 메서드가 있나 찾아본기억이..없는듯.
그런데, 여기서 toCharArray() 가 보이시죠? https://caronjuni.tistory.com/entry/toCharArray
이런 개꿀 메서드가~~~~ 이걸 이용합니다. 깔꿈하게.
show 변수는 문자열로 선언해주고, 거꾸로 나오는 문자열 값을 저장해줍니다.
그리고 나서 그것을 리턴해주는 메서드! 입니다.
즉, temp 에 저장된 문자열이 아까 ( ) 안에 있던 값들 이었습니다. 그 문자열을 이 메서드에 넣어서
거꾸로 출력해주는 겁니다. for 문을 보시면 시작점이 뒤에서부터 첨으로 가는 방식으로 선어이 되어있습니다.
아무튼 이것을 활용하면 temp 에 저장된 값이 거꾸로 출력되어 리턴 됩니다. 그것을 그대로 다시 넣어주면 끝.
그렇게 해서 최종적으로
return a 로 코드를 마치면 되겠습니다.~~
다시한번 간추리고 이쁘게 해서 보여드릴께요.
String reverseInParentheses(String a) {
//바꿀부분의 시작점과 끝점을 넣는 변수.
int rStart =0 ;
int rEnd = a.length() -1;
for(int i =0; i< a.length(); i++){
//시작점 찾는 부분~
if(a.charAt(i) == '(')
{ rStart = i;
System.out.println("rStart>>>"+rStart); }
// 끝점 찾는 부분.
if(a.charAt(i) == ')')
{ rEnd =i;
System.out.println("rEnd>>>"+rEnd);
// 다 찾았으면, 바꿀부분을 () 를 빼고 넣어준다.
String temp = a.substring(rStart +1, rEnd);
System.out.println("temp>>>"+ temp);
// 다 됐으니, 이제 리턴값을 변형해준다.
return reverseInParentheses(a.substring(0, rStart) +
reverseString(temp) +
a.substring(rEnd +1));
}
}
// 최종적으로 리턴.
return a;
}
//////////////////////////////////////////////////////////////////////////
//문자열을 거꾸로 해주는 메서드~~
String reverseString(String a){
// 입력되는 값을 담아줄 문자 배열을 선언해주고, 그 문자배열을 다시
// 넣어줄 문자변수 선언.
char [] test = a.toCharArray();
String show = "";
System.out.println("test>>"+Arrays.toString(test));
// 반복문을 통해서 거꾸로 돌려~~
for(int i = test.length-1 ; i>= 0 ; i--){
// 거꾸로 문자들이 문자변수에 차곡차곡 쌓인다~
show += Character.toString(test[i]);
}
//테스트 테스트 해보고~
System.out.println("show>>"+show);
// 그 값을 다시 리턴!
return show;
// 이렇게 하면 메서드가 안성~!
}
끄읕....
이해가 안가시면 댓글 남겨주세요.. 최대한 빨리 답을 드릴께요.
물론, 제 답안은 다른분의 답안을 참고하기도 했지만, 최근 저작권 문제로 기존에 공유됐던 답지 깃허브가 막혔습니다...
고통... 이때만 해도 안 막혔어서 잘 보면서 공부를 했지만, 한 20번대 문제부터는 제 힘으로 풀기 시작해서 시간도 더 오래걸리고,,, 너무 힘들어 졌어요..
그래도 33문제까지는 분량이 있으니 꾸준히 업로드 하겠습니다...
답지 링크가 없어서 죄송하구요.
그냥 제 깃허브에 답안을 정리해서 넣어둘 생각입니다.
안걸리게.. 잘 이름 바꿔서 해볼라구요.. 휴..
다행히 답안을 제공해주시던 분과 이메일로 연락이 되었는데,,
답안을 간추려서 보내주신다고 했지만,, 연락이 안옵니다..(바쁜신가봐요..)
외국분입니다. 마르코 라고.. ㅋㅋㅋㅋㅋ
혹시 답안 링크 가지고 계신분은 공유좀 ..ㅜㅜ
'Algorithm > Java' 카테고리의 다른 글
#14_Code Signal Arcade >> Alternating Sums (0) | 2019.11.14 |
---|---|
#12_Code Signal Arcade >> Sort By Height (0) | 2019.10.22 |
#11_Code Signal Arcade >> Is Lucky (0) | 2019.10.21 |