전체 논리구조가 있어 단계별로 이해하고 지식을 쌓아가는 과목의 경우 여러 과목을 병행하기보다 한 과목씩 공부하는 편이 완결성이 높지만, 코딩테스트처럼 사고 훈련을 목적으로 하는 과목의 경우 매일 조금씩 반복하며 감을 잃지 않게 하는 편이 낫다. 따라서 어느 정도 Java 문법을 익힌 지금부터 매일 조금씩 코딩테스트를 풀기로 했다.
원래 코드가 간결하고 쉬운 Python이나 실행속도가 빠른 C++을 공부해 코딩테스트를 준비하는 선택지도 고려했었지만, 실제 개에 사용할 Java 언어를 선택하게 되었다. 앞으로의 공부와 개발 과정에서 계속 Java를 사용할 것이므로, 이후에도 계속 Java로 알고리즘 설계 역량을 기르는 것이 나을 것이다.
코딩테스트 연습은 프로그래머스 스쿨(https://school.programmers.co.kr/learn/challenges?order=recent)에서 할 예정이다. 아직 Java 사용도 미숙하고 자료구조나 알고리즘에 대한 지식이 전무하기 때문에, 오늘의 연습문제 중 입문자를 위한 Lv. 0 단계부터 풀어 보았다. 내 처참한 실력을 보아하니 앞으로 많은 난관이 예상된다ㅠㅠ
짝수의 합
아마 Lv. 0 문제 중에서도 아주 쉬운 편에 속하는 문제로 보인다. 단순히 짝수의 합을 구하는 문제다.
......라고 만만하게 생각하고 들어갔으나 코드를 작성하고 자신 있게 실행 버튼을 누른 순간...
결과는 처참하기 짝이 없었다. 창피하게도 아주 아주 초보적인 실수를 무려 두 가지나 저질렀다. 하나는 위에 기본적으로 int n이 선언되어 있는 것을 못 보고 다시 선언한 것이고, 하나는 수식에서 등호를 의미하는 == 대신 대입을 의미하는 =을 사용한 것이다.(이 부분은 적응이 잘 안 된다ㅠㅠ) 부끄러운 코드를 수정하고 다시 코드 실행 버튼을 눌렀다. 이번에는 과연...
ㅠㅠ
아직 초보적인 실수가 하나 더 남아 있었다. 나는 for 반복문의 변수를 n으로 선언해 조건식의 조건을 바꿔 가며 조작하는 방식을 구상했는데, 나 같은 쌩초보자들이 많이 저지를 것 같은 실수다. 기본적으로 조작하는 값은 조건이 아니라 아니라 변수의 value가 되어야 한다. 나는 초보적인 마인드로 1000이라는 숫자를 변경해 가며 산출값을 조절하면 될 것이라 생각했던 것이다.
따라서 다시 고쳐 보면...
드디어 성공했다. 결국 풀어냈다는 뿌듯함보다는, 여기서도 이렇게나 헤매는데 앞으로 어려운 코딩테스트 문제들을 잘 풀어나갈 수 있을까 걱정부터 앞선다. 열심히 훈련하면 가능할 것이라고 믿어 본다.
다만 이것도 완벽한 풀이는 아니었는데, 다른 사람들의 풀이를 보다 보니 아래 풀이가 훨씬 좋다.
좋은 코딩은 실행 과정에서 컴퓨터의 작업량을 최소화하는 코딩이다. 코딩의 간결함도 이쪽이 우위다. 이 방식이 내가 한 방식보다 훨씬 효율적으로 보인다. 사실 증감식을 i += 2로 하는 생각은 했었으나 그냥 if문을 활용해 보고 싶어 다른 방식으로 짜 보았다. 그러나 초기화식을 i = 2로 하는 부분은 미처 생각도 못했다. 문제에서 0 <= n <= 1000을 조건으로 했으므로, 단순히 n이 0일 때도 answer 변수가 반복문의 연산을 수행하도록 설계해야 한다고 생각했었다. 그래서 처음에는 해당 풀이를 보고 갸우뚱했다. 그러나 다시 생각해 보니, answer의 초기값은 0이기 때문에 n이 0인 경우 굳이 반복문에 진입해 연산을 수행할 필요가 없었다. 만약 나처럼 비효율적으로 코딩을 한다면 컴퓨터에게 미안해해야 하는 일이다.
물론 나처럼 푼 사람들이 훨씬 많았으나, 앞의 풀이가 더 좋다고 생각한다. else는 다들 습관적으로 써넣은 것 같은데 지금 식에서는 불필요하다.
팩토리얼
다음은 앞의 문제보다는 난이도가 조금 있는 문제다. 어떻게 할지 고민하다 for문으로 해 보기로 했다.
역시 실패했다. 문제에서는 i를 구하라고 되어 있는데, 나는 factorial value를 구해 버렸다ㅠㅠ
어느 시험이든 문제를 잘 읽는 것이 제일 중요하다는 사실을 다시금 상기하며 새로 코드를 짜 보았다.
원래 이렇게 하면 절대 안 되겠지만, 변수를 새로 선언하는 게 귀찮아서(사실 별로 귀찮은 일도 아니다) 그냥 answer 변수로 연산과 답까지 끝내 버렸다... 앞으로는 이렇게 하지 말아야겠다.
아... n이 3,628,800인 경우를 미처 생각 못했다. answer의 값이 n과 같아져서 if 조건문이 작동을 안 한다ㅠㅠ
성공은 했지만 코드가 길어져 조잡해진 모습이다.
while문을 이용해 푼 사람들과 나처럼 for문을 이용해 푼 사람들의 수가 비슷하지만, while문으로 푸는 편이 훨씬 간결하다. 정해진 횟수만큼 반복하는 경우에는 for문, 조건이 일치하는 동안 반복하는 경우에는 while문을 쓰는 것이 좋은데 잊어버리고 있었다. 다시 머릿속에 새겨 두어야겠다. 내 코드는 i++가 if 조건문 밖에 있어 i 값의 경우의 수를 나눠 적용할 수밖에 없어 보인다.
문제를 해결할 때마다 점수도 올려주는 모양이다. 사실 두 문제 다 틀렸는데 참 관대하다. 1단계에서는 내 스스로 답을 못 찾는 경우가 많을 것 같아서 걱정이다. 현재 내 수준을 보니 앞으로 갈 길이 너무나도 멀지만 코딩테스트 고수가 되기 위해 꾸준히 최선을 다해 한 걸음씩 나아가기로 다짐해 본다.
'Coding Test' 카테고리의 다른 글
Java 코딩테스트 연습 5일차(2) (프로그래머스 스쿨 Lv.0, 1061점) (2) | 2023.03.11 |
---|---|
Java 코딩테스트 연습 5일차(1) (프로그래머스 스쿨 Lv.0, 1055점) (0) | 2023.03.11 |
Java 코딩테스트 책 구입, 연습 4일차 (프로그래머스 스쿨 Lv.0, 1045점) (0) | 2023.03.10 |
Java 코딩테스트 연습 3일차 (프로그래머스 스쿨 Lv.0, 1037점) (2) | 2023.03.09 |
Java 코딩테스트 연습 2일차 (프로그래머스 스쿨 Lv.0, 1019점) (0) | 2023.03.08 |