달달한 스토리

728x90
반응형

출처 핀터레스트

 

오늘은 여자 친구와 하루 종일 공부를 했다.

 

평소에 하루에 하나씩 풀자던 코딩 테스트를 자주 풀지 못해

 

오늘 이렇게 하루종일 풀게 되었다.

 

하나하나 자세히 설명하기엔 시작은 부족하지만, 조금 설명을 해보겠다.

 

10809

 

public class Test10809 {
    //알파벳은 총 26개
    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int[] arr = new int[26];

        //모든 값 -1로 초기화
        Arrays.fill(arr, -1);

        String s = br.readLine();

        for(int i = 0; i < s.length(); i++) {
            char ch = s.charAt(i);

            if(arr[ch - 'a'] == -1) { //'a'는 97 -> ex) d(100) - a(97)
                arr[ch - 'a'] = i;
            }
        }
        
        for(int result : arr) {
            System.out.print(result + " ");
        }
    }
}

이 문제는 한번 풀어보고 어려워서 답안을 참고하였다.

 

우선 알파벳이 26개라는 것을 인지하고 시작하는 것이 좋고,

 

배열 하나를 만들어 모든 값을 -1로 초기화해두고 시작하는 것이 좋은 것  같았다.

 

게다가 이번 코딩 테스트 주제들이 거의 char로 인한 아스키코드끼리에 차이를 얻어

 

정수를 얻는 문제가 많아 헷갈리는 것이 많았는데, 문자에 익숙해지는 데 좋았던 문제였던 것 같다.

 

1152

 

public class Test1152 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");
        int cnt = 0;
        while(st.hasMoreTokens()) {
            st.nextToken();
            cnt++;
        }
        System.out.print(cnt);
    }
}

이 문제는 생각보다 간단했다.

 

띄어쓰기를 split 하는 방법도 있겠지만,

 

반응형

 

나 같은 경우는 토큰이 없을 때까지 while문을 돌렸으며,

 

띄어쓰기에 횟수마다 cnt를 증가시켜주었다.

 

2675

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        int T = Integer.parseInt(br.readLine()); //테스트 수
        
        for(int i = 0; i < T; i++) {
          st = new StringTokenizer(br.readLine(), " ");
          int R = Integer.parseInt(st.nextToken()); //각 문자열 반복 횟수
          String str = st.nextToken(); // 반복해야할 문자열
            
          for(int j = 0; j < str.length(); j++) {
              char ch = str.charAt(j);
              for(int k = 0; k < R; k++) {
                  System.out.print(ch);
              }
          }
            System.out.println();
        }
    }
}

이 문제는.. 어떻게 풀었지..

 

많이 풀어서 기억은 잘 안 난다..

 

주석에 써놓은 대로 문자열에 반복 횟수와 반복해야 할 문자열을 받아

 

다음과 같이 코드를 구성했다.

 

1157

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) throws IOException {
       BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
       String str = br.readLine();

       //알파벳 배열
       int[] arr = new int[26];

       //각 문자의 갯수를 올려준다.
       for(int i = 0; i < str.length(); i++) {
           //대문자 범위
           if(str.charAt(i) >= 'A' && str.charAt(i) <= 'Z') {
               //A를 뺌으로서, 해당 배열에 숫자에 카운트를 올려준다.
               arr[str.charAt(i) - 'A']++;
           }
           else { //소문자 범위
               arr[str.charAt(i) - 'a']++;
           }
       }

       //최댓값 찾고 출력하기

        int max = -1;
        char result = '?';
        for(int i = 0; i < 26; i++) {
            if(arr[i] > max) {
                max = arr[i];
                result = (char) (i + 65); //대문자로 바꾸어 줘야 하기 때문이다.
            }
            else if(arr[i] == max) {
                result = '?';
            }
        }
        
        System.out.print(result);
    }
}

꽤나 까다롭고 어려워 답을 보았던 문제이다.

 

char에 익숙하지 않았던 나한테는 어려웠던 문제이다.

 

아스키코드를 보면서 푸니까 그렇게 어렵진 않았다.

 

2908

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");

        String A = st.nextToken();
        String B = st.nextToken();

        StringBuilder a = new StringBuilder();
        StringBuilder b = new StringBuilder();

        for(int i = 2; i >= 0; i--) {
            a.append(A.charAt(i));
        }

        for(int i = 2; i >= 0; i--) {
            b.append(B.charAt(i));
        }
        System.out.print(
                parseInt(a.toString()) > parseInt(b.toString()) 
                        ? a : b
                );
        
    }
    
    private static int parseInt(String str) {
        return Integer.parseInt(str);
    }
}

삼항 연산자와 차감 반복문을 쓴 문제이다.

 

이 문제도 어렵지 않게 풀었다.

 

charAt() 메서드에 익숙해지는 중이다.

 

5622

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder(br.readLine());

        int time = 0;

        for(int i = 0; i < sb.length(); i++) {
            switch (sb.charAt(i)) {
                case 'A': case 'B': case 'C':
                    time += 3;
                    break;
                case 'D': case 'E': case 'F':
                    time += 4;
                    break;
                case 'G': case 'H': case 'I':
                    time += 5;
                    break;
                case 'J': case 'K': case 'L':
                    time += 6;
                    break;
                case 'M': case 'N': case 'O':
                    time += 7;
                    break;
                case 'P': case 'Q': case 'R': case 'S':
                    time += 8;
                    break;
                case 'T': case 'U': case 'V':
                    time += 9;
                    break;
                case 'W': case 'X': case 'Y': case 'Z':
                    time += 10;
                    break;
                default:
                    //1번
                    time += 2;
                    break;
            }
        }
        System.out.print(time);
    }
}

문제만 보면 솔직히 많이 어려울 것이라 생각했던 것 과는

 

달리 switch문을 사용하여 제일 간단하게 풀었던 문제였다.

 

2941

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String str = br.readLine();

        //크로아티아 알파벳 갯수
        int count = 0;

        //알파벳 조건
        String[] arr = {
                "c=", "c-", "dz=", "d-", "lj", "nj", "s=", "z="
        };

        //카운트용 스트링
        String cntStr = str;

        //조건에 맞는 값 전부 1로 바꾸기
        for (String i : arr) {
            //조건에 포함되어있을때
            if (str.contains(i))
                //카운트를 세기 위한
                cntStr = cntStr.replaceAll(i, "1");
        }

        //변환된 카운트 받기
        count += countStar(cntStr, '1');

        String result = cntStr.replaceAll("1", "");

        //제거 하고 남은 문자 갯수
        int leave = result.length();

        System.out.print(count + leave);
    }

    //문자열에 몇개나 있는지 세주는 메서드
    private static int countStar(String str, char ch) {
        int cnt = 0;

        for (int i = 0; i < str.length(); i++) {
            if (str.charAt(i) == ch) {
                cnt++;
            }
        }
        return cnt;
    }
}

오늘 제일 고전했던 문제이다...

 

이 문제로 2시간은 날린 것 같다.

 

막상 다 푸니 별거 아니었지만,

 

반례를 쉽게 찾지 못해 커뮤니티에 글을 두 번이나 올렸다.

 

ㅜㅜ 반복문을 사용할 때 저런 식을 each문으로 사용해야

 

메모리 속도가 더 빨라진다는 것을 알았다.

 

이 글을 다 쓰고 더 문제를 풀어 볼 생각이다.

 

한 번에 이렇게 쓰니.. 힘들다...

728x90
반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band
loading