반응형
이번 글에서는 백준 1037번 문제를 통해,
알고리즘 기본 문제 단골인 소수, 약수, 공배수 들 중 하나인 약수를 활용하여 문제를 풀어보자

문제 핵심

  • 첫째 줄 : 약수의 개수
  • 둘째 줄 : 약수들
  • 구하려는 정수 : N
    • ( 풀이 과정에서는 구하려는 정수 N을 x라고 설명 )

풀이 과정

자연수 x을 구하려면 1과 x을 제외한 주어진 약수 중에서 선택해야 한다.

만약 이 때 조건과 같이 30의 약수를 차례대로 나열하면 [ 2, 3, 5, 6, 10, 15 ] 이다.

그렇다면 양쪽에서 순서대로 모두 짝지어서 곱한다면 x인 30을 구할 수 있다.

즉, 제일 큰 값과 작은 값을 구한 후 곱해주면 된다.

 

핵심 코드

for (int i = 0; i < N; i++) {
    int num = Integer.parseInt(stringTokenizer.nextToken());
    if(num > max) {
        max = num;
    }
    if(num < min) {
        min = num;
    }
}

 

예외

9와 같은 약수는 1과 9는 제공되지 않기 때문에 3 숫자 하나만 주어진다.

이때 3의 제곱이 x가 되므로 첫째 줄이 1이라면 제곱해준다.

if(N == 1) {
    int num = Integer.parseInt(bufferedReader.readLine());
    stringBuilder.append(num * num);
}

 

단계적 풀이에서 브론즈 문제 수준으로
사실 비교적 아주 쉬운 문제이다.

이제는 마지막 브론즈 문제로 앞으로는 실버 상위부터 골드 문제가 다량으로 나올 예정이다.
지금까지 기초와 개념을 활용한다면 문제없이 풀 수 있을 것이다.


전체 코드

package org.example;

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

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer stringTokenizer;
        StringBuilder stringBuilder = new StringBuilder();
        int N = Integer.parseInt(bufferedReader.readLine());

        if(N == 1) {
            int num = Integer.parseInt(bufferedReader.readLine());
            stringBuilder.append(num * num);
        } else {
            int max = 0;
            int min = Integer.MAX_VALUE;

            stringTokenizer = new StringTokenizer(bufferedReader.readLine());
            for (int i = 0; i < N; i++) {
                int num = Integer.parseInt(stringTokenizer.nextToken());
                if(num > max) {
                    max = num;
                }
                if(num < min) {
                    min = num;
                }
            }

            stringBuilder.append(max * min);
        }

        System.out.println(stringBuilder);

    }
}
반응형
반응형

문제

JLabel을 활용하여 "Love Java"를 출력하고, "Love Java" 글자 위에 마우스를 올려 마우스 휠을 위로 굴리면 글자가 작아지고, 아래로 굴리면 글자가 커지도록 프로그램을 작성하라. 폰트 크기는 한 번에 5픽셀씩 작아지거나 커지도록 하고, 5픽셀 이하로 작아지지 않도록 해라.

 

소스 코드

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Main7 extends JFrame{
	public Main7() {
		setTitle("마우스 휠을 굴려 폰트 크기 조절");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		Container c = getContentPane();
		c.setLayout(new FlowLayout());
		
		JLabel la = new JLabel("Love Java");
		la.addMouseWheelListener(new MouseWheelListener() {
			public void mouseWheelMoved(MouseWheelEvent e) {
				int n = e.getWheelRotation();
				int size = la.getFont().getSize();
				if(n<0&&size>5) {
					la.setFont(new Font("Arial",Font.PLAIN,size-5));			
				}
				else {
					la.setFont(new Font("Arial",Font.PLAIN,size+5));
				}
			}
		});
		c.add(la);
		setSize(500,500);
		setVisible(true);
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new Main7();
	}

}
반응형
반응형

문제

클릭 연습용 스윙 응용프로그램을 작성하라. "C"를 출력하는 JLabel을 하나 만들고 초기 위치를 (100, 100)으로 하고, "C"를 클릭할 때마다 컨텐트팬 내에 랸덤한 위치로 움직이게 하라.

 

