728x90

Inverted Index

먼저 예시를 보면

Doc1: apple banana coconut
Doc2: apple doughnut egg
Doc3: apple coconut melon

위와 같이 있다고 했을 때, Inverted Index는 아래와 같습니다.

apple -> Doc1:1, Doc2:1, Doc3:1
banana -> Doc1:7
coconut -> Doc1:14, Doc3:7
doughnut -> Doc2:7
egg -> Doc2:16
melon -> Doc3:15

위와 같이 각각의 단어가 어느 문서에서 어느 위치에 있는지 list로 가지고 있는것을 Inverted Index라고 합니다.

 

728x90

'Hadoop > 이론' 카테고리의 다른 글

Matrix Addition  (0) 2021.09.16
Partitioner Class  (0) 2021.09.15
맵리듀스 프레임워크 이해하기  (0) 2021.08.25
728x90

Partitioner Class

Map 함수의 출력인 (Key, Value) 쌍이 Key에 의해서 어느 Reducer (머신)로 보내질 것인지를 정해지는데
이러한 결정을 정의하는 class

하둡의 기본 타입은 Hash 함수가 Default로 제공되고 있어서 Key에 대한 해시 값에 따라 어느 Reducer(머신)으로 보낼지를 결정한다.

하둡의 기본타입
- Text
- IntWritable
- LongWritable
- FloatWritable
- DoubleWritable

Partitioner Class 예제 코드

소문자로 시작하면 0번 머신으로, 대문자로 시작하면 1번 머신으로 보내는 파티셔너 예제 코드

 public static class MyPartitioner extends Partitioner<Text, IntWritable> {
   @Override
   public int getPartition(Text key, IntWritable value, int numPartitions) {
     if(key.toString().charAt(0) < 'a') return 0;
     else return 1;
   }
 }

 

728x90

'Hadoop > 이론' 카테고리의 다른 글

Matrix Addition  (0) 2021.09.16
Inverted Index  (0) 2021.09.15
맵리듀스 프레임워크 이해하기  (0) 2021.08.25
728x90

[문제]

https://programmers.co.kr/learn/courses/30/lessons/42586

 

코딩테스트 연습 - 기능개발

프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다. 또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는

programmers.co.kr

프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다.

또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는 기능보다 먼저 개발될 수 있고, 이때 뒤에 있는 기능은 앞에 있는 기능이 배포될 때 함께 배포됩니다.

먼저 배포되어야 하는 순서대로 작업의 진도가 적힌 정수 배열 progresses와 각 작업의 개발 속도가 적힌 정수 배열 speeds가 주어질 때 각 배포마다 몇 개의 기능이 배포되는지를 return 하도록 solution 함수를 완성하세요.

    제한 사항
    • 작업의 개수(progresses, speeds배열의 길이)는 100개 이하입니다.
    • 작업 진도는 100 미만의 자연수입니다.
    • 작업 속도는 100 이하의 자연수입니다.
    • 배포는 하루에 한 번만 할 수 있으며, 하루의 끝에 이루어진다고 가정합니다. 예를 들어 진도율이 95%인 작업의 개발 속도가 하루에 4%라면 배포는 2일 뒤에 이루어집니다.

[문제 풀이]

Queue에 걸리는 시간을 계산해서 넣어준다.
걸리는 시간은 (100.0-progresses[i]/speeds[i])을 올림하면 된다.

그리고 while문을 돌면서 하나씩 뽑는데 그 다음것도 뽑을 수 있으면 뽑고 cnt 를 증가시킨다.
cnt를 하나씩 list에 넣어주고 list를 int[] array로 변환하여 return하면 된다.

[코드]

public boolean solution(String[] phone_book) {
        Queue<Integer> q = new LinkedList<>();
        for (int i=0; i<progresses.length; i++) {
            q.offer((int)Math.ceil((100.0-progresses[i])/speeds[i]));
        }

        List<Integer> answer = new ArrayList<>();
        while(!q.isEmpty()) {
            int cur = q.poll();
            int cnt = 1;

            while (!q.isEmpty() && cur >=q.peek()) {
                cnt++;
                q.poll();
            }
            answer.add(cnt);

        }
        return answer.stream().mapToInt(Integer::intValue).toArray();
}
728x90
728x90

[문제]

https://programmers.co.kr/learn/courses/30/lessons/42577

 

코딩테스트 연습 - 전화번호 목록

전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다. 전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사입니다. 구조

programmers.co.kr

전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다.
전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사입니다.

  • 구조대 : 119
  • 박준영 : 97 674 223
  • 지영석 : 11 9552 4421

전화번호부에 적힌 전화번호를 담은 배열 phone_book 이 solution 함수의 매개변수로 주어질 때, 어떤 번호가 다른 번호의 접두어인 경우가 있으면 false를 그렇지 않으면 true를 return 하도록 solution 함수를 작성해주세요.

