본문 바로가기

STUDY/코딩테스트

프로그래머스 코딩테스트 기록 [JAVA]

- 1번 문제 :

encrypted_text는 최종적으로 암호화된 문자열

key는 암호화에 사용되는 문자열

rotation은 문자열을 밀어넣는? 수 크기

 

예를들면, "abc"라는 문자열이 있고 key는 "aaa"라면 "abc"를 "aaa"로 암호화하면 "bcd"이다.

a = 1, b = 2 이런식으로 알파벳을 순서대로 숫자로 변환해서 그 값을 더하는 원리!

즉, "abc" = 123 이고 "aaa" = 111이기때문에 각 자리수에 키값을 더하면 "234"이므로

이를 다시 문자로 변환하면 "bcd" 이다.

 

rotation값이 2라면 문자열내에서 오른쪽으로 2칸을 이동하는 의미이다. 음수면 왼쪽으로 이동

예를들면, "bcd"에서 rotation값이 2라면 "cdb" rotation값이 -1라면 "cdb"이다.

 

이렇게 최종적으로 rotation값까지 적용된 암호화된 문자열이 encrypted_text이다.

import java.util.ArrayList;
class Solution {
    public String solution(String encrypted_text, String key, int rotation) {      
        ArrayList<Character> encrypted_text_re = new ArrayList<Character>;
        
        int chk = 1; //rotation이 양수인지 음수인지 판별하기 위한 변수
        if(rotation < 0) {
            chk = -1;
        }

        rotation = Math.abs(rotation) % key.length() * chk;

        if(rotation < 0) {
            //rotation이 음수라면 같은 변화를 주는 양수로 전환
            //ex) "abc"를 -1 rotation하는거나 2 rotation하는거나 같음. 
            rotation = key.length() + rotation; 
        }

        for(int i=0; i<key.length(); i++) {
            int a = i+rotation;
            if(a >= key.length()) {
                a = a - key.length();
            }
            encrypted_text_re.add(encrypted_text.charAt(a));
        }

        StringBuffer sb = new StringBuffer();               
        for(int i=0; i<key.length(); i++) 
        {           
            int a = (int)encrypted_text_re.get(i);
            int b = (int)key.charAt(i);
		//아스키코드로 변환
            int listBlock = a - b + 96;

            if(listBlock < 97) {
                listBlock = listBlock + 26;
            }      
          
            sb.append((char)(listBlock));
        }     
        return sb.toString();
	}
}

encrypted_text를 암호화해서 result를 뽑는 문제인줄알고 삽질하다가 오래걸린 문제....

 

-------------------------------

- 2번 문제 :

문자열 안 각각의 알파벳의 개수가 홀수인 알파벳의 개수를 출력하는 문제이다.

문자열이 만약 "abcdabe"라면 a의 수= 2, b의 수=2, c의 수 = 1, d의 수 = 1, e의 수 = 1 이다.

그럼 홀수개인 알파벳은 c, d, e로 총 3개이다.

 

import java.util.ArrayList;
import java.util.Collections;
class Solution {
    public int solution(String S) {
        ArrayList str = new ArrayList();

        for(int i=0; i<S.length(); i++) 
        {
            str.add(S.charAt(i));
            Collections.sort(str);      
        }

        int count = 1;
        int value = 0;

        for(int i=0; i<str.size(); i++) {

            if(i==str.size()-1) {
                if(count % 2 == 1) {
                    value++;
                }
                break;
            }

            if(str.get(i).toString().equals(str.get(i+1).toString())) {
                count++;
            }else {
                if(count % 2 == 1) {
                    value++;
                }
                count = 1;
            }
        }

        System.out.println(value);
        return value;
    }
}

-------------------------------

- 3번 문제 :

이 문제는 배열 안 중복값을 제거하는 문제이다. 중요한 포인트는 순서를 지키면서 제거해야한다.

예를들면, {1,2,3,1,5,4,3,2} 라는 배열이 있다면 {1,2,3,5,4} 로 중복값을 제거하지만 순서는 지켜야 한다.

set은 중복값을 허용하지 않는 Collection 중 하나이다. 다만 순서도 없다. 

