Do it! 자료구조와 함께 배우는 알고리즘 입문[자바편] 연습문제와 실습문제입니다.
곱셈표
일반 곱셈표
public class Test{
public static void main(String[] args) {
for(int i = 1; i<10; ++i)
{
for(int j = 1; j<10; ++j)
{
System.out.print(i*j + " ");
}
System.out.println();
}
}
}
/*
1 2 3 4 5 6 7 8 9
2 4 6 8 10 12 14 16 18
3 6 9 12 15 18 21 24 27
4 8 12 16 20 24 28 32 36
5 10 15 20 25 30 35 40 45
6 12 18 24 30 36 42 48 54
7 14 21 28 35 42 49 56 63
8 16 24 32 40 48 56 64 72
9 18 27 36 45 54 63 72 81
*/
보기 좋은 곱셈표
public class Test{
public static void main(String[] args) {
for(int i = 1; i<10; ++i)
{
for(int j = 1; j<10; ++j)
{
System.out.printf("%3d", i*j);
}
System.out.println();
}
}
}
/*
1 2 3 4 5 6 7 8 9
2 4 6 8 10 12 14 16 18
3 6 9 12 15 18 21 24 27
4 8 12 16 20 24 28 32 36
5 10 15 20 25 30 35 40 45
6 12 18 24 30 36 42 48 54
7 14 21 28 35 42 49 56 63
8 16 24 32 40 48 56 64 72
9 18 27 36 45 54 63 72 81
*/
설명
C언어 계열에서 printf문법과 같다.
%3d는 총 자리수가 3이고 오른쪽 정렬을 한다는 뜻이다.
예를 들어 %d에 3을 넣으면 단순히 3이 출력되지만, %3d에 3을 넣으면 공백 2번 + 3이 출력된다.
반대로 %-3d에 3을 넣으면 3 + 공백 2번이 출력된다.
곱셈표 심화
위와 같이 |, -, + 를 사용하여 위쪽과 왼쪽에 곱하는 수가 있는 곱셈표를 출력하는 프로그램을 작성
public class Test{
public static void main(String[] args) {
for(int i = 0; i<11; ++i)
{
for(int j = 0; j<11; ++j)
{
if(i==0&&j==0) {System.out.print(" ");}
if(i==1)
{
if(i==1&&j==1) {}
else System.out.print("---");
}
if(i==0&&j>1) {System.out.printf("%3d", j-1);}
if(j==0&&i>1) {System.out.printf("%3d", i-1);}
if(i==1&&j==1) {System.out.print("+");}
if(j==1)
{
if(i==1&&j==1) {}
else System.out.print("|");
}
if(i>1&&j>1) {System.out.printf("%3d", (i-1)*(j-1));}
}
System.out.println();
}
}
}
/*
| 1 2 3 4 5 6 7 8 9
---+---------------------------
1| 1 2 3 4 5 6 7 8 9
2| 2 4 6 8 10 12 14 16 18
3| 3 6 9 12 15 18 21 24 27
4| 4 8 12 16 20 24 28 32 36
5| 5 10 15 20 25 30 35 40 45
6| 6 12 18 24 30 36 42 48 54
7| 7 14 21 28 35 42 49 56 63
8| 8 16 24 32 40 48 56 64 72
9| 9 18 27 36 45 54 63 72 81
*/
덧셈표
public class Main{
public static void main(String[] args) {
for(int i = 0; i<11; ++i)
{
for(int j = 0; j<11; ++j)
{
if(i==0&&j==0) {System.out.print(" ");}
if(i==1)
{
if(i==1&&j==1) {}
else System.out.print("---");
}
if(i==0&&j>1) {System.out.printf("%3d", j-1);}
if(j==0&&i>1) {System.out.printf("%3d", i-1);}
if(i==1&&j==1) {System.out.print("+");}
if(j==1)
{
if(i==1&&j==1) {}
else System.out.print("|");
}
if(i>1&&j>1) {System.out.printf("%3d", (i-1)+(j-1));}
}
System.out.println();
}
}
}
/*
| 1 2 3 4 5 6 7 8 9
---+---------------------------
1| 2 3 4 5 6 7 8 9 10
2| 3 4 5 6 7 8 9 10 11
3| 4 5 6 7 8 9 10 11 12
4| 5 6 7 8 9 10 11 12 13
5| 6 7 8 9 10 11 12 13 14
6| 7 8 9 10 11 12 13 14 15
7| 8 9 10 11 12 13 14 15 16
8| 9 10 11 12 13 14 15 16 17
9| 10 11 12 13 14 15 16 17 18
*/
정사각형 출력
입력 받은 수를 한 변으로 하는 정사각형을 * 기호로 출력
import java.util.Scanner;
public class Main{
static void square(int n)
{
for(int i = 0; i < n; ++i){for(int j = 0; j < n; ++j) {System.out.print("*");}
System.out.println();
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("단 수 입력 : ");
int n = sc.nextInt();
square(n);
}
}
/*
단 수 입력 : 5
*****
*****
*****
*****
*****
*/
직각 이등변 삼각형 출력
도움
안쪽 루프와 바깥쪽 루프의 선언부를 유심히 보면서 분석해야한다.
변수가 몇부터 시작하는지, 제어식과 증가식이 어떻게 다르게 설정해야 하는지, 조건문은 어떻게 설정할지
유심히 생각하고 봐야 한다.
밑에 나열된 4개의 직각 이등변 삼각형 문제는 대표적인 이중 for문 알고리즘 문제이다.
답지를 보진 않았지만 난 머리가 나빠서 오래 걸렸다.
결국 이 알고리즘들을 생각하지 못했더라도 좌절하지 말자
유명 강사분도 이 알고리즘들을 처음 접했을 때 결국 풀어내지 못했다고 한다.
왼쪽 아래가 직각인 이등변 삼각형
사용자로부터 단 수를 입력받고, 왼쪽 아래가 직각인 이등변 삼각형
import java.util.Scanner;
public class Test{
static void triangleLB(int n)
{
for(int i = 0; i < n; ++i)
{
for(int j = 0; j <= i; ++j)
{
System.out.print("*");
}
System.out.println();
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int nc;
do {
System.out.print("단 수 입력 : ");
nc = sc.nextInt();
}
while(nc<=0);
triangleLB(nc);
}
}
/*
단 수 입력 : 10
*
**
***
****
*****
******
*******
********
*********
**********
*/
답지 코드
static void triangleLB(int n) { for (int i = 1; i <= n; i++) { // i행 (i = 1, 2, … ,n) for (int j = 1; j <= i; j++) // i개의 '*'를 나타냄 System.out.print('*'); System.out.println(); // 개행(줄변환) } }
왼쪽 위가 직각인 이등변 삼각형
사용자로부터 단 수를 입력 받고, 왼쪽 위가 직각인 이등변 삼각형
import java.util.Scanner;
public class Test{
static void triangleLU(int n)
{
for(int i = n; i > 0; --i)
{
for(int j = 0; j < i; ++j)
{
System.out.print("*");
}
System.out.println();
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int nc;
do {
System.out.print("단 수 입력 : ");
nc = sc.nextInt();
}
while(nc<=0);
triangleLU(nc);
}
}
/*
단 수 입력 : 10
**********
*********
********
*******
******
*****
****
***
**
*
*/
답지 코드
static void triangleLU(int n) { for (int i = 1; i <= n; i++) { // i행 (i = 1, 2, … ,n) for (int j = 1; j <= n - i + 1; j++) // n-i+1개의 '*'를 나타냄 System.out.print('*'); System.out.println(); // 개행(줄변환) } }
오른쪽 위가 직각인 이등변 삼각형
사용자로부터 단 수를 입력 받고, 오른쪽 위가 직각인 이등변 삼각형
import java.util.Scanner;
public class Test{
static void triangleRU(int n)
{
for(int i = 0; i < n; ++i)
{
for(int j = 0; j < n; ++j)
{
if(i<=j)System.out.print("*");
else System.out.print(" ");
}
System.out.println();
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int nc;
do {
System.out.print("단 수 입력 : ");
nc = sc.nextInt();
}
while(nc<=0);
triangleRU(nc);
}
}
/*
단 수 입력 : 10
**********
*********
********
*******
******
*****
****
***
**
*
*/
답지 코드
static void triangleRU(int n) { for (int i = 1; i <= n; i++) { // i행 (i = 1, 2, … ,n) for (int j = 1; j <= i - 1; j++) // i-1개의 ' '를 나타냄 System.out.print(' '); for (int j = 1; j <= n - i + 1; j++) // n-i+1개의 '*'를 나타냄 System.out.print('*'); System.out.println(); // 개행(줄변환) } }
오른쪽 아래가 직각인 이등변 삼각형
사용자로부터 단 수를 입력 받고, 오른쪽 아래가 직각인 이등변 삼각형
import java.util.Scanner;
public class Test{
static void triangleRB(int n)
{
for(int i = 1; i <= n; ++i)
{
for(int j = 1; j <= n; ++j)
{
if(n-j < i)System.out.print("*");
else System.out.print(" ");
}
System.out.println();
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int nc;
do {
System.out.print("단 수 입력 : ");
nc = sc.nextInt();
}
while(nc<=0);
triangleRB(nc);
}
}
/*
단 수 입력 : 10
*
**
***
****
*****
******
*******
********
*********
**********
*/
답지 코드
static void triangleRB(int n) { for (int i = 1; i <= n; i++) { // i행 (i = 1, 2, … ,ln) for (int j = 1; j <= n - i; j++) // n-i개의 ' '를 나타냄 System.out.print(' '); for (int j = 1; j <= i; j++) // i개의 '*'를 나타냄 System.out.print('*'); System.out.println(); // 개행(줄변환) } }
피라미드
도움
피라미드의 최하단은 2n-1이다.
피라미드의 중심축은 n-1이다.
중심축을 따라서 단이 늘어날수록 왼쪽과 오른쪽의 공백을 줄여주면 된다.
일반 피라미드
import java.util.Scanner;
public class Test{
static void spira(int n)
{
for(int i = 0; i < n; ++i)
{
for(int j = 0; j <= n+(n-1); ++j)
{
if(j<n-1-i) System.out.print(" ");
else if(j>n-1+i) System.out.print(" ");
else System.out.print("*");
}
System.out.println();
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int nc;
do {
System.out.print("단 수 입력 : ");
nc = sc.nextInt();
}
while(nc<=0);
spira(nc);
}
}
/*
단 수 입력 : 10
*
***
*****
*******
*********
***********
*************
***************
*****************
*******************
*/
답지 코드
static void spira(int n) { for (int i = 1; i <= n; i++) { // i행 (i = 1, 2, … ,n) for (int j = 1; j <= n - i + 1; j++) // n-i+1개의 ' '를 나타냄 System.out.print(' '); for (int j = 1; j <= (i - 1) * 2 + 1; j++) // (i-1)*2+1개의 '*'를 나타냄 System.out.print('*'); System.out.println(); // 개행(줄변환) }
숫자 피라미드
import java.util.Scanner;
public class Test{
static void spira(int n)
{
for(int i = 0; i < n; ++i)
{
for(int j = 0; j <= n+(n-1); ++j)
{
if(j<n-1-i) System.out.print(" ");
else if(j>n-1+i) System.out.print(" ");
else System.out.print((i+1) % 10);
}
System.out.println();
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int nc;
do {
System.out.print("단 수 입력 : ");
nc = sc.nextInt();
}
while(nc<=0);
spira(nc);
}
}
/*
단 수 입력 : 10
1
222
33333
4444444
555555555
66666666666
7777777777777
888888888888888
99999999999999999
0000000000000000000
*/
답지 코드
static void spira(int n){ for (int i = 1; i <= n; i++) { // i행 (i = 1, 2, … ,n) for (int j = 1; j <= n - i + 1; j++) // n-i+1개의 ' '를 나타냄 System.out.print(' '); for (int j = 1; j <= (i - 1) * 2 + 1; j++) // (i-1)*2+1개의 '*'를 나타냄 System.out.print(i % 10); System.out.println(); // 개행(줄변환) } }
'자료구조 & 알고리즘 > 알고리즘' 카테고리의 다른 글
[JAVA] 배열 요소를 역순으로 정렬하는 알고리즘 (0) | 2023.01.21 |
---|---|
[JAVA] n개의 데이터 최댓값 구하기(난수 사용) (0) | 2023.01.20 |
[JAVA] 두 자리 양의 정수만 입력받기, 드모르간 법칙 (0) | 2023.01.19 |
[JAVA] 사전 / 사후 판단 반복(양수만 입력받기, 정수 자릿수 구하기) (0) | 2023.01.18 |
[JAVA] 정수의 합을 구하는 알고리즘 (0) | 2023.01.18 |