소스 코드

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Main6 extends JFrame{
	public Main6() {
		setTitle("클릭 연습 용 응용프로그램");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		Container c = getContentPane();
		
		c.setLayout(null);
		
		JLabel l = new JLabel("C");
		l.setSize(10,10);
		l.setLocation(100, 100);
		
		c.add(l);
		
		l.addMouseListener(new MouseAdapter() {
			public void mouseClicked(MouseEvent e) {
				int x = (int)(Math.random()*250);
				int y = (int)(Math.random()*250);
				l.setLocation(x, y);
			}
		});
		
		setSize(300,300);
		setVisible(true);
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new Main6();
	}

}
반응형
반응형

문제

JLabel 컴포넌트로 "Love Java"를 출력하고, 키 리스너를 작성하여 + 키를 치면 폰트 크기를 5픽셀씩 키우고, - 키를 치면 폰트 크기를 5픽셀씩 줄이는 스윙 응용프로그램을 작성하라. 5픽셀 이하로 작아지지 않도록 하라.

 

소스 코드

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Main5 extends JFrame{
	public Main5() {
		setTitle("+,-키로 폰트 크기 조절");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		Container c = getContentPane();
		
		JLabel label = new JLabel("Love Java");
		label.setFont(new Font("Arial",Font.PLAIN,10)); // Arial 폰트로 10픽섹 크기
		Font f = label.getFont();

		c.setLayout(new FlowLayout());
		
		c.addKeyListener(new KeyAdapter() {
			public void keyPressed(KeyEvent e) {
				int size = f.getSize();
				if(e.getKeyCode() == KeyEvent.VK_ADD || e.getKeyCode()==KeyEvent.VK_EQUALS) { // 전자는 숫자패드의 + 후자는 Shift와 함께쓰는 버튼입니다.
					label.setFont(new Font("Arial",Font.PLAIN,size+5));
				}
				// 플러스와 동일
				else if((e.getKeyCode() == KeyEvent.VK_MINUS || e.getKeyCode() == KeyEvent.VK_SUBTRACT) && size > 5) {
					label.setFont(new Font("Arial",Font.PLAIN,size-5));
				}
			}
		});
		
		c.add(label);
		
		setSize(300,200);
		setVisible(true);
		
		c.setFocusable(true);
		c.requestFocus();
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new Main5();
	}

}
반응형
반응형

문제

JLabel을 활용하여 "Love Java"를 출력하고 왼쪽 화살표 키(<Left> 키)를 입력할때마다 "ove JavaL", "ve JavaLo", "e JavaLov"와 같이 한 문자씩 왼쪽으로 회전하는 프로그램을 작성하라.

 

소스 코드

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Main4 extends JFrame{
	public Main4() {
		setTitle("Left 키로 문자열 이동");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		Container c = getContentPane();
		
		JLabel label = new JLabel("Love Java"); 
		c.setLayout(new FlowLayout());
		
		c.addKeyListener(new KeyAdapter() {
			public void keyPressed(KeyEvent e) {
				if(e.getKeyCode() == KeyEvent.VK_LEFT) {  
					label.setText(label.getText().substring(1) + label.getText().charAt(0));
				}		
			}
		});
		
		c.add(label);
		
		setSize(300,100);
		setVisible(true);
		
		c.setFocusable(true);
		c.requestFocus();
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new Main4();
	}

}
반응형
반응형

문제

JLabel을 활용하여 "Love Java"를 출력하고 왼쪽 화살표 키(<Left> 키)를 입력할 때마다 "avaJ evoL"와 "Love Java"를 번갈아 출력하는 스윙 프로그램을 작성하라

 

