COS Pro 1급 Java 만점자 후기 및 공략

배경

회사에서 COS Pro 시험 응시를 장려하는 분위기여서, 솔선수범 하자는 마음으로 시험을 응시하였다.

운이 좋았는지 1,000점 만점을 받았다. 시간이 지나면 기억에서 지워질 것 같아서 글로 남기고자 한다.

 (사실 조회수도 좀 나올것같아서....) 

시험 설명

프로그래머스 스타일로 10문제가 제출 된다. 기출 문제가 6회 공개 되어있어서 나는 구름을 이용해서 준비했다.

1시간 30분씩 타이머를 켜놓고 5개의 기출문제를 풀었다. 본 시험을 위해 약 7시간 30분 투자한것 같다. 

컴퓨터 공학과를 졸업했다면 조금만 준비해도 합격하는 것은 크게 어렵지 않을 것 같다.

600점 이상 획득하면 합격이다.

https://edu.goorm.io/lecture/17301/cos-pro-1%EA%B8%89-%EA%B8%B0%EC%B6%9C%EB%AC%B8%EC%A0%9C-java

실제 시험과 비슷한 부분과 다른 부분에 대해서는 아래 유형별 공략에 대해서 언급할때 이야기 하겠다.

사용 언어

사용가능한 언어는

C, C++, Java, Python이다.

일반적으로는 Python을 이용해서 시험을 많이 준비한다. Array 처리나 Built-in Method가 강력한게 많아서 Java 처럼 불필요한 Class나 Method를 암기할 필요가 없다.

그래서 개발을 처음 입문하는 지원자는 Python을 추천한다.

Java 기초를 어느정도 공부했고, 잘 사용가능한 수준이 되었는지 테스트 해보고 싶다면 Java로 도전을 해도 되지만, 다른 언어에 비해서 패널티가 있다고 생각한다. 시험용으로 Java 언어 선택은 신중하게 하자.

Java에서 암기해야할 내용은?

시험장에서 제공하는 IDE는 자동완성 기능이 없다. Java docs도 제공해주지 않는다.

다음 항목은 암기를 하고 준비를 하는게 좋다.

배열 

https://www.w3schools.com/java/java_arrays.asp

Cos에서는 int[], String[], char[] 정도면 될 듯하다. 조금더 깊게가면 2D Array까지는 공부하는 것을 추천한다.

int[][], String[][], char[][]

Arrays Class와 함께 배열을 잘 다루면 편리한 부분이 많다.

그 외에 deeToString이나 copyOfRange, fill 등의 유용한 기능들이 많이 있는데, 현재 기준으로는 사용하지 않아도 문제를 푸는데는 지장이 없는 것 같다.

Collections

 https://docs.oracle.com/javase/8/docs/technotes/guides/collections/overview.html

Collection은 

List, Deque(Queue), Set, Map이 있는데, 이중에서 Implementations Class로 

ArrayList, LinkedList(stack, queue 용도로 사용), HashSet, HashMap 의 사용법을 암기해야 한다.

add, put, set, remove, get, peek, addFirst, addLast, peek, peekFirst, peekLast와 같이 자주 사용되는 Method는 꼭 암기하자.

TreeSet이나 TreeMap, LinkedHashSet, LinkedHashMap을 활용하는 정도의 문제 수준은 안나오는 것 같다.

그리고 꼭 Comparator를 통한 sorting처리도 암기 필요하다.

https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Comparator.html

String

https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/String.html

String은 정말 완전히 이해하고 암기가 되어야 한다.

특히 많이 사용되는 Method는 아래와 같다.

charAt, compareTo, concat, contains, repeat, replace, replaceAll, split, startsWith, trim, toCharArray, toLowerCase, toString, toUpperCase, valueOf, substring

이외에도 indexOf 같은 메서드도 암기하면 좋지만 준비하면서 본 method를 쓸일은 없었다.

기타

그외에 Integer같은 Class들도 잘 사용 해야 하는것이 당연하겠지만, 준비하면서 valueOf말고 다른 용도로 딱히 써본적은 없는 것 같다.

System.out.println 같은것은 너무 당연한거라 별도 언급하지 않겠다.

알고리즘 난이도는?

다른 후기들에서도 많이 언급하고 있지만 전반적으로 easy 수준이다. 하지만 문제를 풀다보면 medium수준 질문도 확실히 존재한다. 그렇다고 해서 일부러 어려운 문제를 준비할 필요는 없을 것 같다.

답안을 테스트하는 test cases가 큰것 같지 않고, 최적화에 대한 채점은 거의 없지 않나 싶다.

예를 들자면 기출 3차 전광판 문구 출력 문제를 보자.

