no image
[Java] 백준 1302번 문제 (베스트 셀러)
문제설명 소스코드 import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.Map.Entry; import java.util.Set; public class Main { public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); HashMap ma..
2023.08.13
no image
[Java] 백준 1920번 문제 (수 찾기)
문제설명 소스코드 import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.Arrays; import java.util.StringTokenizer; public class Main { public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringBuilder sb = new StringBuilder(); int N = Integer.parseInt(br.readLine()); int arr[] = new int[N]; StringT..
2023.08.13
no image
[Java] 백준 11728번 문제 (배열 합치기)
문제설명 소스코드 import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.*; public class Main { public static void main(String[] args) throws Exception { List A = new ArrayList(); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); StringBuilder sb = new StringBuilder(); int N = Integer.parseInt(st...
2023.08.12
no image
[Java] 백준 11729번 문제 (하노이 탑 이동 순서)
문제설명 소스코드 import java.io.BufferedReader; import java.io.InputStreamReader; public class Main { static StringBuilder sb = new StringBuilder(); static void hanoi(int TopNum, int x, int y) { if (TopNum > 1) hanoi(TopNum - 1, x, 6 - x - y); sb.append(x + " " + y ).append("\n"); if (TopNum > 1) hanoi(TopNum - 1, 6 - x - y, y); } public static void main(String[] args) throws Exception { BufferedReader..
2023.08.11
no image
[Java] 백준 14916번 문제 (거스름 돈)
문제설명 소스코드 import java.io.BufferedReader; import java.io.InputStreamReader; public class Main { public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int n = Integer.parseInt(br.readLine()); int coinCount = 0; while(true) { if(n % 5 == 0) { coinCount += n / 5; System.out.println(coinCount); break; } else { n -= 2; ++coi..
2023.08.11
no image
[Java] 백준 26069번 문제 (붙임성 좋은 총총이)
문제설명 소스코드 import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import java.util.StringTokenizer; public class Main { public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokeni..
2023.08.10
no image
[Java] 백준 2164번 문제 (카드2)
문제설명 소스코드 import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.LinkedList; import java.util.Queue; public class Main { public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int N = Integer.parseInt(br.readLine()); Queue queue = new LinkedList(); for(int i = 1; i
2023.08.09
no image
[Java] 백준 11866번 문제(요세푸스 문제 0)
문제설명 소스코드 import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.LinkedList; import java.util.Queue; import java.util.StringTokenizer; public class Main { public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); int N = Integer.parseInt(st..
2023.08.08

문제설명

 

소스코드

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map.Entry;
import java.util.Set;

public class Main
{
	public static void main(String[] args) throws Exception
	{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		HashMap <String, Integer> map = new HashMap<>();
		ArrayList <String> list = new ArrayList<>();
		int N = Integer.parseInt(br.readLine());
		int maxNumber = 0;
		for(int i = 0; i < N; ++i)
		{
			String str = br.readLine();
			if(map.containsKey(str)) //해시맵에 이미 해당 키가 있다면
			{
				int tmp = map.get(str);
				map.remove(str); //기존 맵을 제거
				map.put(str, ++tmp); // 기존 키에 값이 1 추가된 맵을 추가
				maxNumber = Math.max(maxNumber, tmp); //최대값 비교
			}
			else
			{
				map.put(str, 1);
				maxNumber = Math.max(maxNumber, 1); //최대값 비교
			}
		}
		Set<Entry<String, Integer>> entrySet = map.entrySet(); //엔트리 셋을 가져오는 Set 생성
		Iterator<Entry<String, Integer>> entryIterator = entrySet.iterator(); //엔트리 셋을 반복하는 반복자 생성
		while (entryIterator.hasNext()) {
			Entry<String, Integer> entry = entryIterator.next();
			int v = entry.getValue();
			if(v == maxNumber) list.add(entry.getKey()); //최대 값이라면 리스트에 해당 키를 추가
		}
		Collections.sort(list); //리스트 정렬
		System.out.println(list.get(0)); //정렬된 리스트중 가장 맨 앞(사전순) 출력
	}
}

 

문제설명

 

 

소스코드

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

public class Main
{
	public static void main(String[] args) throws Exception
	{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
        
		int N = Integer.parseInt(br.readLine());
		int arr[] = new int[N];
		StringTokenizer st = new StringTokenizer(br.readLine());
		for(int i = 0; i < N; ++i) arr[i] = Integer.parseInt(st.nextToken());
		Arrays.sort(arr); //이진 탐색을 위한 정렬
        
		int M = Integer.parseInt(br.readLine());
		st = new StringTokenizer(br.readLine());
		for(int i = 0; i < M; ++i)
		{
			int tmp = Integer.parseInt(st.nextToken());
            //(Arrays.binarySearch() 설명
            //배열에서 찾고자하는 정수가 있다면 해당 인덱스를 리턴
            //정수가 없다면 음수를 리턴
			if(Arrays.binarySearch(arr, tmp) >= 0) sb.append(1).append("\n"); 
			else sb.append(0).append("\n");
		}
		System.out.println(sb);
	}
}

 

설명

  • 수의 범위가 매우 크기 때문에 선형 탐색을 하면 무조건 시간 초과가 날 것으로 판단했다.
  • 그래서 이진 탐색으로 구현했다.
  • Arrays.binarySearch API를 이용하여 간단하게 구현했다.

2023.01.27 - [자료구조 & 알고리즘/알고리즘] - [JAVA] 이진 검색(Binary Search)

 

[JAVA] 이진 검색(Binary Search)

Do it! 자료구조와 함께 배우는 알고리즘 입문[자바편] 연습문제와 실습문제입니다. 이진 검색 이진 검색은 선형 검색보다 좀 더 빠르게 검색할 수 있다는 장점이 있다. 하지만 이진 검색은 데이

rebugs.tistory.com

 

문제설명

 

소스코드

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;
public class Main
{	
    public static void main(String[] args) throws Exception
    {
    	List<Integer> A = new ArrayList<>();
    	BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    	StringTokenizer st = new StringTokenizer(br.readLine());
    	StringBuilder sb = new StringBuilder();
    	int N = Integer.parseInt(st.nextToken());
    	int M = Integer.parseInt(st.nextToken());
    	
    	for(int i = 0; i < 2; ++i)
    	{
    		st = new StringTokenizer(br.readLine());
        	while(st.hasMoreTokens()) A.add(Integer.parseInt(st.nextToken()));
    	}
    	Collections.sort(A);
    	for(int i = 0; i < A.size(); ++i) sb.append(A.get(i) + " ");
    	System.out.print(sb);
    }
}

 

설명

  • 굳이 A와 B를 따로 저장하지 않는다. 
    모두 ArrayList인 A에 모두 넣는다.
  • A를 정렬하고 출력한다.

문제설명

 

소스코드

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

public class Main
{
    static StringBuilder sb = new StringBuilder();
    static void hanoi(int TopNum, int x, int y)
    {
        if (TopNum > 1) hanoi(TopNum - 1, x, 6 - x - y);
        sb.append(x + " " + y ).append("\n");
        if (TopNum > 1) hanoi(TopNum - 1, 6 - x - y, y);
    }
	
    public static void main(String[] args) throws Exception
    {
    	BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    	
    	int n = Integer.parseInt(br.readLine());
    	System.out.println((int)Math.pow(2, n) - 1);
    	hanoi(n, 1, 3);
    	sb.toString();
    	System.out.println(sb);
    }
}

 

설명

2023.02.03 - [자료구조 & 알고리즘/알고리즘] - [JAVA] 하노이의 탑 (Tower of Hanoi)

 

[JAVA] 하노이의 탑 (Tower of Hanoi)

Do it! 자료구조와 함께 배우는 알고리즘 입문[자바편] 연습문제와 실습문제입니다. 하노이의 탑 설명 1, 2, 3번 기둥 이렇게 3개의 기둥과 크기가 모두 다른 n개의 원판이 있을 때, n개의 원판 모두

rebugs.tistory.com

 

문제설명

 

 

소스코드

import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Main {
    public static void main(String[] args) throws Exception
    {
    	BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        int coinCount = 0;
         while(true)
         {
            if(n % 5 == 0)
            {
                 coinCount += n / 5;
                 System.out.println(coinCount);
                 break;
            }
            else
            {
                 n -= 2;
                 ++coinCount;
            }
            if(n < 0)
            {
                 System.out.println(-1);
                 break;
            }
         }
    }
}

 

설명

  • n을 5로 나누었을때 나머지가 0이 되면 종료 조건이 된다. (n이 0이면 n을 5로 나눈 나머지도 0이기 때문)
  • n 이 음수라면 동전을 교환해줄 수 없다.
  • n을 5로 나누었을 때 나머지가 0이면, 동전 개수에 n을 5로 나누었을 때 몫을 더하고 출력한다.
     외의 경우에는 n을 2만큼 감소시키고, 동전 개수를 증가시킨다.

문제설명

 

소스코드

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.StringTokenizer;
public class Main {
	public static void main(String[] args) throws Exception
	{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = null;
		int N = Integer.parseInt(br.readLine());
		Map<String, Boolean> dance = new HashMap<>(); //이름과 true or false를 저장, true 면 춤을 춘다.
		for(int i = 0; i < N; ++ i)
		{
			st = new StringTokenizer(br.readLine());
			
			String p1 = st.nextToken(); //첫 번째 이름을 받아옴
			String p2 = st.nextToken(); //두 번째 이름을 받아옴
			
			if(p1.equals("ChongChong") == true || p2.equals("ChongChong") == true)
			{ //총총이라는 이름이 있다면 둘 다 춤추게 만듦
				dance.put(p1, true); 
				dance.put(p2, true);
				continue;
			}
			if(dance.containsKey(p1) == true)
			{ //한 명이라도 춤을 추고 있다면 나머지도 춤을 추게 만든다.
				if(dance.get(p1) == true) 
				{
					dance.put(p2, true);
					continue;
				}
			}
			if(dance.containsKey(p2) == true)
			{ //한 명이라도 춤을 추고 있다면 나머지도 춤을 추게 만든다.
				if(dance.get(p2) == true)
				{
					dance.put(p1, true);
					continue;
				}
			}
            //아무도 춤을 추고 있지 않다면 둘 다 false로 저장
			dance.put(p1, false);
			dance.put(p2, false);
		}
		int count = 0;
		Set<Entry<String, Boolean>> entrySet = dance.entrySet(); //dance 엔트리 셋을 가져옴
		Iterator<Entry<String, Boolean>> entryIterator = entrySet.iterator(); //entrySet의 이터레이터를 가져옴
		while (entryIterator.hasNext()) {
			Entry<String, Boolean> entry = entryIterator.next();
			Boolean v = entry.getValue(); //이터레이터의 값을 가져옴
			if(v == true) ++count; // 값이 true면 count를 증가
		}
		System.out.print(count);
	}
}

 

설명

  • 이름과 춤을 추고 있는지 여부를 저장하는 해시맵 dance<String, Boolean>을 선언(true= 춤추고 있음, false = 춤 안추고 있음)
  • p1과 p2 둘 중 한 명이라도 춤을 추고 있다면 모두 춤을 추게 만든다.
  • p1과 p2 둘 중 한 명의 이름이 ChongChong이라면 둘 다 춤을 추게 만든다.
  • dance의 엔트리 셋을 가져온다. = 변수명 entrySet
  • entrySet의 이터레이터(반복자)를 가져온다.
  • 반복자를 통해 dance 해시맵의 값을 가져온다.
  • dance 해시맵의 값이 true인 사람의 수를 출력한다.

문제설명

 

 

소스코드

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
public class Main {
	public static void main(String[] args) throws Exception
	{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int N = Integer.parseInt(br.readLine());
		Queue<Integer> queue = new LinkedList<>();
		for(int i = 1; i <= N; ++i) queue.add(i);
		while(queue.size() != 1)
		{
			queue.poll();
			queue.add(queue.poll());
		}
		System.out.println(queue.poll());
	}
}

 

설명

  • 큐의 사이즈가 1이 될 때까지 아래의 내용을 반복한다.
    1. 제일 위의 카드를 버린다.
    2. 이후 제일 위의 카드를 카드 뭉태기 제일 밑으로 보낸다.
  • 큐의 사이즈가 1이면 while문을 탈출하고, 큐의 남은 카드 하나를 출력한다.

문제설명

 

 

소스코드

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class Main {
	public static void main(String[] args) throws Exception
	{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		int N = Integer.parseInt(st.nextToken());
		int K = Integer.parseInt(st.nextToken());
		Queue<Integer> tmp = new LinkedList<>();
		Queue<Integer> ans = new LinkedList<>();
		for(int i = 1; i <= N; ++i) tmp.add(i);
		while(!tmp.isEmpty())
		{
			for(int i = 1; i < K; ++i) tmp.add(tmp.poll());
			ans.add(tmp.poll());
		}
		System.out.print("<");
		while(ans.size() > 1)System.out.print(ans.poll() + ", ");
		System.out.print(ans.poll() + ">");
	}
}

 

설명

핵심 코드는 아래의 코드이다.

for(int i = 1; i < K; ++i) tmp.add(tmp.poll());
ans.add(tmp.poll());

만약 K = 3이라면 1 2 3 4 5 6 7 중에서 맨 앞 두 개를 잘라내기 후 붙여넣는다. -> 3 4 5 6 7 1 2

이후 맨 앞의 3을 ans큐에 넣는다.

이 행동을 tmp 큐가 비워질 때 까지 반복한다.

tmp 1 2 3 4 5 6 7 ans null
4 5 6 7 1 2 3
7 1 2 4 5 3 6
4 5 7 1 3 6 2
1 4 5 3 6 2 7
1 4 3 6 2 7 5
1 3 6 2 7 5 1
null 3 6 2 7 5 1 4

 

그 다음 ans 큐의 모든 원소를 출력하면 된다.