2021년 3월 30일 화요일

[ Algorithm Java ] 가장 큰 수 - 정렬

 

문제 ]


0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요.

예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다.

0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요.


제한 사항

numbers의 길이는 1 이상 100,000 이하입니다.

numbers의 원소는 0 이상 1,000 이하입니다.

정답이 너무 클 수 있으니 문자열로 바꾸어 return 합니다.


입출력 예

numbers

return

[6, 10, 2]

6210

[3, 30, 34, 5, 9]

9534330




제출 ]


import java.util.Arrays;
import java.util.Comparator;

class Solution {
    public String solution(int[] numbers) {
        String answer = "";
        
        // 숫자를 문자열로 변환
String[] result = new String[numbers.length];
for (int i = 0; i < numbers.length; i++) {
result[i] = String.valueOf(numbers[i]);
}
        
        // 정렬
        Arrays.sort(result, (o1,o2)->(o2 + o1).compareTo(o1 + o2));
        
        // 정렬된 문자 하나로 합치기
for (String a : result) {
answer += a;
}
        
        // 0만 여러개 있는 배열의 경우 하나의 0만 리턴
if (result[0].equals("0")) {
return "0";
}
        
        return answer;
    }
}



풀이 ]


내림차순 : return (o2+o1).compareTo(o1+o2);

오름차순 : return (o1+o2).compareTo(o1+o2);

https://codevang.tistory.com/294

2021년 3월 29일 월요일

[ Practice Scala ] List 조건2 (Filter Positions in a List)


문제 ] 

Input Format

 integers contained in the list, each on a separate line.

Output Format

Output the list with the integers at odd positions removed i.e. the first element, the third element and so on. The relative positions of the remaining even-position elements should be the same as they were in the original array. Each integer will be on a separate line.

NOTE: By odd positions, we mean the first, third, fifth, etc position of the array needs to be filtered out. As per programming language conventions, these might (and they often do) correspond to indices  and so on.

Sample Input

2
5
3
4
6
7
9
8

Sample Output

5
4
7
8


제출 ]

def f(arr:List[Int]):List[Int] = {

    arr.tail.iterator.sliding(1, 2).toList.flatten

    //arr.view.zipWithIndex.filter(_._2 % 2 != 0).map(_._1).force.toList

}



풀이 ]

arr.tail.iterator.sliding(1, 2).toList.flatten

iterator의 함수 sliding을 이용해 리스트의 짝수 인덱스 값을 구분한다.


def 
sliding[B >: A](size: Intstep: Int = 1)GroupedIterator[B]

예시)
// Returns List(ArraySeq(1, 2, 3), ArraySeq(2, 3, 4), ArraySeq(3, 4, 5))
(1 to 5).iterator.sliding(3).toList

// Returns List(ArraySeq(1, 2, 3, 4), ArraySeq(4, 5))
(1 to 5).iterator.sliding(4, 3).toList

// Returns List(ArraySeq(1, 2, 3, 4))
(1 to 5).iterator.sliding(4, 3).withPartial(false).toList

첫번째 인자는 뽑을 갯수, 두번째 인자는 각 인덱스 마다 건널 뛸 값을 말한다.

리턴 값이 Iterator므로 toList로 형변환 후, flatten함수로 하나의 리스트를 만든다.

예시)
val xs = List(
           Set(1, 2, 3),
           Set(1, 2, 3)
         ).flatten
// xs == List(1, 2, 3, 1, 2, 3)

val ys = Set(
           List(1, 2, 3),
           List(3, 2, 1)
         ).flatten
// ys == Set(1, 2, 3)


다른 풀이법으로 는 

arr.view.zipWithIndex.filter(_._2 % 2 != 0).map(_._1).force.toList

가 있다.



2021년 3월 23일 화요일

[ Zeppelin ] Spark Interpreter Permission Error


에러메세지 ] 