https://edu.goorm.io/learn/lecture/17301/cos-pro-1%EA%B8%89-%EA%B8%B0%EC%B6%9C%EB%AC%B8%EC%A0%9C-java/lesson/839419/3%EC%B0%A8-%EB%AC%B8%EC%A0%9C5-%EC%A0%84%EA%B4%91%ED%8C%90-%EB%AC%B8%EA%B5%AC-%EC%B6%9C%EB%A0%A5-java

"______" 이렇게 생긴 전광판에 "_____a", "____ab", "___abc" 이런식으로 1초씩 문자열이 자리를 이동하는 문제이다.

눈에 보이는 데로 프로그램을 짠다면 "________abcdefgh" 이렇게 문자열을 만들고 앞에서 부터 한자리씩 자르기로 처리하는 방식이 가장 쉽다.

아래 예에서 "[" , "]"이 사이가 전광판이라고 생각해 보자. 

"[_______a]bcdefgh_", "[______ab]cdefgh__", "[_____abc]defgh___"

한자리씩 모든 초를 for문을 돌려서 실제로 동작 시키면 된다. 하지만 이는 최적화 되지 않았다. 모든 경우를 실제로 돌리니까.

이는 시간복잡도로 O(N)이 된다. 하지만 조금더 생각해 보면 O(1)로 해당 문제를 풀 수 있다. (이건 다음에 문제 해설 작성하게 되면 ...올려보겠다)

하지만 본 시험은 O(N) 정도의 답안으로 Pass가 가능하다. 

하고 싶은 말은 최적화 따위 일단 접어두자, 시간이 남는다면 모르겠지만 brute force로 괜찮다.

문제 유형은?

문제 유형은  "디버깅", "설계", "코드이해"로 나누어진다. 

아래 내용을 보고 점수의 분포와 유형을 생각해 보자. 참고로 배점은 문제의 난이도에 따라서 변경이 될 수 있다.

코드이해는 빈 공백을 주고 해당 공백에 어떤 코드가 들어가는지 확인하는 질문이다.

합격을 위해서는 4문제 모두 맞추는 것이 좋다. 420점,

여기에 180점만 더하면 되는데

한줄 바꾸기 문제인 디버깅 3문제를 다 맞추면 200점이다.

코드이해와 디버깅 문제를 다 풀기만 하면 6백 20점으로 통과가 된다.

하지만 아쉽게도 이곳에서 실수가 많이 나오는 것 같다.

그리고 시험장 IDE에서 다른 Test Case를 테스트 해볼 방법을 제공하지도 않는다.

그래서 설계 문제인 알고리즘 문제 하나는 최소한 무조건 푼다고 생각하고 접근해야 한다.

문제별 전략

코드이해

빈칸을 주고 해당 빈칸에 알맞는 코드를 넣는 시험이다.

1차 문제3번 계산기 by문자열 화면을 보자. 

시험장에 가면 위와 같이 빈칸이 표시되고 해당 빈칸에 코드를 넣을 수 있게 문제를 제공한다.

다만 구름과 다른점은

  • 해당 빈칸외에는 아무것도 할 수 없다

그래서 System.out.println도 사용해 볼 수 없다. 오로지 머리로만 계산해야 한다.

해당 문제를 보면 2가지 유형이 있다.

  • 만들어져 있는 Method를 넣는 유형 : 예를 들자면 위 문제는 func_a, func_b, func_c가 어디에 들어갈지 찾는 유형이다.
  • Method 내부에 코드를 채워 넣는 유형 : Method내부에 로직을 완성시키는 유형이다.

위에서 보면 @@@ <- 이게 빈칸 영역이다.

첫번째 유형의 경우는 질문을 이해하지 않아도 풀수 있는 유형이다.

이 문제 같은 경우 func_a의 return 은 int이고 func_c의 return 은 Pair이다. 위에서 두번째 줄에 있는 Pair 리턴이 가능한 것은 func_c밖에 없다. func_a와 func_c는 둘다 int return이 가능하지만 int parameter가 3개가 있는 Method는 func_a가 유일하다.

이와 같이 return 타입과 파라메터만으로 로직을 추측가능하다.

하지만 로직에 대한 내용을 넣는 두번째 케이스는 문제를 이해해야 한다. 이 부분이 다소 어려움이 있다.

그래서 시험에 들어가서 문제가 길고 이해가 어렵울것 같다면 일단 패스하고 다른 문제를 먼저 푸는 것이 좋다.

최종 제출까지 문제는 이동할 수 있다.

기출 문제를 풀면서 코드이해 문제를 오해한것이 있는데, 실제로 시험장에서 나오는 문제는 위의 2가지 케이스가 분리되어서 나오지 않는다.

두개가 같이 섞여서 나온다. 결론적으로는 문제 자체를 이해하는데 시간을 소요해야 한다.

