자바/백준

[백준 1672] DNA 해독

슈슈버거 2024. 8. 16. 02:25

문제

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


내가 작성한 코드

import java.io.*;

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

        int N = Integer.parseInt(br.readLine());
        String dna = br.readLine();

        char result = dna.charAt(N - 1);

        for (int i = N - 2; i >= 0; i--) {
            char current = dna.charAt(i);
            result = combine(current, result);
        }

        System.out.println(result);
    }

    private static char combine(char a, char b) {
        switch (a) {
            case 'A':
                switch (b) {
                    case 'A': return 'A';
                    case 'C': return 'A';
                    case 'G': return 'C';
                    case 'T': return 'G';
                }
                break;
            case 'C':
                switch (b) {
                    case 'A': return 'A';
                    case 'C': return 'C';
                    case 'G': return 'T';
                    case 'T': return 'G';
                }
                break;
            case 'G':
                switch (b) {
                    case 'A': return 'C';
                    case 'C': return 'T';
                    case 'G': return 'G';
                    case 'T': return 'A';
                }
                break;
            case 'T':
                switch (b) {
                    case 'A': return 'G';
                    case 'C': return 'G';
                    case 'G': return 'A';
                    case 'T': return 'T';
                }
                break;
        }
        return ' ';
    }
}

 

맨 처음엔 Python과 마찬가지로 Map에 규칙들을 다 저장해놓고
뒤에서부터 그 규칙들과 비교하며 문자열을 갱신하는 방식으로 작성했다.

 

"메모리 초과"를 만나버렸다

그래서 문자열 떄문인가 싶어 새로 만들지 말고 그냥 기존 변수를 이용하는 식으로 했는데 그래도

"메모리 초과" 뜨더라

 

그 순간, Map에 규칙들을 미리 다 저장해놓는 것이 원인이겠구나 싶었다.

그래서 즉각적으로 비교해줄 수 있는게 무엇이 있을까 생각했고

switch문을 이용한다면 Map을 이용해 거기서 찾는거보다 좋은 선택이 되지 않을까 싶었다

 

두 문자열을 이용해 1개의 새로운 염기가 나와야 하는거니 2개를 인자로 받아 return하도록 해주었다.

return ' ';은 도달하지는 않지만 컴파일 에러를 위해 추가해주면 좋다고 하더라.