https://programmers.co.kr/learn/courses/30/lessons/84325?language=java
코딩테스트 연습 - 4주차
개발자가 사용하는 언어와 언어 선호도를 입력하면 그에 맞는 직업군을 추천해주는 알고리즘을 개발하려고 합니다. 아래 표는 5개 직업군 별로 많이 사용하는 5개 언어에 직업군 언어 점수를 부
programmers.co.kr
직업군 추천하기
##문제설명
페이지에서 설명하는 문제는 다음과 같다.
1행의 2열부터 6열까지가 직업군,
2행부터 5행의 1열은 직업군 언어 점수이다.
예를 들어 SI직업군에서 JAVA의 언어 점수는 5점이고, GAME 직업군에서 C의 언어점수는 2점이라는 의미이다.
위의 6by6 크기의 점수표는 문자열 배열 table로 주어지고,
개발자가 사용하는 언어는 문자열 배열 languages
언어 선호도는 정수 배열 preference로 String table[], String languages[], int[] languages 3개의 변수가 매개변수로 주어졌을 때, 언어 선호도 * 직업군 언어 점수의 총합이 가장 높은 직군을 return 하는 함수(메서드)를 만드는 것이 테스트이다.
매개변수 String tabe[]의 값은 변하지 않는다.
String table[]은 2차 배열이 아닌 1차 배열로 입력되고 구분자로 띄어쓰기를 사용한 것을 알 수 있다.
문제 설명에과는 다르게 행과 열이 convert 되어져 있다.
위와 같이 만들어져 있다. 단, 열의 구분은 없이(띄어쓰기로 구분) 5행 배열 매개변수로 주어진다.
직업군 뒤의 언어 순서도래 5점부터 1점으로 입력되고, TABLE에 따로 데이터로 입력되어지진 않은 모습이다.
입출력 1번을 친절하게 설명해주고 결과값이 나오는 이유를 알려주는 모습이다. 처음 문제설명의 table 표와 같이 보면 쉽게 이해할 수 있다.
입출력 2번에선, 점수 총합이 같은 case를 출제 하였고, SI와 PORTAL의 점수가 55점으로 같지만,
알파벳순이 S가 P보다 뒤에 있기 때문에 PORTAL이 return되는 case를 친절히 알려주고 있다.
직업군의 앞 알파벳이 중복이 없기 때문에 직업군 앞의 알파벳 순만 처리해주면 될 것 같다.
##알고리즘
코딩에 앞서 문제를 정확하게 이해하고 어떤 알고리즘으로 작성할 지 생각해봤다.
1. 매개변수 table[]을 문제설명처럼 더 직관적으로 보이는 2차원으로 배열로 재구성한다.
2. 직업군마다 매개변수 language[]에 언어가 있는지 확인하고 있다면, preference에 있는 언어 선호 점수와 직업군 언저 점수를 곱해서 직업군 점수 표에 누적한다.
3. 직업군 점수 중 가장 높은 점수를 찾고 동점이 없다면 return 하면 된다.
4. 가장 높은 점수와 동점자가 있다면 직업군의 첫글자만 비교하여 가장 앞 알파벳 직업군을 return 할 것이다.
##알고리즘에 따른 코딩
1. 매개변수 table[]을 문제설명처럼 더 직관적으로 보이는 2차원으로 배열로 재구성한다.
매개변수 table[]의 데이터는 변하지 않고, 각 행의 길이가 동일하다는 점을 이용해
2차원 배열 arrayTable를 선언한 모습이고
위와 같이 만들 예정이었다. 각행의 입력된 직업군과 언어는 띄어쓰기로 구분되어 있어, String 클래스의 split 메서드를 이용하였다.
2. 직업군마다 매개변수 language[]에 언어가 있는지 확인하고 있다면, preference에 있는 언어 선호 점수와 직업군 언저 점수를 곱해서 직업군 점수 표에 누적한다.
score[i]는 int형 배열이고, 직업군의 언어 선호도 점수가 저장될 배열이다 따라서 길이는 직업군 길이 만큼 만들었다.
행마다 split 메서드를 이용해서 2차원 배열을 만들었고, 배열의 0번째 index는 직업군이기 때문에 1부터 for문이 실행된다. 개발자 사용 언어가 입력된 languages와 같으면 배열의 위치마다 언어 선호도 점수와 직업군 선호 언어 점수를 곱해서 score 배열에 저장하는 모습이다. 위 3중 for문을 모두 수행하면 score 배열에는 각각의 직업군의 점수들이 저장된다.
3. 직업군 점수 중 가장 높은 점수를 찾고 동점이 없다면 return 하면 된다.
점수 총합의 동점이 없는 경우,
0번째 idx (SI의 총합)의 score를 max에 저장하여, for문을 1부터 시작,
CONTENTS 직업군부터 GAME직업군까지 순차적으로 비교하여 max에 최고스코어총합을 저장하고 maxIdx는 그 총합을 갖는 index를 저장하여, table index의 적용시키면 가장 높은 점수를 갖는 직업군을 return 할 수 있다.
4. 가장 높은 점수와 동점자가 있다면 직업군의 첫글자만 비교하여 가장 앞 알파벳 직업군을 return 할 것이다.
최고 총합 점수의 동점자가 있는 경우, String 인 직업군의 변수를 charAt 메서드를 이용해서 첫글자만 가져와 비교하는 모습이다. char형의 비교가 더 작을 수록 알파벳은 앞순이기 때문에 더 작은 char를 갖는 변수를 sMax에 저장하는 모습이다.
위 글은 문제해결을 위한 전체 코드의 공개가 아닌, 문제 해결을 위한 과정에 대한 도움의 글이다.
출처 : Programmers.com(프로그래머스)
프로그래머스 연습문제 - 핸드폰 번호 가리기(JAVA) (0) | 2021.08.26 |
---|---|
프로그래머스 연습문제 - 행렬의 덧셈(JAVA) (0) | 2021.08.26 |
프로그래머스 연습문제 - x만큼 간격이 있는 n개의 숫자 (JAVA) (0) | 2021.08.25 |
프로그래머스 연습문제 - 직사각형 별찍기(JAVA) (0) | 2021.08.24 |
프로그래머스(PROGRAMMERS) (0) | 2021.08.23 |
댓글 영역