그리고 이 Tip이 중요한데, 빈칸채우기는 로그를 찍어볼 수 없어서 내가 어떤 부분을 잘못했는지 확인하기 어렵다.

그래서 시간이 좀 남는다면 빈칸채우기에 있는 부분적 코드를 설계 문제로 copy 해와서 로깅을 찍어 볼수 있다. 

오해가 있을 수 있는데, 빈칸 외의 곳은 복사가 되지 않는다. 나는 빈칸에 작성한 내 코드가 정상적으로 작동하지 않는것 같아서, 빈칸에 내가 작성한 코드를 copy해서 설계하기 코드에 붙여넣고 로그를 찍어서 잘못된 점을 찾았다.

기출문제와 다른점은 한줄에 긴 코드가 들어갈 여지가 있다는 것이다. 한마디로 기출보다는 어려웠다.

디버깅

한줄 바꾸기 문제이다.

위와 같이 한줄을 수정하라는 가이드는 프로그램상에 별도로 있지 않는다. 그래서 solution 메서드 내부에 마음데로 여러줄 수정해 보고 로그도 찍어볼 수 있다.(있었던거 같다. 하루밖에 지나지 않는데... 가물가물 하네)

그래서 이문제를 접근할 때는 문제를 보자마자 "실행"을 눌러주자. 실행 결과는 2가지로 나올 것이다.

  • 컴파일 Exception or Out of Index
  • 틀린 해답

첫번째와 같은 경우는 어디를 고쳐야 할지 감을 잡을 수가 있다.

예를 들자면 아래는 6차 문제4 카드섞기 이다.

https://edu.goorm.io/learn/lecture/17301/cos-pro-1%EA%B8%89-%EA%B8%B0%EC%B6%9C%EB%AC%B8%EC%A0%9C-java/lesson/839448/6%EC%B0%A8-%EB%AC%B8%EC%A0%9C4-%EC%B9%B4%EB%93%9C-%EC%84%9E%EA%B8%B0-java

최초 문제를 그대로 실행하게 되면 out of bounds Exception이 나는 것을 볼수 있다. 그것도 17번 줄에서 오류가 나는 것을 알 수 있다. 이를 통해서 17번 주변이 수정 되상이 될 것이라고 미리 예감 할 수 있다.

두번째 경우는 어쩔 수 없이 문제를 다 읽어 보긴 해야하는데, 추측이 가능한 경우가 있을 수 있다.

예를 들어서 Run length 알고리즘을 만든다고 생각해 보자.

"aaaabbc" 이 문자열의 답은 "a4b2c1"이다 그런데 실행한 결과를 보니 "a1a1a1a1b1b1c1"로 나온다면 n번째 char와 n+1번째 char를 비교하는 부분이 잘못 작성 되었을 수 있다고 예감할 수 있다.

중요한것은 한 줄 어디 고칠지 확인이 되면, 꼭! "초기화" 버튼을 눌러서 문제를 재 생성하고 수정할 곳만 수정하자!

 

설계

알고리즘 문제이다. 왜 알고리즘 문제를 설계라고 명명했는지는 잘모르겠다. 

위에 한번 언급한것 처럼 알고리즘 문제는 brute force로 생각하고 풀자.

그리고 혹시 모르니까 

import java.util.*;

은 암기하고 하자. Collection 사용이 필요할 수도 있다.

 

UML

UML을 따라서 그리는 문제도 하나 있는데,

어느 파트에 속하는지는 잘 기억이 나지는 않는다. 아마 빈칸 넣기(코드이해)아닌가 한다.

extends, implements 등은 암기가 필요하고, 기억나기로는 코드 내부 로직에 대한 부분도 빈칸으로 문제가 제출되었다.

시간관리

나는 자신있는 모든 문제를 60분내에 푸는 것을 목표로 했다. 그래서 matrix나 문제의 지문이 길거나 이해하기 어려운 문제는 바로 풀지 않고 skip했다.

그리고 60이내로 풀수 있는 문제를 모두 풀고, 안푼 문제중에 지문 이해가 가장 쉬운 문제부터 순차적으로 풀었던것 같다. 

정리

이런 저런 쓸데없는 소리를 많이 쓰긴 했는데, 기출문제로 연습하면 누구나 취득 가능할 것이라고 생각한다.

누군가에게 도움이 되길 바란다.

728x90
반응형

'Problem Solving' 카테고리의 다른 글

Count Array Pairs Divisible by K  (0) 2022.02.20
Longest Increasing Subsequence  (0) 2021.10.03
Decode Ways  (0) 2021.09.22
Arithmetic Slices  (0) 2021.09.22
Shortest Path Visiting All Nodes  (0) 2021.09.16