소스 코드

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Main3 extends JFrame{
	public Main3() {
		setTitle("Left 키로 문자열 교체");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		Container c = getContentPane();
		
		JLabel label = new JLabel("Love Java"); 
		c.setLayout(new FlowLayout());
		
		c.addKeyListener(new KeyAdapter() {
			public void keyPressed(KeyEvent e) {
				if(e.getKeyCode() == KeyEvent.VK_LEFT) {  
					if(label.getText().equals("Love Java")) {
						label.setText("avaJ evoL");
					}
					else if(label.getText().equals("avaJ evoL")) {
						label.setText("Love Java");	
					}
				}		
			}
		});
		
		c.add(label);
		
		setSize(300,100);
		setVisible(true);
		
		c.setFocusable(true);
		c.requestFocus();
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new Main3();
	}

}
반응형
반응형

문제

컨텐트팬의 배경색은 초록색으로 하고 마우스를 드래깅하는 동안만 노란색으로 유지하는 스윙 응용프로그램을 작성하라.

 

소스 코드

import javax.swing.*;
import java.awt.event.*;
import java.awt.*;

public class Main2 extends JFrame{
	public Main2() {
		setTitle("드래깅동안 YELLOW...");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		Container c = getContentPane();
		Panel p = new Panel();
		p.setBackground(Color.green);
		
		p.addMouseMotionListener(new MouseAdapter() {
			public void mouseDragged(MouseEvent e) {
				p.setBackground(Color.yellow);
			}
		});
		p.addMouseListener(new MouseAdapter() {
			public void mouseReleased(MouseEvent e) {
				p.setBackground(Color.green);
			}
		});
		c.add(p);
		
		setSize(300,200);
		setVisible(true);
	}
	public static void main(String[] args) {
		new Main2();
		
	}

}

 

반응형
반응형

문제

문제 13을 확장하여 다음 명령을 추가하라.

 

명령 사용 예시

>>rename phone txt p.txt //phone.txt를 p.txt로 변경. 파일과 디렉터리 이름 변경
>>mkdir xxx // 현재 디렉터리 밑에 xxx 디렉터리 생성

 

소스 코드 ( 실습문제 13번 디렉터리 이동 부분 NullPointerException 오류도 수정 하였습니다. )

import java.io.*;
import java.util.*;

public class Main13 {
	public static void ListFile(File f) {
		File[]subFiles = f.listFiles();
		for(int i = 0;i<subFiles.length;i++) {
			File file = subFiles[i];
			
			// 파일 종류
			if(file.isDirectory())
				System.out.print("dir\t");
			else if(file.isFile())
				System.out.print("file\t");
			
			System.out.printf(file.length()+"바이트"); // 파일 크기
			System.out.println("   \t"+file.getName()); // 파일이름
		}
	}
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		File f = new File("C:\\");
		Scanner s = new Scanner(System.in);
		System.out.println("***** 파일 탐색기입니다. *****");
		System.out.println("\t["+f.getPath()+"]");
		ListFile(f);
		while(true) {
			
			System.out.print(">>");
			String search = s.next();
			if(search.equals("그만")) {
				break;
			}
			else if(search.equals("..")) {
				File temp = new File(f.getParent());
				f = temp;
			}
			else if(search.equals("rename")) {
				String Changename = s.nextLine();
				try {
					StringTokenizer st = new StringTokenizer(Changename," ");
					while(st.hasMoreTokens())
					{
						File temp = new File(f.getPath()+"\\"+st.nextToken());
						File renameFile = new File(f.getPath()+"\\"+st.nextToken());
						temp.renameTo(renameFile);
					}
				}catch(NoSuchElementException e) {
					System.out.println("두 개의 파일명이 주어지지 않았습니다.!");
					continue;
				}
			}
			
			else if(search.equals("mkdir")) {
				String name = s.nextLine();
				File fout = new File(f.getPath()+"\\"+name);
				if(!fout.exists()) {
					System.out.println(fout.getName()+ " 디렉터리를 생성하였습니다.");
					fout.mkdir();
				}
				else {
					System.out.println("이미 존재하는 파일입니다.");
					continue;
				}
				
			}
			else {
					File temp = new File(f.getPath()+"\\"+search);	
					f = temp;		
			}
			try {
				System.out.println("\t["+f.getPath()+"]");
				ListFile(f);
			}catch(NullPointerException e) {
				System.out.println("없는 파일입니다.");
				continue;
			}
		}
		s.close();
	}
}
반응형
반응형

