반응형

 

문제 링크 : https://www.acmicpc.net/problem/1764

 

[백준] 1764번: 듣보잡 (실버4, 자료 구조, 문자열, 정렬해시를 사용한 집합과 맵, JAVA)

해당 문제는 N과 M의 중복 개수와 이름을 출력하는 문제입니다. (중복 개수 출력을 못봐서 두 개의 케이스로 풀었습니다..)

 

1. getOrDefault를 사용한 풀이

getOrDefault는 지정된 값을 찾아서 없다면 기본값을, 있다면 값에 1을 더하여 사용했습니다. map.put(name, map.getOrDefault(name,0) +  1);  으로 사용을 했는데 name값이 있다면 value를 1 증가 시키고 없다면 기본값(0)을 반환시키도록 하는 함수입니다.

보도 못한(M) 사람을 입력받고 해당하는 키가 있다면 값을 1 증가, 증가된 값이 2라면 중복되는 값이기 때문에 list에 넣습니다. 이후 Collections.sort를 사용하여 듣보잡 리스트(list)를 정렬시키고 list의 사이즈와 요소를 출력합니다.

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] input = br.readLine().split(" ");
        int N = Integer.parseInt(input[0]);
        int M = Integer.parseInt(input[1]);
        Map<String, Integer> map = new HashMap<>();
        List<String> list = new ArrayList<>();

        for (int i = 0; i < N; i++) {
            String name = br.readLine();
            map.put(name, 1);
        }
        
        for (int i = 0; i < M; i++) {
            String name = br.readLine();
            map.put(name, map.getOrDefault(name,0) +  1);
            if (map.get(name) == 2) {
            	list.add(name);
            }
        }
        
        Collections.sort(list);
        System.out.println(list.size());
        for(String s : list) {
        	System.out.println(s);
        }
    }
}

 

2. containsKey를 사용한 풀이

containsKey는 해당하는 키가 있는지 확인해주는 함수입니다. 두번째 for문에서 containsKey를 사용하여 입력받은 값이 현재 map의 키에 있는지 확인하고, 있다면 names 리스트에 추가합니다.

이후 모두 구했다면 듣보잡은 names 리스트에 추가되어 있으므로 정렬 후 사이즈와 요소를 출력합니다. 

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] input = br.readLine().split(" ");
        int N = Integer.parseInt(input[0]);
        int M = Integer.parseInt(input[1]);
        Map<String, Integer> nameCountMap = new HashMap<>();
		List<String> names = new ArrayList<>();
        
        for (int i = 0; i < N; i++) {
            String name = br.readLine();
            nameCountMap.put(name, 0);
        }
        
        for (int i = 0; i < M; i++) {
            String name = br.readLine();
            if (nameCountMap.containsKey(name)) {
            	names.add(name);
            }
        }
        
        Collections.sort(names);
        System.out.println(names.size());
        for(String s : names) {
        	System.out.println(s);
        }
    }
}

 

반응형
반응형

 

문제 링크 : https://www.acmicpc.net/problem/1526

 

1526번: 가장 큰 금민수 (브론즈1, 수학, 구현, 브루트포스 알고리즘, JAVA)

수를 하나 입력받고, 4와 7로만 이루어진 숫자의 최댓값을 구하는 문제입니다. 전체 코드는 아래와 같은데, 값을 입력받은 후 해당 숫자를 char 배열로 변환합니다.

이후 각각의 char 배열에 7또는 4가 있는지 확인하고 count를 증가시키게 되는데, count가 char 배열의 길이와 같을 경우 모든 값이 4또는 7로 이루어진 문자이기 때문에 출력 후 종료합니다.

만약, 같지 않다면 입력받은 값(N)에서 1씩 감소시키며 원하는 값을 찾을때까지 반복합니다.

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

public class Main {

   public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());
        while(true) {
           char[] ch = Integer.toString(N).toCharArray();
           int count = 0;
           for(int i=0; i<ch.length; i++) {
              if(ch[i] == '7') {
                 count++;
              } else if(ch[i] == '4') {
                 count++;
              }
           }
           
           if(count == ch.length) {
              System.out.println(N);
              break;
           }
           
           N--;
        }
   }
}

 

반응형
반응형

 

문제 링크 : https://www.acmicpc.net/problem/1417

 

1417번: 국회의원 선거 (실버5, 구현자료, 구조그리디, 알고리즘시뮬레이션, 우선순위 큐, JAVA)

매수해야하는 사람의 수를 구하는 문제인데, 예제의 경우 다솜(5)이가 2번과 3번의 사람을 한명씩 매수하게 되면 득표 수가 7,6,6이 되므로 두명을 매수해야하기 때문에 출력값은 2가 나와야 합니다.

 

아래의 코드에서 각각의 값을 입력받고, 한명의 후보밖에 없을 경우(입력되는 값이 1일 때) 0을 출력합니다.

public class Main {

   public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());
        int[] numbers = new int[N];
        int maxValue = 0;
        int count = 0;
        int maxIndex = 0;
        for(int i=0; i<N; i++) {
           numbers[i] = Integer.parseInt(br.readLine());
        }
        
        if(N==1) {
           System.out.println("0");
        }
	}
}

 

