Coding Test

2022 우테코 onboarding 3~4번 리뷰

Backcoder 2022. 11. 8. 23:42

2022 우테코에서 진행하는 공개된 사전과제 코딩테스트 문제 입니다.

 

https://github.com/Backcoder-June/java-onboarding

 

GitHub - Backcoder-June/java-onboarding: 온보딩 미션을 진행하는 저장소

온보딩 미션을 진행하는 저장소. Contribute to Backcoder-June/java-onboarding development by creating an account on GitHub.

github.com

( 상세한 문제 설명은 링크를 타고 들어가서 확인해주세요! )

 

Problem 3

3,6,9 게임 규칙으로, 주어진 숫자까지 총 몇 번 박수를 쳐야하는 지 구하는 문제였다.

 

=> 각 자리수 별 숫자 구하기 

=> 부분합  

 

예를 들어, 3663 의 경우, 총 박수를 4번 쳐야한다. 

즉 각 자리 수 별로 3,6,9 를 포함하는 지 확인이 필요했다.

=> 1번 문제와 마찬가지로 while, %10, /10 을 이용했다. 

 

숫자 1 부터 시작해서, 주어진 숫자까지 총 박수의 수를 구해야 했다. 

n 번째 까지의 총 박수의 수는 

n-1 번째 까지 총 박수의수 + n 번째 박수의 수 

즉, 부분합이 적용될 수 있다. 

 

부분합을 이용하면 몇 번째 까지의 값을 list 에 담을 때,

전 항을 이용할 수 있으므로, 매번 1번 부터 카운트를 하지 않아도 되고, 

이후에 값을 조회 할 때를 생각하면, 매번 계산 할 필요 없이, 저장해 둔 값을 가져오기만 하면 된다. 

public class Problem3 {
    public static int solution(int number) {
        List<Integer> list  = new ArrayList<>();
        list.add(0, 0);
        list.add(1, 0);
        for(int i = 2; i<10001; i++) {
            int count = 0;
            int j = i;
            while (j > 0) {
                if (j % 10 == 3 || j % 10 == 6 || j % 10 == 9) {
                    count++;
                }
                j = j / 10;
            }
            list.add(i, list.get(i - 1) + count);
        }
        return list.get(number);
    }
}

 

 

Problem 4 

A~Z, a~z  로 이루어진 문자열을 

Z~A, z~a  로 대응하는 문자열로 바꿀 수 있는가 묻는 문제였다. 

( 처음엔 replace 를 사용해 보려 했으나, replace 를 사용할 경우, 

매번 index 마다 replace 가 다시 해당하는 char 모두에 적용 되므로 적절하지 않았다. ) 

 

=> Char / Int 형변환 

=> 대칭 되는 char 규칙 발견 

=> map 등 자료구조 활용 

 

(1) char => int 로 형변환을 해서 사용하면, 반복문을 사용할 수 있다.

// 65~90 , 97 ~122 , 32
// 65 90 / 66 89 / ... 77 78 / 78 77 / ..
// 155 / 219

A~Z : 65~90 / a~z : 97~122  / 띄어쓰기 : 32 

총합 155      /  총합 219 

 

(2) 위의 규칙을 이용해서

총합 - 해당 문자열의 숫자  =  대응되는 문자열 숫자 

를 구할 수 있었다. 

( 띄어쓰기는 따로 처리 ) 

 

해당 문자 < = > 대응 문자 

 

이런 구조라면 map!

public class Problem4 {
    public static String solution(String word) {
        Map map = new HashMap();
        map.put(32, 32);
        for (int i = 65; i < 91; i++) {
            map.put(i, 155 - i);
        }
        for (int j = 97; j < 123; j++) {
            map.put(j, 219 - j);
        }

        String newword = "";
        for (int a = 0; a < word.length(); a++) {
            int newcharint  = (int)map.get((int)word.charAt(a));
            newword += (char) newcharint;
        }

        return newword;
    }
}

 

풀어놓고 보니 간단간단 한 거 같지만 

아직은 풀이까지 시행착오를 겪는데 시간이 꽤 잡아먹힌다. 

기초적인 알고리즘 사용등을 더욱 체화시키고, 알고리즘 지식을 차츰 더 더해가야 겠다.