org.apache.zeppelin.interpreter.InterpreterException: org.apache.zeppelin.interpreter.InterpreterException: Fail to open SparkInterpreter

...

Caused by: org.apache.zeppelin.interpreter.InterpreterException: Fail to open SparkInterpreter

...

Caused by: java.lang.reflect.InvocationTargetException

...

Caused by: org.apache.hadoop.security.AccessControlException: Permission denied: user=root, access=WRITE, inode="/user":hdfs:supergroup:drwxr-xr-x



원인 ]

Zeppelin실행 계정은 root로, 해당 디렉토리에 권한이 없어

/user/hdfs/에 스파크 staging을 생성하지 못해 생긴다.



해결 ]

/user 밑에 root 디렉토리 생성 후 

다시 제플린에서 스파크를 실행시키면 정상적으로 아래와 같은 파일이 생성된다  










(위-에러 / 아래-재실행 ) 






[ Practice Scala ] List 조건 (Filter Array)


문제 ]  

Input Format

The first line contains the delimiter .
The next  lines each contain an integer, which represents the elements of the list/array. You have to read the input to the End-Of-File.

Output Format

Print all the integers from the array that are less than the given upper limit  in value on separate lines. The sequence should be the same as it was in the original array.

Constraints


For any element,  in the array, 

Note

The purpose of this challenge is to learn how to write your own implementation of a filter function. We recommend not using the inbuilt library function.

Sample Input

3
10
9
8
2
7
5
1
3
0

Sample Output

2
1
0


제출 ]

def f(delim:Int,arr:List[Int]):List[Int] = {

    arr.filter(_<delim)

}



풀이 ]

받은 리스트 요소들 중에 인자값 delim보다 작은 것을 리턴하는 문제이다.


def 
filter(p: (A) => Boolean)List[A]

List.filter 함수를 통해 List.filter( x=> delim > x )와 같이 조건을 주어, 

각 요소들 중에 조건에 해당하는 값을 리턴한다. 


추가적으로 List.filter(_<delim).sorted, sorted함수를 추가해 정렬된 반환값을 

리턴할 수 있다.






2021년 3월 21일 일요일

[ Practice Scala ] 리스트 복제 (List Replication)


문제 ]

Given a list, repeat each element in the list  amount of times. The input and output portions will be handled automatically by the grader. You need to write a function with the recommended method signature.

Input Format

The first line contains the integer  where  is the number of times you need to repeat the elements.
The next  lines each contain an integer. These are the  elements in the array.

Output Format

Output each element of the original list  times, each on a separate line. You have to return the list/vector/array of  integers. The relative positions of the values should be the same as the original list provided in the input.

Constraints


Sample Input

3
1
2
3
4

Sample Output

1
1
1
2
2
2
3
3
3
4
4
4

제출 ]

def f(num:Int,arr:List[Int]):List[Int] ={

    return arr.flatMap(e=>List.fill(num)(e))

}



풀이 ] 

List클래스의 함수 flatMap을 이용한다. 비슷한 함수로 map이 있는데 둘간의 차이를 보면


예제)

val f = Seq("apple","banana","orange")

f.map(_.toUpperCase) //결과값 : List(APPLE, BANANA, ORANGE)

f.flatMap(_.toUpperCase) //결과값 List(A,P,P,L,E,B,A,N,A,N,A,.....G,E)


FlatMap 함수

final def flatMap[B](f: (A) => IterableOnce[B])List[B]


Fill 함수

def fill[A](n: Int)(elem: => A)List[A]

계산결과를 포함하는 목록을 n번 생성한다.


결과적으로 arr.flatMap(e=>List.fill(num)(e)) 내용은

arr배열을 flatmap으로 나누고 각 요소를 fill함수를 이용해 num만큼 반복시킨 목록들을 다시 List값으로 리턴시켜, 해당 문제에 원하는 결과값을 도출한다.





Map과 flatMap차이 : https://hamait.tistory.com/606