그 후 while문을 작성하는데, N이 1보다 클 경우 라는 조건식을 주고 나서 입력받은 숫자 중 가장 큰 값과 현재 값의 인덱스를 저장합니다. 그 후 numbers[0] (다솜)이 maxValue보다 클 경우 count를 출력하며 while문을 중지하고, 작거나 같을 경우 다솜이의 값을 1 증가, 가장 큰 값이였던 인덱스에 들어있는 값과 maxValue를 1 감소하며 count를 증가 시킵니다.

        while(N>1) {
           
           for(int i=1; i<N; i++) {
               if(numbers[i] > maxValue) {
                  maxValue = numbers[i];
                  maxIndex = i;
               }
            }
           
           if(numbers[0] > maxValue) {
              System.out.println(count);
              break;
           } else if(numbers[0] <= maxValue) {
              numbers[0]++;
              numbers[maxIndex]--;
              maxValue--;
              count++;
           } 
        }

 

전체 코드는 아래와 같습니다.

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

public class Main {

   public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());
        int[] numbers = new int[N];
        int maxValue = 0;
        int count = 0;
        int maxIndex = 0;
        for(int i=0; i<N; i++) {
           numbers[i] = Integer.parseInt(br.readLine());
        }
        
        if(N==1) {
           System.out.println("0");
        }
        
        while(N>1) {
           
           for(int i=1; i<N; i++) {
               if(numbers[i] > maxValue) {
                  maxValue = numbers[i];
                  maxIndex = i;
               }
            }
           
           if(numbers[0] > maxValue) {
              System.out.println(count);
              break;
           } else if(numbers[0] <= maxValue) {
              numbers[0]++;
              numbers[maxIndex]--;
              maxValue--;
              count++;
           } 
        }
   }
}

 

반응형
반응형

 

문제 링크 : https://www.acmicpc.net/problem/1302

 

1302번: 베스트셀러 (실버4, 자료구조, 문자열, 정렬, 해시를사용한 집합과 맵 JAVA)

해당 문제는 가장 많이 판매된 책을 출력하는 문제입니다. 우선 사용자로부터 입력을 받고 HashMap에 담습니다. key는 책 이름, value는 판매된 횟수로 사용할 예정입니다. maxValue와 maxKey는 마지막 로직에서 가장 많이 판매된 책을 구하기 위한 변수입니다.

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    	int N = Integer.parseInt(br.readLine());  
        
    	String[] book = new String[N]; 
    	Map<String, Integer> bookCount = new HashMap<>();
        int maxValue = 0;
    	String maxKey = "";
        
    	for(int i=0; i<N; i++) {
    		book[i] = br.readLine();
    		bookCount.put(book[i], 0);
    	}
    }
}

 

 

이후 아래와 같은 코드를 추가 했는데, 입력받은 book 배열과 같은 책 이름을 가진 HashMap의 key를 찾고 카운트를 증가시킵니다.

for(int i=0; i<N; i++) {
    if(bookCount.containsKey(book[i])) {
        int getValue = bookCount.get(book[i]);
        bookCount.put(book[i], ++getValue);
    }
}

 

 

Entry를 사용하여 key, value를 꺼내옵니다. 이후 현재 꺼내온 value가 maxValue보다 큰지 확인하고, 해당되는 값들을 저장합니다. 

for (Map.Entry<String, Integer> entry : bookCount.entrySet()) {
    String key = entry.getKey();
    int value = entry.getValue();

    if(value > maxValue || (value == maxValue && key.compareTo(maxKey) < 0)) {
        maxKey = key;
        maxValue = value;
    }
}

 

 

(value == maxValue && key.compareTo(maxKey) < 0) 의 경우 값이 최댓값과 동일하면서, 현재의 키 값이 maxKey보다 사전 순으로 더 앞서는 경우를 뜻합니다. 

 

 

만약 아래와 같은 입력값이 들어간다면 top과 abc는 모두 판매 횟수가 4지만, abc가 사전적으로 앞에 위치했기 때문에 (value == maxValue && key.compareTo(maxKey) < 0) 에 의해 maxKey는 "abc"로 교체됩니다.

9
top
top
top
top
abc
abc
abc
abc
kimtop

 

 

최종적으로 완성된 코드는 아래와 같습니다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    	int N = Integer.parseInt(br.readLine());  
        
    	String[] book = new String[N]; 
    	Map<String, Integer> bookCount = new HashMap<>();
        int maxValue = 0;
    	String maxKey = "";
        
        for(int i=0; i<N; i++) {
    		book[i] = br.readLine();
    		bookCount.put(book[i], 0);
    	}
    	
    	for(int i=0; i<N; i++) {
    		if(bookCount.containsKey(book[i])) {
    			int getValue = bookCount.get(book[i]);
    			bookCount.put(book[i], ++getValue);
    		}
    	}
    	
    	for (Map.Entry<String, Integer> entry : bookCount.entrySet()) {
            String key = entry.getKey();
            int value = entry.getValue();
            
            if(value > maxValue || (value == maxValue && key.compareTo(maxKey) < 0)) {
            	maxKey = key;
            	maxValue = value;
            }
    	}
    	
    	System.out.println(maxKey);
    }
}
반응형

+ Recent posts