문제

간단한 파일 탐색기를 만들어보자. 처음 시작은 C:\에서부터 시작한다. 명령은 크게 2가지로서 ".."를 입력하면 부모 디렉터리로 이동하고, "디렉터리명"을 입력하면 서브 디렉터리로 이동하여 파일리스트를 보여준다.

(출력예시는 너무 길어 생략하겠습니다.)

 

소스 코드

import java.io.*;
import java.util.*;

public class Main13 {
	public static void ListFile(File f) {
		File[]subFiles = f.listFiles();
		for(int i = 0;i<subFiles.length;i++) {
			File file = subFiles[i];
			
			// 파일 종류
			if(file.isDirectory())
				System.out.print("dir\t");
			else if(file.isFile())
				System.out.print("file\t");
			
			System.out.printf(file.length()+"바이트"); // 파일 크기
			System.out.println("   \t"+file.getName()); // 파일이름
		}
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		File f = new File("C:\\");
		Scanner s = new Scanner(System.in);
		System.out.println("***** 파일 탐색기입니다. *****");

		while(true) {
			System.out.println("\t["+f.getPath()+"]");
			ListFile(f);
			System.out.print(">>");
			String search = s.nextLine();
			if(search.equals("그만")) {
				break;
			}
			else if(search.equals("..")) {
				File temp = new File(f.getParent());
				f = temp;
			}
			else {
				File temp = new File(f.getPath()+"\\"+search);	
				f = temp;
			}
		}
		s.close();
	}
}
반응형
반응형

문제

텍스트 파일에 있는 단어를 검색하는 프로그램을 작성해보자. 실행 예시는 프로젝트 폴더 밑에 자신이 작성한 자바 파일( 예 : test.java )을 복사하여 두고 읽은 경우이다.

 

출력 예시

전체 경로명이 아닌 파일 이름만 입력하는 경우, 파일은 프로젝트 폴더에 있어야 합니다.
대상 파일명 입력>> test.java
검색할 단어나 문장>> void
4: public static void main(String[] args) {
검색할 단어나 문장>> int
9: System.out.println("전체 경로명이 아닌 파일 이름만 입력하는 경우, 파일은 프로젝트 폴더에 있어야 합니다."); 11: System.out.print("첫 번째 파일 이름을 입력하세요>>");
14: System.out.print("두 번째 파일 이름을 입력하세요>>");
17: System.out.print(src + "와 " + dst + "를 비교합니다.");
22: System.out.println("파일이 같습니다.");
24: System.out.println("파일이 다릅니다.");
29: System.out.println("입출력 오류가 발생했습니다.);
39: int srcCount=0, destCount;
49: for (int i=0; i<srcCount;i++) {
검색할 단어나 문장>> for
49: for (int i=0; i<srcCount;i++) {
검색할 단어나 문장>> 그만
프로그램을 종료합니다.

 

소스 코드

import java.io.*;
import java.util.*;
public class Main12 {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		FileReader fin = null;
		BufferedReader bf = null;
		System.out.println("전체 경로명이 아닌 파일 이르만 입력하는 경우, 파일은 프로젝트 폴더에 있어야 합니다.");
		System.out.print("대상 파일명 입력>> ");
		Scanner s = new Scanner(System.in);
		String file = s.nextLine();
		Vector<String> v = new Vector<String>();
		try {
			fin = new FileReader(file);
			bf = new BufferedReader(fin);
			String Line = "";
			while((Line = bf.readLine()) != null) {
				v.add(Line);
			}
			fin.close();
			bf.close();
		}catch(IOException e) {
			System.out.println("입출력 오류");
			return;
		}
		while(true) {
			System.out.print("검색할 단어나 문장>> ");
			String word = s.nextLine();
			if(word.equals("그만")) {
				System.out.println("프로그램을 종료합니다.");
				break;
			}
			for(int i =0;i<v.size();i++)
			{
				if(v.get(i).contains(word)) {
					System.out.printf("%3d:",i);
					System.out.println(v.get(i));
				}			
			}
		}
        s.close();
	}

}

 

 

반응형

+ Recent posts