-
※문제. 정수 하나를 입력받아, 그 수가 양수일때만 입력된 수를 줄 수로 적용하여 다음과 같이 출력되게 하는 프로그램을 만들어보자.
정수 입력 : 5
*
**
***
****
*****
****
***
**
*배열을 반으로 나누어서 별을 찍어야 하는 문제.
더보기1234567891011121314151617181920212223242526272829303132public void test() {Scanner sc = new Scanner(System.in);System.out.print("정수 입력 : ");int num = sc.nextInt();//유효성 검사if(num <= 0) {System.out.println("양수가 아닙니다.");return;}//위 삼각형 출력for(int i = 0; i < num; i++) {for(int j = 0; j < num; j++) {System.out.print('*');if(i == j)break;}System.out.println();}//아래 역삼각형 출력for(int i = 0; i < num - 1; i++) {for(int j = 0; j < num; j++) {if(i >= j)System.out.print(" ");elseSystem.out.print('*');}System.out.println();}}cs
나는 아예 위의 배열이랑 아래 배열을 나누어서 풀었다.위에는 오름차순으로 별을 찍기만 하면 된다.
주의해야 하는 건 아래의 역삼각형.
5를 입력할 때로 생각하면 열은 5를 유지하면서 별과 띄어쓰기의 수가 유동적으로 움직인다.
if문을 이용해서 열의 값이 행의 값보다 작거나 같으면 " "를, 아닌 경우 "*"을 입력하도록 했다.
더보기123456789101112131415161718192021222324252627282930313233//num을 입력하면 num*2 - 1 만큼의 값이 행의 수, num만큼의 값이 열의 수가 된다.public void answer() {Scanner sc = new Scanner(System.in);System.out.print("정수 입력 : ");int num = sc.nextInt();//유효성 검사if(num <= 0) {System.out.println("양수가 아닙니다.");return;}int row = num * 2 - 1;for(int i = 0; i < row; i++) {if(i < num) {//i = 0이면 1번(j = 0), i = 1이면 2번(j = 0, 1) ... 실행for(int j = 0; j <= i; j++) {System.out.print("*");}}else {int blank = i - (num - 1); //공백의 수for(int j = 0; j < num; j++) {if(j < blank)System.out.print(" ");elseSystem.out.print("*");}}System.out.println();}}cs 선생님은 for문 하나에 모두 담아 if문으로 위 아래 삼각형의 범위를 나누고 그 안에서 for문을 실행했다.
blank라는 변수를 따로 선언해서 blank보다 열의 수가 작으면 " "을 입력한다.
※문제. 1) 3행4열 2차원배열 선언 및 생성 2) 0행0열부터 2행2열까지 1부터 100사이의 임의의 정수값 기록해 넣음
0열 1열 2열 3열
0행 값 값 값 0행 값들의 합계
1행 값 값 값 1행 값들의 합계
2행 값 값 값 2행 값들의 합계더보기1234567891011121314151617181920212223242526272829public void exercise2() {Random rnd = new Random();//3행4열 2차원배열 선언 및 생성int[][] arr = new int[3][4];//0행0열 ~ 2행2열까지 난수 입력for(int i = 0; i < arr.length; i++) {int sum = 0;for(int j = 0; j < arr[i].length; j++) {if(j < arr[i].length -1) {arr[i][j] = rnd.nextInt(100)+1;sum += arr[i][j];}else {arr[i][j] = sum;}}}System.out.println("\t0열\t1열\t2열\t3열\t");for(int x = 0; x < arr.length; x++) {System.out.print(x + "행\t");for(int y = 0; y < arr[x].length; y++) {System.out.print(arr[x][y] + "\t");}System.out.println();}}cs
for문 안에서 제일 마지막 열보다 1 작을 때까지는 1~100 사이의 난수를 넣고, sum이라는 변수를 따로 만들어 같은 행의 열들을 복합대입연산자를 통해 더해줬다.if - else로 범위를 나누고 출력은 따로 했다.
템플릿을 맞추려면 그냥 따로 for문 작성하는 게 깔끔해보여서 이렇게 했는데 다른 사람들도 그렇게 생각할지는 모르겠다.
더보기이건 앞의 문제에 더해서 4행4열짜리 2차원 배열을 만들어 마지막 행, 마지막 열에는 각 행, 열의 총합을 구하는 것.
훨씬 복잡하다.
1234567891011121314151617181920212223242526272829303132333435363738394041424344public void answer2() {Random rnd = new Random();int[][] arr = new int [4][4];int col0Sum = 0;int col1Sum = 0;int col2Sum = 0;for(int i = 0; i < arr.length; i++) {int rowSum = 0; //행의 누적합 변수. 행마다 초기화되어야 한다.for(int j = 0; j < arr[i].length; j++) {if(i < arr.length - 1) {//난수 대입 행if(j < arr[i].length - 1) {//난수 대입arr[i][j] = rnd.nextInt(100) + 1;rowSum += arr[i][j];switch(j) {case 0 : col0Sum += arr[i][j]; break;case 1 : col1Sum += arr[i][j]; break;case 2 : col2Sum += arr[i][j]; break;}}else {//마지막 열. 각 행의 합 대입arr[i][j] = rowSum;}}else {//마지막 행switch(j) {case 0 : arr[i][j] = col0Sum; break;case 1 : arr[i][j] = col1Sum; break;case 2 : arr[i][j] = col2Sum; break;}}System.out.print(arr[i][j] + " ");}System.out.println();}}cs 같은 행의 다른 열 값을 더하는 것은 순서대로 진행되는 값들을 더하면 되기 때문에 그렇게 어렵지 않지만,
같은 열의 다른 행 값을 더하는 것은 순서가 없기 때문에 복잡해진다.
0열, 1열, 2열의 총합을 담을 변수를 각각 선언해주고 switch문을 이용해 해당 열일 때의 값들을 각각 복합대입연산자로 더해준다.
if문의 중첩에 switch에 for문까지 고루고루 들어간다...
언제 이걸 사용하고 이걸 사용하지 않을지, 어떤 메소드가 가장 효율적인지 생각해내고 사용하는 게 제일 어려운 것 같다.
'혼자 있는 방 > Java' 카테고리의 다른 글
Homework(8) (0) 2021.06.30 Test(1) (0) 2021.06.28 Homework(6) (0) 2021.06.24 Homework(5) (0) 2021.06.23 Homework(4) (0) 2021.06.22 댓글