2022. 11. 27. 16:48ㆍ프로그래밍/알고리즘
최근에 군대를 전역하고, 다시금 학업의 길로 돌아가기 위해, 다시 공부해야하는 과목인 Java 를 공부하게되면서, 사실 이전에는 언어만 공부했다면, 이젠 취업준비겸 알고리즘 공부도 좀 해볼겸하여, 프로그래머스 와 백준 이라는 사이트에서 공부를 하고있습니다.
Baekjoon Online Judge
Baekjoon Online Judge 프로그래밍 문제를 풀고 온라인으로 채점받을 수 있는 곳입니다.
www.acmicpc.net
프로그래머스 : https://programmers.co.kr
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
위의 두개 사이트인데, 두 사이트가 각각 난이도를 측정하는 방식이나, 사용자를 평가하는 방식에는 있어서 차이를 가지고 있지만, 대체적으로 비슷한 느낌의 사이트 입니다. 백준이야 원래 기존부터 유명해서 하고있었는데, 최근에 지인분의 추천으로 프로그래머스를 접하고 직접 문제를 풀어보게되면서, 개인적으론 프로그래머스에서 제공하는 UX/UI가 더 편하다고 느껴져, 최근에 자주 애용하고 있습니다.
위 문제(Program) 에 대해 다음과 같이, 설명을 제공하고 이를 정확성 (결과 기준), 효율성 (시간복잡도 기준)으로 정답을 여부를 확인합니다. 물론 효율성은 일정 레벨이상의 문제에만 제공되는거 같습니다. (위 문제는 가장쉬운 단계인 Lv.0)
위 문제를 해결 하는데 있어서, 이 글을 읽고 계시는 분들 모두 그렇게 어렵지 않게 문제를 해결 할 수 있을거라고 생각합니다.
문제를 읽어가면서, 바로 코드를 작성하여 풀 수 있는 분들도 분명 계실겁니다.
하지만 다음 문제는 어떨까요?
https://school.programmers.co.kr/learn/courses/30/lessons/118666
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
이 문제는 프로그래머스가 제공하는 난이도 (Lv .0 ~ 5) 중 Lv.1 에 해당하는 문제입니다.
문제 설명만을 읽어본다면 간단히, 성격유형 점수를 메겨 4글자의 문자열을 반환하면 된다고 하지만, 막상 코드를 작성하고 프로그램을 작성하려고 한다면, 설명을 두번 세번 다시 읽어보거나, 문제에서 주어지는 데이터 타입이나 지정된 값이 헷갈리진 않나요?
물론 이 문제도 풀어나가는 과정자체가 엄청 복잡하지 않아, 순차적으로 해결이 가능한 문제입니다만, 프로그래밍을 이제 막 시작하신분들이나, 익숙하지 않은 언어로 푸시는 분들에게는 조금 어려울 수 있다고 생각합니다.
사전적의미의 프로그래밍 (Programming)이라는 행위 자체는 간단히 말해서 "사람의 사고과정"을 컴퓨터가 이해할 수 있도록 번역하는 과정이라고 생각을 하고있습니다. 근래에 들어서는 사용되는 대부분의 언어들이 인간의 언어와 비슷한 고등 프로그래밍 언어 (High - Level Programming Language)이지만, 프로그램이 동작하는 과정을 완전히 인간의 언어로 번역 되어진 것은 아닙니다.
그렇다면 코드를 작성하는 프로그래머(작성자)는 주어진 조건이나 목적성을 파악하고, 그 내용을 컴퓨터언어로 번역을 해야하는 것인데, 저처럼 프로그래밍이 익숙하지 않은분들은, 이 과정이 어려울거 같습니다.
그래서 제가 최근에 코딩테스트 연습을 할때 자주 활용하는 방법인 "알고리즘 시각화 (Algorithm Visualisation)"에 대해 말씀 드리고자 합니다.
알고리즘 시각화는 해당 프로그램의 진행 순서, 데이터 등 알고리즘을 구성하는 것들을 작성자 본인이 인지할 수 있는 범위내에서, 자유롭게 그림과 글을 사용하여 작성하는 순서도 (Flow Chart)라고 받아 들이시면 쉬울 것 같습니다.
그럼 아까 보여드린 "성격유형검사" 문제를 예로 순서도를 그려 보겠습니다. (위에서 부터 읽어내려가며, 작성을 할테니, 글을 읽어보시는 분들도 한번 작성해보시면서 비교해 보시면 도움이 될 것 입니다.)
<solution>
1. 결과물은 4글자로 구성된 성격유형 (4가지 지표, 각 2개유형씩), 결과 최대갯수는 16.
2. 문자열 배열과 , 정수 배열 데이터를 각각 하나 씩 입력 받음
-문자열 배열 (survey) : 성격유형검사지의 문제유형, 각각의 입력값은 "RT", "TR", "FC", "CF", "MJ", "JM", "AN", "NA" 로 한정
-정수 데이터 (choices) : 문제에 해당하는 답변, 각각의 입력값은 1~7 로 한정.
각 배열의 같은인덱스 원소는 서로 "문제 - 설문답변" 의 관계이며, 이를 통해 점수를 측정, 4를 기준으로 문자열앞글자는 4보다 낮은숫자를 입력받으면 점수 가산, 문자열 뒷글자는 높은숫자를 받으면 점수 가산되어 측정 되는 방식. 두 배열의 길이 같음.
3. 더 높은 점수를받은 성격유형을 결정, 두 가지 점수같으면 사전순서, 검사자의 성격유형 검사결과를 "지표번호 순서대로" 반환.
(위의 조건 참조하여)
저의 순서도는 이렇게 구성되어 있습니다. 여기서만 끝난다면, 문제에서 필요한거만 메모를 할 뿐이지만, 알고리즘 시각화라는 이름답게, 여기서 알고리즘 (연산과정-방법의 명령어 집합)에 관련된 데이터 타입들도 의사결정을 할 수 있게 위에서 작성한 순서도에 다시한번 코멘트를 남겨 줍니다. (Java 기준 작성)
1. 성격유형 결과물을 반환할 데이터 String 타입 변수하나 (프로그래머스에서 answer 라는 이름으로 제공)
2. 두가지 배열의 길이가 같음으로, 하나의 반복문 (for, loop) 블록에서 연산가능
3. 각 지표에서 "더" 높은 점수를 받은 유형을 나타내야 함으로 점수를 담을 정수 배열 int[] score (크기는 4), 답변 4보다 크고 작음을 기준으로 유형에대한 점수를 책정함으로(choice 값이 4라면 어느지표에도 점수를 부여하지않음으로), 0번 인덱스 (R,T), 1번 (C,F), 2번 (J,M), 3번 (A,N)에 지표에대한 합산점수 저장.
총 정리 : 반복문에서 점수를 받으며, 각 지표에 대한(조건문 활용) 합산 점수를 측정하고, 이를 비교하여 해당하는 결과 지표를 결정하고, 이를 answer 문자열에 저장하여 반환한다.
저는 이와 같은 의사결정을 하였습니다.
자잘하게, 추가할 변수들은 생략이 되었으나, 위의 순서도를 토대로 작성하여 정답을 받았습니다!
알고리즘 시각화는 사실 누군가가 명명한 이론은 아니고, 제가 프로그래밍 자체에 대해 개념이 많이 부족한 시기에, 교수님께서 프로그래밍이 어렵게 느껴진다면, 시각화 시키면 도움이 된다고하여, 예전 부터 쉬운코드들도 위와 같은 방법을 사용하여, 공부를 해왔습니다.
이와 같은 방법이 누군가에게는 귀찮고, 불필요한 방법이 될 수 있지만, 어느정도 복잡한 프로그램에 대한 코드를 작성할때, 입력하는 값과, 연산과정을 살펴보며, 활용해야하는 자료구조를 결정할때에 많은 도움이 되었습니다.
오늘 알고리즘 시각화에 대한 정보가 여러분의 프로그래밍 학습에도 유익하면 좋겠습니다.
-이상-
2022.11.27