스탭코딩

문제 : https://programmers.co.kr/learn/courses/30/lessons/42839

 

코딩테스트 연습 - 소수 찾기 | 프로그래머스

한자리 숫자가 적힌 종이 조각이 흩어져있습니다. 흩어진 종이 조각을 붙여 소수를 몇 개 만들 수 있는지 알아내려 합니다. 각 종이 조각에 적힌 숫자가 적힌 문자열 numbers가 주어졌을 때, 종이 조각으로 만들 수 있는 소수가 몇 개인지 return 하도록 solution 함수를 완성해주세요. 제한사항 numbers는 길이 1 이상 7 이하인 문자열입니다. numbers는 0~9까지 숫자만으로 이루어져 있습니다. 013은 0, 1, 3 숫자가 적힌 종이

programmers.co.kr

public class Solution {

   public int solution(String numbers) {
        int answer = 0;
        List numList = new ArrayList();
        Set resultSet = new HashSet();         
        
        for(int i=0; i<numbers.length(); i++) {         
         numList.add(String.valueOf(numbers.charAt(i)));
        }
        
        //순열생성
        perm(numList, resultSet, 0);
        
        //소수 확인
Iterator itr = resultSet.iterator();
while (itr.hasNext()) {
if(isPrime(itr.next())) {
answer++;
}
}

return answer;
}

//참고 (순열 생성) 
public List perm(List list, Set resultSet,int pivot) {
if (pivot == list.size()) {
//System.out.println(list);
makeResultSet(list, resultSet);
}
 
for (int i = pivot; i < list.size(); i++) {
swap(list, i, pivot);
perm(list, resultSet, pivot + 1);
swap(list, i, pivot);
}
return list;
}

public void swap(List list, int i, int j) {
String a = list.get(i);
String b = list.get(j);
list.set(i, b);
list.set(j, a);

}

// 순열별 경우의수
public Set makeResultSet(List numList,Set resultSet){
// prefix 를 정하고 뒤를 순서대로 붙임
// 다음 프리픽스로 사용한 인덱스를 제거하고 반복하면서 리절트셋에 에드
for(int k=0; k<numList.size() ; k++) {

int fixIdx = k;
resultSet.add(Integer.valueOf(numList.get(k)));
List tempNumList = new ArrayList();

//고정 값을 제외하 나머지 요소를 담을  리스트를 생성합니다.
for(int i=fixIdx+1; i<numList.size();i++) {
tempNumList.add(numList.get(i));
}

for(int i=0; i< tempNumList.size();i++) {
// 두번째로 배치할 인덱스 == i
// 두번째 배치할 요소를 고려해서 큐를 생성합니다.
Queue q = new LinkedList();
List tempNumList2 = new ArrayList();
String resultNum = numList.get(fixIdx);
   resultNum += tempNumList.get(i);

for(int j=0; j<tempNumList.size(); j++) {
if(i != j) {
resultNum += tempNumList.get(j);
}
}

resultSet.add(Integer.valueOf(resultNum));
makeResultSet(tempNumList,resultSet);
}
}
return resultSet;
}

private boolean isPrime(int num) {
if (num < 2) return false;
    if (num == 2) return true;
    if (num % 2 == 0) return false;

    /**
     * num 이 p * q 라고 할때 한 수는 항상 sqrt(num) 이하의 값을 갖는다. (ex, num = 24, p = [1, 2, 3, 4], q = [6, 8, 12, 24])
     * 따라서 num 이 sqrt(num) 이하의 값중 하나로 나눠지는지 체크한다. (ex, 24 가 4 이하의 숫자로 나눠지는지 체크,, 1,2 는 예외)
     */
    // 참고
    int sqrtn = (int) Math.sqrt(num);
    for (int i = 3; i <= sqrtn; i += 2) {
        if (num % i == 0) return false;
    }
    return true;
}

'알고리즘' 카테고리의 다른 글

[JAVA ]프로그래머스 - 오픈채팅방(openChatRoom) 42888  (0) 2020.01.13

문제 : https://programmers.co.kr/learn/courses/30/lessons/42888

 

코딩테스트 연습 - 오픈채팅방 | 프로그래머스

오픈채팅방 카카오톡 오픈채팅방에서는 친구가 아닌 사람들과 대화를 할 수 있는데, 본래 닉네임이 아닌 가상의 닉네임을 사용하여 채팅방에 들어갈 수 있다. 신입사원인 김크루는 카카오톡 오픈 채팅방을 개설한 사람을 위해, 다양한 사람들이 들어오고, 나가는 것을 지켜볼 수 있는 관리자창을 만들기로 했다. 채팅방에 누군가 들어오면 다음 메시지가 출력된다. [닉네임]님이 들어왔습니다. 채팅방에서 누군가 나가면 다음 메시지가 출력된다. [닉네임]님이 나갔습니다. 채팅

programmers.co.kr

 

public class Solution {


public String[] solution(String[] record) {
        String[] answer;       
        //반환배열 길이(인풋된 record 길이에서 change동작은 제외한 길이)
        int answerSize=0;
        //동작유형배열
        String[] operTypeArr = {"Enter","Leave","Change"};
        //아이디,닉네임 맵 
        Map<String,String> uidMap = new HashMap<String,String>();
        //동작, 반환값 맵 
        Map<String,String> answerMap = new HashMap<String,String>();
        answerMap.put("Enter", "님이 들어왔습니다.");
        answerMap.put("Leave", "님이 나갔습니다.");
        // 입력받은 값을 2차원 배열에 담습니다
        String[][] record2 = new String[record.length][3];

        for(int i=0; i<record.length; i++) {
            record2[i] = record[i].split(" ");
        }

        //아이디,닉네임맵에 정보를 담고 닉네임 변경을 반영합니다.
        for(int j=0; j<record2.length; j++) {   
            if(record2[j][0].equals("Enter")) {
                uidMap.put(record2[j][1], record2[j][2]);
                answerSize++;
            }else if(record2[j][0].equals("Change")) {
                uidMap.replace(record2[j][1], record2[j][2]);
            }else {
                answerSize++;               
            }
        }
        
        answer = new String[answerSize];

        //입력정보에서  uidMap에서 uid값을 키로 닉네임정보를 맵에서 불러 옵니다.(change동작은 제외)
        //record 배열과 answer배열의 길이가 다르기때문에 배열 인덱스를 매칭시켜줄 변수를 정의합니다.
        int answerIdx = 0;
        for(int i=0; i<record2.length; i++) {
            String operType = record2[i][0];
            if(!operType.equals(operTypeArr[2])) {
                answer[answerIdx]=uidMap.get(record2[i][1])+answerMap.get(operType);
                answerIdx++;
            }
        }
        return answer;
    }
}

 

 

 

bitcoind 구동

BLOCKCHAIN2019. 5. 17. 14:08

bitcoin 블록체인의 체인데이터를 동기화 하기 위해 bitcoind를 실행합니다.

 

bitcoind가 설치된 디렉터리에서 ./bitcoind 혹은 스타드 쉘을 작성해서 실행하면 됩니다.

스타트 쉘은 EOS BP 중 하나인 CryptoLions 깃헙 자료를 참고로 만들었습니다. https://github.com/CryptoLions/scripts/blob/master/start.sh

  !/bin/bash
    DATADIR="bitcoind가 적치된 디렉터리 위치"

    #stop bitcoind
    $DATADIR/stop.sh

    #start bitcoind
    echo -e "Starting Bitcoind.. \n";
    $DATADIR/bitcoind "$@" > $DATADIR/stdout.txt 2> $DATADIR/stderr.txt & echo $! > $DATADIR/bitcoind.pid

'BLOCKCHAIN' 카테고리의 다른 글

bitcoin.conf (for rpc)  (0) 2019.05.15