제한 사항

  • phone_book의 길이는 1 이상 1,000,000 이하입니다.
    • 각 전화번호의 길이는 1 이상 20 이하입니다.
    • 같은 전화번호가 중복해서 들어있지 않습니다.

[문제 풀이]

Map에 전화번호를 하나씩 넣어주고 각 스트링을 스트링의 길이까지 하나씩 증가시키면서 쪼갰을 때 그 값을 키로 가지는것이 Map에 있으면 false를 출력하고 다 비교해도 없으면 true를 출력한다.

[코드]

public boolean solution(String[] phone_book) {
        int n = phone_book.length;

        Map<String, Integer> map = new HashMap<>();
        for (int i=0; i<n; i++) {
            map.put(phone_book[i], i);
        }
        
        for (int i=0; i<n; i++) {
            for (int j=0; j<phone_book[i].length(); j++) {
                String str = phone_book[i].substring(0, j);
                if (map.containsKey(str)) {
                    return false;
                }
            }
        }
        return true;
}

 

728x90
728x90

[문제]

링크: https://programmers.co.kr/learn/courses/30/lessons/42576

 

코딩테스트 연습 - 완주하지 못한 선수

수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다. 마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수

programmers.co.kr

수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.

마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.

[제한사항]

  • 마라톤 경기에 참여한 선수의 수는 1명 이상 100,000명 이하입니다.
  • completion의 길이는 participant의 길이보다 1 작습니다.
  • 참가자의 이름은 1개 이상 20개 이하의 알파벳 소문자로 이루어져 있습니다.
  • 참가자 중에는 동명이인이 있을 수 있습니다.

[풀이]

위 문제 의도는 HashMap을 사용하여 문제를 해결하는 문제이다. 

그러나 배열만으로도 간단히 해결할 수 있기 때문에 두 가지 방법으로 풀어보았다.

1) 배열

public static String solution(String[] participant, String[] completion) {
    Arrays.sort(participant);
    Arrays.sort(completion);

    for (int i=0; i<completion.length; i++) {
        if (participant[i].equals(completion[i])) {
            continue;
        } else {
            return participant[i];
        }
    }

    return participant[participant.length-1];
}

각각 정렬을 하고 앞에서 부터 하나씩 비교를 한다.

동일하지 않으면 완주하지 못한 선수 이므로 출력해준다.

완주자 목록에 다른게 없다면 마지막 한 사람이므로 그 사람을 출력해준다.

2) HashMap

public static String solution(String[] participant, String[] completion) {
    String answer = "";

    Map<String, Integer> hm = new HashMap<>();
	
    for (String p : participant) {
        hm.put(p, hm.getOrDefault(p, 0)+1);
    }

    for (String c : completion) {
        hm.put(c, hm.get(c) - 1);
    }

    for (String key : hm.keySet()) {
        if (hm.get(key) != 0) {
            answer = key;
            break;
        }
    }

    return answer;
}

먼저 참여자를 Map에 하나씩 넣고 1씩 증가시켜준다. (동명이인이 있으면 2, 3... 이렇게 숫자가 추가된다.)

완주자 목록을 하나씩 읽으며 저장된 맵의 value를 1씩 감소시킨다.

마지막으로 for문을 돌며 Map에 저장된 value 값이 0이 아닌 사람의 이름을 출력해 준다.

[결과]

1) 배열

2) HashMap

728x90
728x90

[문제]

https://programmers.co.kr/learn/courses/30/lessons/42578?language=java#

 

코딩테스트 연습 - 위장

 

programmers.co.kr

 

[문제 풀이]

- 얼굴: 동그란 안경, 검정 선글라스, none => 3가지의 경우의 수

- 상의: 파란색 티셔츠, none  => 2가지의 경우의 수

- 하의: 청바지, none => 2가지의 경우의 수

- 겉옷: 긴코트, none => 2가지의 경우의 수

 

총 3 * 2 * 2* 2 = 24가지가 나올 수 있다.

그런데 최소 한개의 옷을 입여야 하기 때문에 [none, none, none, none]을 고른 경우의 수 1개를 빼주어야 한다.

따라서 23가지

 

[코드]

public static int solution(String[][] clothes) {
  Map<String, Integer> hm = new HashMap<>();
  for (int i=0; i<clothes.length; i++) {
  	hm.put(clothes[i][1], hm.getOrDefault(clothes[i][1], 1) + 1);
  }
    
  int ans = 1;
  for (Integer value : hm.values()) {
  	ans *= value;
  }
  
  return ans-1;
}
728x90
728x90

[문제]

신종 바이러스인 웜 바이러스는 네트워크를 통해 전파된다. 한 컴퓨터가 웜 바이러스에 걸리면 그 컴퓨터와 네트워크 상에서 연결되어 있는 모든 컴퓨터는 웜 바이러스에 걸리게 된다.

