제거한 값을 배열로 만들기 위해 위 코드와 같이 처리한다. 값을 제거한 배열이 빈 배열일 경우 -1을 집어넣어야 하므로 사이즈를 1로 지정하고 그게 아니라면 결과 사이즈로 int배열을 선언한다. 정답 배열의 크기가 1일 경우 -1을 넣고 그게 아니라면 배열을 그대로 담는다. 시간복잡도는 이다. 따라서 전체 시간복잡도는 이다.
테스트
테스트케이스는 전부 통과하였지만 만약 테스트케이스가 [1,1,3]인 경우 내 알고리즘은 틀리게 된다. 그래도 통과가 된걸보니 그러한 케이스는 없었던 것 같다.
//프로그래머스 문제풀이 level1 정수 제곱근 판별 publicstaticvoidmain(String[] args) { long n = 121; long answer = 0; double fp; int ip; double root = Math.sqrt(n); ip = (int)root; fp = root - ip; if(fp > 0) answer = -1; else answer = (long)Math.pow(ip+1, 2); System.out.print(answer); } }
제곱근이 정수라는 것은 소수부분이 0이어야 한다는 것이다. 주어진 정수 n의 제곱근을 구해 정수부와 소수부로 나눈다. 만약 소수부가 0보다 크면 정수가 아니라는 의미이므로 -1을 반환한다. 만약 소수부가 0이라면 정수부분의 +1하여 제곱한 값을 넘겨준다. 총 시간복잡도는 이다.
publicclassNumDesc{ //프로그래머스 문제 풀이 level1 정수 내림차순으로 배치하기 publicstaticvoidmain(String[] args) { long n = 118372; long answer = 0; String s = Long.toString(n); char[] arr = s.toCharArray(); Arrays.sort(arr); s = new StringBuilder(new String(arr)).reverse().toString(); answer = Long.parseLong(s); } }
//프로그래머스 level1 이상한 문자 만들기 publicstaticvoidmain(String[] args) { String s = "try hello world"; StringBuffer buff = new StringBuffer(); int j = 0; for(int i = 0; i < s.length(); i++) { char c = s.charAt(i); String st = Character.toString(c); if(st.equals(" ")) j = 0; if (c >='A' && c <= 'Z' || c >= 'a' && c <= 'z') { if(j%2 == 0) st = st.toUpperCase(); else st = st.toLowerCase(); j++; } buff.append(st); } String answer = buff.toString(); System.out.print(answer); } }
문자열에서 문자를 하나하나 뗀다. 또는 toCharArray()로 char배열을 생성해도 된다. 여기서 j라는 숫자는 단어를 공백에 맞춰 잘랐을 때, 단어의 인덱스를 나타내기 위함이다. 공백을 만났을 경우 이 j는 0으로 초기화된다. 알파벳을 만났을 경우 짝수나 홀수냐에 따라 대문자 또는 소문자로 바꿔준다. 나중에 다른사람의 풀이를 보니 단어를 이루고있는 요소들 중에 숫자나 특수문자는 없는 것 같았다. 하지만 테스트 케이스를 정확히 알 수 없기 때문에 필자는 문자인가에 대한 확인도 추가로 해주었다. 이렇게 변환한 문자열을 버퍼에 넣어 스트링으로 바꾸면 완성이다. 총 시간복잡도는 이다.
시저 암호를 프로그래밍하는 문제이다. 시저 암호를 만드는 방법은 문자열을 아스키코드로 n만큼 미뤄서 만들면 된다. 가령 abc가 있고 2가 주어진다면 cde이런식으로 만들 수 있다. 문제에서 알파벳에 대해서만 만들고 공백은 건들지 말라 했으므로, 알파벳에 대해서만 처리를 해주면 된다.
publicclassCaesarCode{ //프로그래머스 문제풀이 level1 시저 암호 publicstaticvoidmain(String[] args) { String s = "AB"; int n = 1; StringBuffer buff = new StringBuffer(); for(int i = 0; i < s.length(); i++) { char c = s.charAt(i); int ascii = (int) c; if(ascii >= 65 && ascii <= 90) { ascii += n; if(ascii > 90) ascii -= 26; } elseif(ascii >= 97 && ascii <= 122) { ascii += n; if(ascii > 122) ascii -= 26; } buff.append(String.valueOf((char) ascii)); } String answer = buff.toString(); } }
문자열을 문자로 하나씩 뜯어서 본다. 만약 대문자라면 90을 넘어갈 경우 대문자 A로 돌아가야 한다. 따라서 첫번째 if문을 보면 대문자에 속할 경우 n을 더하고 Z의 아스키코드를 넘아가면 A로 돌아가게 하였다. 두번째 if문도 똑같은 원리로 하면 된다. 공백의 경우 아스키코드를 늘릴 필요가 없으므로 그대로 추가하면 된다. 총 시간복잡도는 이다.
테스트
필자의 경우 26을 빼주는 식으로 했는데 조금 다르게 풀 수도 있다. 주어진 문자가 소문자인지 대문자인지 판별한 후에(자바에는 친절하게 이 메소드를 제공한다.) 만약 소문자라면