코딩 테스트 문제 모음집 -1(수학,문자열,스택,비트마스킹,해시테이블)

WOOK JONG KIM·2023년 3월 21일
0

코테문제_모음집

목록 보기
1/12
post-thumbnail

1번 문제(짝수는 싫어요)

https://school.programmers.co.kr/learn/courses/30/lessons/120813?language=java

Stream의 필터를 사용하는 방법 또는 i % 2 != 0인 조건식 사용

코드

import java.util.stream;

class Solution {
    public int[] solution(int n) {
        
        return IntStream.rangeClosed(1,n).filter(i -> i % 2 == 1).toArray();
    }
}
class Solution {
    public int[] solution(int n) {
        ArrayList<Integer> answer = new ArrayList<>();
        
        for(int i = 1; i <= n; i++){
            if(i % 2 != 0){
                answer.add(i);
            }
        }
        
        return answer.stream().mapToInt(i->i).toArray();
    }
}

2번 문제(숫자 문자열과 영단어)

https://school.programmers.co.kr/learn/courses/30/lessons/81301

처음에 딱 생각난 방법은 그냥 단순하게 다중 분기문 쓰거나, replaceAll 메서드 사용하는것 밖에 생각이 안났다

class Solution {
    public int solution(String s) {
        StringBuffer sb = new StringBuffer();
        char[] c = s.toCharArray();
        
        for(int i = 0; i< c.length;){
            if(Character.isDigit(c[i])){
                // 숫자인 경우
                sb.append(c[i]);
                i++;
            }else{
                if(c[i] == 'z' || c[i] == 'n'){
                    if(c[i] == 'z'){
                        sb.append("0");
                    }else{
                        sb.append("9");
                    }
                    i += 4;
                }else if(c[i] == 'o'){
                    i += 3;
                    sb.append("1");
                }else if(c[i] == 't'){
                    i++;
                    if(c[i] == 'w'){
                        i += 2;
                        sb.append("2");
                    }else{
                        i+= 4;
                        sb.append("3");
                    }
                }else if(c[i] == 'f'){
                    i++;
                    if(c[i] == 'o'){
                        i += 3;
                        sb.append("4");
                    }else{
                        i += 3;
                        sb.append("5");
                    }
                }else if(c[i] == 's'){
                    i++;
                    if(c[i] == 'i'){
                        i += 2;
                        sb.append("6");
                    }else{
                        i += 4;
                        sb.append("7");
                    }
                }else{
                    i += 5;
                    sb.append("8");
                }
            }
        }
        
        return Integer.parseInt(sb.toString());
    }
}

그냥 생각도 안하고 다중 if로 쓰느라 가독성도 좋지 않았는데, 다른 사람 풀이를 보니 switch문에서 break를 잘 조절하여 가독성 있게 문제를 푸신분도 계셨다
-> 위 코드 실행 속도는 생각보다 너무 빨라서 놀랬다..

class Solution {
    public int solution(String s) {
        String[] strArr = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};
        for(int i = 0; i < strArr.length; i++) {
            s = s.replaceAll(strArr[i], Integer.toString(i));
        }
        return Integer.parseInt(s);
    }
}

처음엔 단순히 digit을 위한 배열 까지 만들었는데, 생각해보니 굳이 필요할거 같지 않아서 지웠다!
-> 앞에 코드랑 실행시간은 2배 더 걸렸다!


3번 문제(괄호)

https://www.acmicpc.net/problem/9012

import java.io.*;
import java.util.Stack;

public class Main{
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringBuilder sb = new StringBuilder();
        int N = Integer.parseInt(br.readLine());

        Stack<Character> stack;

        for(int i = 0; i < N; i++){
            String str = br.readLine();
            stack = new Stack<>();
            boolean flag = true;
            for(char c : str.toCharArray()){
                if(c == '('){
                    stack.push('(');
                }else if(!stack.isEmpty()){
                    stack.pop();
                }else{
                    sb.append("NO" + "\n");
                    flag = false;
                    break;
                }
            }

            if(flag){
                if(stack.isEmpty()){
                    sb.append("YES" + "\n");
                }else{
                    sb.append("NO" + "\n");
                }
            }
        }
        bw.write(sb.toString() + "\n");
        bw.flush();
        bw.close();
    }
}

괄호의 종류가 한가지라 비교적 쉽게 풀었다
-> 괄호가 어짜피 한개라서 flag를 두는 대신 count를 세는 방식으로 해도 괜찮을것 같았다


4번 문제(행성 X3)

https://www.acmicpc.net/problem/2830

코드 1

public class Main {
    public static void main(String[] args) throws IOException{
       BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
       int N = Integer.parseInt(br.readLine());
       String[] binaryArr = new String[N];
       int sum = 0;

       for(int i = 0; i < N; i++){
           String s = br.readLine();
           binaryArr[i] = Integer.toBinaryString(Integer.parseInt(s));
       }

       for(int i = 0; i < N-1; i++){
           for(int j = i; j < N; j++){
               int maxLen = Math.max(binaryArr[i].length(), binaryArr[j].length());
               binaryArr[i] = String.format("%" + maxLen + "s", binaryArr[i]).replace(' ', '0');
               binaryArr[j] = String.format("%" + maxLen + "s", binaryArr[j]).replace(' ', '0');
               StringBuilder sb = new StringBuilder();

               for(int k = 0; k < maxLen; k++){
                   if(binaryArr[i].charAt(k) == binaryArr[j].charAt(k)){
                       sb.append('0');
                   }else{
                       sb.append('1');
                   }
               }

               String result = sb.toString();
               sum += Integer.parseInt(result,2);
           }
       }

        System.out.println(sum);
    }
}

처음에 그냥 생각나는 대로 풀어보았따.. 값이 작은 데이터의 경우엔 괜찮았는데 인풋 데이터가 클때는 바로 메모리 초과 오류 발생..

for(int i = 0; i < binaryArr.length-1; i++){
	for(int j = i+1; j < binaryArr.length; j++){
    	sum += binaryArr[i] ^ binaryArr[j]
    }
}

생각해보니 두 자리가 같으면 0, 다르면 1이라는 것을 보니 XOR연산일것 깨닫고, 이를 통해 반복문을 통해 XOR 연산을 하며 sum에 더해 가는 방식으로 하였는데 이 경우에는 시간 초과가 났다
-> 문제의 인풋이 1 ≤ N ≤ 1,000,000 이였는데 이 경우 n^2은 너무 큰 복잡도였다

다른 분들 풀이를 보니 쉬프트 연산자를 사용해서 문제를 푸는 것 같다
-> 이 부분은 비트 연산 공부 후 다시 풀어봐야겠다..


5번 문제(개수 세기)

https://www.acmicpc.net/problem/10807

public class Main {
    public static void main(String[] args) throws IOException{
       BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
       HashMap<Integer, Integer> cntMap = new HashMap<>();
       int N = Integer.parseInt(br.readLine());

       StringTokenizer st = new StringTokenizer(br.readLine());
       for(int i = 0; i < N; i++){
           int val = Integer.parseInt(st.nextToken());
           cntMap.put(val, cntMap.getOrDefault(val,0) + 1);
       }

       int target = Integer.parseInt(br.readLine());
       System.out.println(cntMap.getOrDefault(target, 0));
    }
}

profile
Journey for Backend Developer

0개의 댓글