예를 들어 7대의 컴퓨터가 <그림 1>과 같이 네트워크 상에서 연결되어 있다고 하자. 1번 컴퓨터가 웜 바이러스에 걸리면 웜 바이러스는 2번과 5번 컴퓨터를 거쳐 3번과 6번 컴퓨터까지 전파되어 2, 3, 5, 6 네 대의 컴퓨터는 웜 바이러스에 걸리게 된다. 하지만 4번과 7번 컴퓨터는 1번 컴퓨터와 네트워크상에서 연결되어 있지 않기 때문에 영향을 받지 않는다.

어느 날 1번 컴퓨터가 웜 바이러스에 걸렸다. 컴퓨터의 수와 네트워크 상에서 서로 연결되어 있는 정보가 주어질 때, 1번 컴퓨터를 통해 웜 바이러스에 걸리게 되는 컴퓨터의 수를 출력하는 프로그램을 작성하시오.

 

[문제 풀이]

이 문제는 BFS 또는 DFS를 이용하여 해결 할 수 있다.

그리고 BFS와 DFS를 구현하는데 matrix 또는 list로 구현이 가능한데 두 가지 방법으로 다 풀어보았다.

 

1. BFS Linked list

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class Main {
    static int N, M;
    static Queue<Integer> q = new LinkedList<>();
    static boolean[] visited;
    static Node[] adj;

    static int stoi(String s) {
        return Integer.parseInt(s);
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        N = stoi(br.readLine());
        M = stoi(br.readLine());

        visited = new boolean[N+1];
        adj = new Node[N+1];

        for (int i=0; i<M; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            int u = stoi(st.nextToken());
            int v = stoi(st.nextToken());

            adj[u] = new Node(v, adj[u]);
            adj[v] = new Node(u, adj[v]);
        }

        System.out.println(bfs(1));
    }

    public static int bfs(int n) {
        int cnt = 0;
        visited[n] = true;
        q.offer(n);

        while(!q.isEmpty()) {
            int x = q.poll();

            for (Node node=adj[x]; node!=null; node=node.next) {
                if (!visited[node.n]) {
                    q.offer(node.n);
                    visited[node.n] = true;
                    cnt++;
                }
            }
        }

        return cnt;
    }

    static class Node {
        int n;
        Node next;

        public Node(int n, Node next) {
            this.n = n;
            this.next = next;
        }
    }
}

2. DFS Linked list

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
    static int n, m;
    static Node[] adj;
    static boolean[] visit;
    static int cnt;

    public static int stoi(String s) {
        return Integer.parseInt(s);
    }

    public  static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        n = stoi(br.readLine());
        m = stoi(br.readLine());

        adj = new Node[n+1];
        visit = new boolean[n+1];
        for (int i=0; i<m; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            int u = stoi(st.nextToken());
            int v = stoi(st.nextToken());

            adj[u] = new Node(v, adj[u]);
            adj[v] = new Node(u, adj[v]);
        }

        dfs(1);
        System.out.println(cnt);
    }

    public static void dfs(int v) {
        visit[v] = true;

        for (Node node=adj[v]; node!=null; node=node.next) {
            if (!visit[node.n]) {
                cnt++;
                dfs(node.n);
            }
        }
    }

    static class Node {
        int n;
        Node next;

        public Node(int n, Node next) {
            this.n = n;
            this.next = next;
        }
    }
}

3. DFS Matrix

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
    static int n, m;
    static int[][] matrix;
    static boolean[] visit;
    static int cnt;

    public static int stoi(String s) {
        return Integer.parseInt(s);
    }

    public  static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        n = stoi(br.readLine());
        m = stoi(br.readLine());

        matrix = new int[n+1][n+1];
        visit = new boolean[n+1];
        for (int i=0; i<m; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            int u = stoi(st.nextToken());
            int v = stoi(st.nextToken());

            matrix[u][v] = 1;
            matrix[v][u] = 1;
        }

        dfs(1);
        System.out.println(cnt);
    }

    public static void dfs(int v) {
        visit[v] = true;

        for (int i=1; i<=n; i++) {
            if (matrix[v][i]==1 && !visit[i]) {
                cnt++;
                dfs(i);
            }
        }
    }
}

[결과]

BFS - list

DFS - list

DFS - matrix

순으로 결과는 다음과 같이 나왔다.

728x90

'Algorithm > Baekjoon' 카테고리의 다른 글

[BOJ] 1991 트리 순회 - Java  (0) 2021.07.16
[BOJ] 5639 이진 검색 트리 - Java  (0) 2021.07.16
[BOJ] 1068 트리 - Java  (0) 2021.07.14
[BOJ] 11279 최대 힙 - Java  (0) 2021.07.14
[BOJ] 1927 최소 힙 - Java  (0) 2021.07.14

+ Recent posts