하지만 LinkedHashSet을 사용하면 순서가 보장된다. 중복도 허용 X!

그래서 배열값을 set에 넣어주고 이를 다시 배열에 담으면 된다.

import java.util.*;

class Solution {
    public int[] solution(int[] waiting) {
                 Set<Integer> set = new LinkedHashSet<Integer>();

          for(int i=0; i<waiting.length; i++) {
              set.add(waiting[i]);            
          }

          int[] arr = new int[set.size()];
          ArrayList<Integer> a = new ArrayList<Integer>(set);

          for(int i=0; i<arr.length; i++) {
              arr[i] = a.get(i);
          }

        return arr;
    }
}

 

- 4번 문제 :

이 문제는 배열 안 중복된 값들의 가장 짧은 거리를 계산하는 문제였다.

예를들면, {1,2,3,2,5,4,1,3}이 있다면 1은 중복된 1과의 가장 짧은 거리가 6이고 2는 2, 3은 5이다.

만약 중복된 값이 없을 경우 -1을 return한다.

 

이건 만점을 받지못한 문제였다 효율성에서 0점을 받았다.

아직 미숙해서 효율성을 높이려고 했지만 다 실패ㅠㅠ

좀 더 알고리즘을 공부하고 효울성을 높이는 방법을 찾아봐야겠다. 

class Solution {
    public int solution(int[] arr) {
        int min = 99999;
        for(int i=0; i<arr.length-1; i++) {
            for(int j=i+1; j<arr.length; j++) {
                if(arr[i] == arr[j]) {
                    if(min > j-i) {
                        min = j-i;
                    }
                }
            }
        }

        if(min == 99999) {
            min = -1;
        }       
        return min;
    }
}

 

 

- 5번 문제 :

트램...뭐시기 문제! 

문자열 뒤에 최소한의 문자열을 추가해서 앞뒤가 똑같이 읽히는 문자열을 만드는 문제이다.

예를들면, "abab"라는 문자열에 "a"만 추가해줘서 "ababa"가 되면 앞에서 읽어도 뒤에서 읽어도 같다.

"abc"라는 문자열은 "ba"를 추가해주면 "abcba"가되어 앞뒤로 읽어도 같다. 이를 만드는 가장 최소한의 문자열을 붙이고 최종 길이를 출력하는 문제

 

class Solution {
    public int solution(String plain) {
       int len = plain.length();
        for (int i = 0; i < len; i++) {
            if (chkPalindrome(plain.substring(i))) {
                return i + len;
            }
        }
        return len * 2;
    }

    private static boolean chkPalindrome(String plain) {
        boolean chk = true;
        int len = plain.length();
        for (int i = 0; i < len; i++) {
            if (plain.charAt(i) != plain.charAt(len - i - 1)) {
                chk = false;
            }
        }
        return chk;
    }

}

 

- SQL문제 :

- TAGS 컬럼안에 태그가 몇개인지 판별하는 쿼리

ex) TAGS = "사자", "오리", "개구리" -> 3개

SELECT ID, ((length(TAGS) - length(replace(TAGS, ',',''))) / length(',')) +1 as COUNT
FROM YOUTUBES

풀이 : (전체길이 - (','문자를 뺀 길이) / ','의 길이(1이기 때문에 없어도 무방)) +1(','개수의 +1한것이 TAG의 개수)

 

-------------------------------

 

- SELLINGS 테이블에서 11월 판매액의 총합을 구하기

SELECT sum(PRICE) as 판매액
from SELLINGS 
where month(CREATED_AT) = '11'

풀이 : date타입인 CREATED_AT의 11월 데이터만 추출해서 더한다.

 

-------------------------------

일끝나고 푸느냐고 너무 힘들기도했고 좀 더 꼼꼼하게 코드를 짤걸 후회도 남는다

결과가 어떻든 좋은 경험이었다!

반응형

'STUDY > 코딩테스트' 카테고리의 다른 글

백준 2920번 음계 [JAVA]  (0) 2020.05.24
백준 7576번 토마토 [JAVA]  (0) 2019.10.24
백준 9461번 파도반 수열 [JAVA]  (0) 2019.10.18
백준 1149번 RGB거리 [JAVA]  (0) 2019.10.18