Codewars 문제풀기 (03/08)
Complementary DNA
- A, T, G, C로 이루어진 문자열을 인자로 받는다
- A는 T, T는 A, G는 C, C는 G로 바꿔 반환한다.
- A, T, G, C외의 문자는 없다고 가정한다.
1. Test를 만들었다
-
A로만 이루어진 문자열
replaceAll메소드로 A를 T로 변환해서 리턴하자
public class DnaStrand { public static String makeComplement(String dna) { return dna.replaceAll("A", "T"); } }
-
A와 C로만 이루어진 문자열
마찬가지로 A를 T로 C를 G로 변환해서 리턴한다.
public class DnaStrand { public static String makeComplement(String dna) { return dna.replaceAll("A", "T").replaceAll("C", "G"); } }
-
A, T, C, G 모두 있는 문자열
이전처럼
replaceAll("A", "T").replaceAll("T","A")
를 쓰면 A가 T로 변환되고 변환된 T까지 A로 변환되기 때문에 결과값이 A만 남게된다. 그래서 다른방법 선택public class DnaStrand { public static String makeComplement(String dna) { StringBuilder result = new StringBuilder(); for (int i = 0; i < dna.length(); i++) { switch (dna.charAt(i)) { case 'A': result.append("T"); break; case 'T': result.append("A"); break; case 'C': result.append("G"); break; case 'G': result.append("C"); break; default: break; } } return result.toString(); } }
리팩토링 없이 바로 제출
2. 답 비교, 느낀점
Best Practice 가장 많이 받은 코드
public class DnaStrand {
public static String makeComplement(String dna) {
char[] chars = dna.toCharArray();
for(int i = 0; i < chars.length; i++) {
chars[i] = getComplement(chars[i]);
}
return new String(chars);
}
private static char getComplement(char c) {
switch(c) {
case 'A': return 'T';
case 'T': return 'A';
case 'C': return 'G';
case 'G': return 'C';
}
return c;
}
}
- 로직 자체는 같지만, switch문을 통해 변환하는 부분을 메소드로 추출하여 더 깔끔하게 표현했다.
Best Practice 두번째로 많이 받은 코드
public class DnaStrand {
public static String makeComplement(String dna) {
dna = dna.replaceAll("A","Z");
dna = dna.replaceAll("T","A");
dna = dna.replaceAll("Z","T");
dna = dna.replaceAll("C","Z");
dna = dna.replaceAll("G","C");
dna = dna.replaceAll("Z","G");
return dna;
}
}
- 흔히 swap 메소드를 구현하는것처럼 “Z”라는 임시 문자열로 변환 후 “Z”를 다시 “T”, “G”로 변환하여 풀었다. 개인적으로 이 방법이 더 좋다고 생각한다.
4. 궁금한거 공부
- 없음
댓글남기기