개발자가 사용하는 언어와언어 선호도를 입력하면 그에 맞는 직업군을 추천해주는 알고리즘을 개발하려고 합니다.
아래 표는 5개 직업군 별로 많이 사용하는 5개 언어에직업군 언어 점수를 부여한 표입니다.
점수SI CONTENTS HARDWARE PORTAL GAME
5
JAVA
JAVASCRIPT
C
JAVA
C++
4
JAVASCRIPT
JAVA
C++
JAVASCRIPT
C#
3
SQL
PYTHON
PYTHON
PYTHON
JAVASCRIPT
2
PYTHON
SQL
JAVA
KOTLIN
C
1
C#
C++
JAVASCRIPT
PHP
JAVA
예를 들면, SQL의 SI직업군 언어 점수는 3점이지만 CONTENTS직업군 언어 점수는 2점입니다. SQL의 HARDWARE, PORTAL, GAME직업군 언어 점수는 0점입니다.
직업군 언어 점수를 정리한 문자열 배열table, 개발자가 사용하는 언어를 담은 문자열 배열languages,언어 선호도를 담은 정수 배열preference가 매개변수로 주어집니다. 개발자가 사용하는 언어의언어 선호도x직업군 언어 점수의 총합이 가장 높은 직업군을 return 하도록 solution 함수를 완성해주세요. 총합이 같은 직업군이 여러 개일 경우, 이름이 사전 순으로 가장 빠른 직업군을 return 해주세요.
제한사항
table의 길이 = 5
table의 원소는"직업군 5점언어 4점언어 3점언어 2점언어 1점언어"형식의 문자열입니다.직업군,5점언어,4언어,3점언어,2점언어,1점언어는 하나의 공백으로 구분되어 있습니다.
table은 모든 테스트케이스에서 동일합니다.
1 ≤languages의 길이 ≤ 9
languages의 원소는"JAVA","JAVASCRIPT","C","C++","C#","SQL","PYTHON","KOTLIN","PHP"중 한 개 이상으로 이루어져 있습니다.
languages의 원소는 중복되지 않습니다.
preference의 길이 =languages의 길이
1 ≤preference의 원소 ≤ 10
preference의 i번째 원소는languages의 i번째 원소의언어 선호도입니다.
return 할 문자열은"SI","CONTENTS","HARDWARE","PORTAL","GAME"중 하나입니다.
입출력 예
tablelanguagespreferenceresult
["SI JAVA JAVASCRIPT SQL PYTHON C#", "CONTENTS JAVASCRIPT JAVA PYTHON SQL C++", "HARDWARE C C++ PYTHON JAVA JAVASCRIPT", "PORTAL JAVA JAVASCRIPT PYTHON KOTLIN PHP", "GAME C++ C# JAVASCRIPT C JAVA"]
["PYTHON", "C++", "SQL"]
[7, 5, 5]
"HARDWARE"
["SI JAVA JAVASCRIPT SQL PYTHON C#", "CONTENTS JAVASCRIPT JAVA PYTHON SQL C++", "HARDWARE C C++ PYTHON JAVA JAVASCRIPT", "PORTAL JAVA JAVASCRIPT PYTHON KOTLIN PHP", "GAME C++ C# JAVASCRIPT C JAVA"]
["JAVA", "JAVASCRIPT"]
[7, 5]
"PORTAL"
입출력 예 설명
입출력 예 #1
각 직업군 별로 점수를 계산해보면 아래와 같습니다.
아래 사진은개발자 언어 선호도나타낸 표입니다.
아래 사진은 개발자가 선호하는 언어의직업군 언어 점수를 나타낸 표입니다.
따라서 점수 총합이 41로 가장 높은"HARDWARE"를 return 해야 합니다.
입출력 예 #2
각 직업군 별로 점수를 계산해보면 아래와 같습니다.
아래 사진은개발자 언어 선호도나타낸 표입니다.
아래 사진은 개발자가 선호하는 언어의직업군 언어 점수를 나타낸 표입니다.
점수 총합이 55로 가장 높은 직업군은 "SI" 와 "PORTAL"입니다. 따라서 사전 순으로 먼저 오는"PORTAL"을 return 해야 합니다.
나의 풀이
첫번째 파라미터로 오는 배열을 보면 첫번째 값에는 직업군, 그 이후에는 언어가 오게되므로 우선 하나의 문자열을 분리시켰다.
그 이후 점수 총합과 직업군을 저장하기위해 key, value로 값을 저장하는 hashMap을 사용하여 점수 총합과 직업을 저장했다.
만약 점수가 같은 직업이 있다면 정렬을 통해 사전순서가 빠른 직업군을 리턴하도록 했다.
코틀린 언어가 익숙하지 않아서 조금 헤매었는데 풀고나니 조타 ㅎㅅㅎ
+ 프로그래머스와 내 로컬환경의 컴파일옵션이 달라서 그런지 내 노트북에서는 잘 컴파일 되었는데 프로그래머스에서 실행하면
오류가 많이 떠서 수정하는데 시간이 좀 걸렸다.
import kotlin.collections.HashMap
class Solution {
fun solution(table: Array<String>, languages: Array<String>, preference: IntArray): String {
var hashMap = HashMap<String, Int>()
for (i in table.indices) { // 첫번째 배열 아이템 나누기
var tableArr = table[i].split(" ")
var sum = 0
for (j in languages.indices) {
var idx = tableArr.indexOf(languages[j])
if (idx != -1) {
var size = tableArr.size - idx
sum += size * preference[j]
}
}
hashMap.put(tableArr[0],sum)
}
var maxVal = hashMap.values.max()
var answers = hashMap.filter { it.value == maxVal }
return answers.keys.min()!!
}
}
Rxjava와 MVVM 패턴을 사용한 영화 앱 강의를 듣던 중 유용해 보이는 플러그인을 발견해서 소개하려고 합니다.
플러그인 이름에서 볼 수 있듯이 Json 형식의 문자열을 코틀린 데이터 클래스로 쉽게 변환 해준다고 하네요.
간단한 사용법을 이미지와 함께 소개하겠습니당 ^0^
먼저 안드로이드 스튜디오 실행 후 File > Settings > Plugins 항목에서 json to kotlin 검색하여 설치하면
아래와 같이 새로운 파일 생성 시 "Kotlin data class File from JSON" 항목을 선택할 수 있습니다.
선택 후 Json 형식의 텍스트를 붙여넣기 해준 후에, 오른쪽 상단의 포맷 버튼을 눌러주면 붙여넣기로 인해 줄바꿈이 되어 있지 않던 Json 형식의 데이터가 보기좋게 정리됩니다. 하단의 Class Name에 원하는 클래스 명을 입력 하시면 그대로 데이터 클래스가 생성됩니다.
1번 학생이 자기 자신을 평가한 87점은 [90, 87]에서 유일한 최저점이므로, 평균을 구할 때 제외합니다.
입출력 예 #3
No.
0
1
2
0
70
49
90
1
68
50
38
2
73
31
100
평균
70.33…
40
64
학점
C
F
D
1번 학생이 자기 자신을 평가한 50점은 [49, 50, 31]에서 유일한 최고점이므로, 평균을 구할 때 제외합니다.
2번 학생이 자기 자신을 평가한 100점은 [90, 38, 100]에서 유일한 최고점이므로, 평균을 구할 때 제외합니다.
나의 풀이
1. 2차원 배열의 행 열을 변경하기 -> 코틀린 배열에서 제공하는 max, min 함수 사용을 위해
2. 자기 자신에게 평가 한 경우 max 또는 min 값인지 확인 후에 유일한 최저점, 최고점 확인
class Solution {
fun solution(scores: Array<IntArray>): String {
var answer: String = ""
var rotatedScores : Array<IntArray> = Array(scores.size) { IntArray(scores.size)}
for ( i in scores.indices)
for (j in scores[i].indices)
rotatedScores[i][j] = scores[j][i]
for (i in scores.indices)
{
var sum = 0.0F
var cnt = rotatedScores[i].size
for ( j in rotatedScores[i].indices)
{
if (i == j)
{
if (rotatedScores[i][j] == rotatedScores[j].min() ||
rotatedScores[i][j] == rotatedScores[j].max())
{
var countOfSameVal = rotatedScores[i].filter { it.equals(rotatedScores[i][j])}
if (countOfSameVal.size < 2) {
cnt -= 1
continue
}
}
}
sum += rotatedScores[i][j]
}
sum /= cnt
when (sum) {
in 90F..100F -> answer = answer.plus("A")
in 80F..90F -> answer = answer.plus("B")
in 70F..80F -> answer = answer.plus("C")
in 50F..70F -> answer = answer.plus("D")
in 0F..50F -> answer = answer.plus("F")
}
}
return answer
}
}
새로 생긴 놀이기구는 인기가 매우 많아 줄이 끊이질 않습니다. 이 놀이기구의 원래 이용료는 price원 인데, 놀이기구를 N 번 째 이용한다면 원래 이용료의 N배를 받기로 하였습니다. 즉, 처음 이용료가 100이었다면 2번째에는 200, 3번째에는 300으로 요금이 인상됩니다. 놀이기구를 count번 타게 되면 현재 자신이 가지고 있는 금액에서 얼마가 모자라는지를 return 하도록 solution 함수를 완성하세요. 단, 금액이 부족하지 않으면 0을 return 하세요.
제한사항
놀이기구의 이용료 price : 1 ≤ price ≤ 2,500, price는 자연수
처음 가지고 있던 금액 money : 1 ≤ money ≤ 1,000,000,000, money는 자연수
놀이기구의 이용 횟수 count : 1 ≤ count ≤ 2,500, count는 자연수
입출력 예
pricemoneycountresult
3
20
4
10
입출력 예 설명
입출력 예 #1 이용금액이 3인 놀이기구를 4번 타고 싶은 고객이 현재 가진 금액이 20이라면, 총 필요한 놀이기구의 이용 금액은 30(= 3+6+9+12)이 되어 10만큼 부족하므로 10을 return 합니다.
참고 사항
미션 언어는 Java, JavaScript, Python3, C++ 만 해당 됩니다.
같은 코드를 제출한 사람이 여럿이라면 코드를 가장 먼저 제출한 분께 상품을 드립니다.
좋아요 수가 동일할 경우 코드를 가장 먼저 제출한 분께 상품을 드립니다.
나의 풀이
문제는 간단했는데, 네가지 테스트가 계속 실패하는 바람에.. 도무지 모르겠어서 구글링 했더니 money값을 받을 때
int형이 아닌 long형으로 받아야 한다고 해서 매개변수 타입을 long으로 변경하니 성공했다.. 문제를 보면 알 수 있는 부분인데 좀더 문제를 정확히 읽고 풀어야겠다 ㅠ-ㅠ
public long solution(int price, long money, int count) {
for(int i = 1; i <= count; i++)
money = money - price * i;
return money > 0 ? 0 : money*-1;
}
우선 피포페인팅 도안을 생성하기 위해 도안이 될 이미지에서 선을 따는 작업이 필요했는데, 이를 도와줄 함수로
cv2.threshold() 함수가 적절해 보여서, 사용하기로 했다. 비슷한 기능을 할 만한 함수로 cv2.canny() 함수가 있었는데, 다음 장에서 차이
threshold는 구글 번역기에서는 한계점 이라고 해석되는데, 구글링을 통해 관련 문서를 보면 임계점(사실 같은뜻이지만?) 이라고 많이 부르는 것 같다.
임계점이라는 의미를 알았으니, OpenCV doc에서 cv2.threshold() 함수의 설명과 파라미터에 대해 알아보자.
문서의 내용을 간단히 요약하면,
"픽셀 값이 임계값보다 작으면 0으로 설정되고, 그렇지 않으면 최대값으로 설정됩니다."
이 부분이 메인이라고 볼 수 있을 것 같다.
파라미터를 살펴보자.
cv2.threshold(src, thresh, maxval, type)
return value : retval, dst
parameter
src - 첫 번째 인수는 회색조 이미지여야 하는 소스 이미지 입니다.
thresh - 두 번째 인수는 픽셀 값을 분류하는 데 사용되는 임계값입니다.
maxval - 세 번째 인수는 임계값을 초과하는 픽셀 값에 할당되는 최대값입니다.
type - OpenCV는 함수의 네 번째 매개변수에 의해 제공되는 다양한 유형의 임계값을 제공합니다. 위에서 설명한 기본 임계값은 cv.THRESH_BINARY 유형을 사용하여 수행됩니다 .
return value
retval - 첫 번째는 사용된 임계값이고
dst - 두 번째 출력은 임계값 이미지 입니다
OpenCV 문서에 아주 상세하게 설명되어 있다.
네번째 파라미터인 type을 변경해가면서 테스트를 해볼텐데, 나는 백예린님의 팬이므로 백예린님 사진을 통해 type을 변경해가면서 비교해보자.
코드의 출처는 OpenCV docs 문서이며, 이미지의 경로만 변경했다.
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
img = cv.imread('D:\yerin.jpg',0)
ret,thresh1 = cv.threshold(img,127,255,cv.THRESH_BINARY)
ret,thresh2 = cv.threshold(img,127,255,cv.THRESH_BINARY_INV)
ret,thresh3 = cv.threshold(img,127,255,cv.THRESH_TRUNC)
ret,thresh4 = cv.threshold(img,127,255,cv.THRESH_TOZERO)
ret,thresh5 = cv.threshold(img,127,255,cv.THRESH_TOZERO_INV)
titles = ['Original Image','BINARY','BINARY_INV','TRUNC','TOZERO','TOZERO_INV']
images = [img, thresh1, thresh2, thresh3, thresh4, thresh5]
for i in range(6):
plt.subplot(2,3,i+1),plt.imshow(images[i],'gray',vmin=0,vmax=255)
plt.title(titles[i])
plt.xticks([]),plt.yticks([])
plt.show()
내가 원하는 피포페인팅의 도안을 위해서는 BINARY type을 사용하는게 맞아보인다.
사실 지금 사용하고 있는 경계선을 얻어내는 방식은 cv2.canny()함수를 사용하고 있는데 프로토타입이 완성되면