중. Triangular Output

 

다음 예제와 같이 삼각형 모양으로 ‘*’을 출력하세요. (공백의 개수와 별의 개수를 정확하게 확인해주시길 바랍니다. 🙆🏻‍♂️)

 

3   *
 ***
*****
6

     *
    ***
   *****
  *******
 *********
***********

 

 

추측) 

일단 주어진 수많큼 줄이 생긴다.

모든 줄의 가운데 별은 인자 값으로 받는 int star 값 자리에서 출력된다. 

2중 for문을 사용해야 할거 같다. 일단 첫번째 for문은 행을 출력할 용도.

두번째 for문은 열을 따져 별을 출력해야 하는 데 n-i 와 n+i 사이면 *을 출력하면 될 듯 하다.

 

소스코드) 

public class Test1 {
    public void solution(int star){
        String answer = "";
        for(int i=0; i<star; i++){
            for(int j=0; j<star+star; j++){
                answer += (j>=star-i && j<=star+i) ? "*" : " ";
                if(j == star+(star-1)){
                    answer += "\n";
                }
            }
        }
        System.out.println(answer);
    }

    public static void main(String[] args) {
        Test1 method = new Test1();
        int star = 9;
        method.solution(star);
    }
}

 

 


상. 상하좌우 큰 수 찾기

 

 

5x5 2차원 배열이 주어질 때 어떤 원소가 상하좌우에 있는 원소보다 클 때 해당 위치에 * 을 표시하는 프로그램을 작성하세요. 경계선에 있는 수는 상하좌우 중 존재하는 원소만을 비교합니다.

 

[[3,4,1,4,9],[2,9,4,5,8],[9,0,8,2,1],[7,0,2,8,4],[2,7,2,1,4]] 3 4 1 4 *
2 * 4 5 8
* 0 * 2 1
7 0 2 * 4
2 * 2 1 4

 

추측) 

상하좌우를 어떻게 비교해야할까 

일단 for문을 돌려 행으로 배열을 열고 그안에 for문을 3개를 돌려야 할듯하다. 3개의 for문이 같은 돌면서 뒤의 인덱스 같은 위치, 앞의 인덱스 다른 숫자를 출력해 이를 비교하고 중앙 경우 전후의 값까지 출력해서 중심이 되는 값이랑 비교하는 작업을 진행

모두의 숫자보다 크다면(이건 판별 카운트를 넣어야 겠다) 중앙 숫자를 *으로 바꿔 배열에 넣어주고 아니면 숫자를 그대로 배열에 넣어 주면 될 듯하다. 

경계부분 행 경우에는 행의 인덱스 0과 인덱스 (길이-1) 때에 for문을 하나씩 패스할 수 있게 하면 될거 같고

경계부분 열 경우에는 열의 인덱스 0과 인덱스 (길이-1) 때에 좌우 중 하나만 출력하게 처리하면 될거 같다.

 

소스코드) 

public class Test2 {
    public void solution(int[][] arr) {
        String answer = "";
        int centerValue = 0;
        int ckNum = 0; // 체크할 대상 개수
        int ckCnt = 0; // 큰 숫자가 있는 경우 올라가는 카운트

        for(int i=0; i<arr.length; i++){

            for(int k=0; k<arr[i].length; k++){
                // 중앙값 대입
                centerValue = arr[i][k];

                //왼쪽 경계 아니라면 실행
                if(k != 0){
                    ckNum++;
                    if (centerValue > arr[i][k-1]) ckCnt++;
                }
                //오른쪽 경계 아니라면 실행
                if(k != arr[i].length-1 ){
                    ckNum++;
                    if (centerValue > arr[i][k+1]) ckCnt++;
                }
                // 상
                if(i != 0){ // 맨 위일 경우 윗줄 판별은 필요없다.
                    ckNum++;
                    if (centerValue > arr[i-1][k]) ckCnt++;
                }
                // 하
                if(i != arr.length-1) { // 맨 아래일 경우 아랫줄 판별은 필요없다.
                    ckNum++;
                    if (centerValue > arr[i+1][k]) ckCnt++;
                }
                // 비교
                if(ckCnt == ckNum){
                    answer += "*";
                    answer += (k == arr[i].length-1) ? "\n" : " ";
                } else {
                    answer += Integer.toString(centerValue);
                    answer += (k == arr[i].length-1) ? "\n" : " ";
                }

                // 초기화
                ckCnt=0;
                ckNum=0;
            }
        }
        System.out.println(answer);
    }

    public static void main(String[] args) {
        Test2 method = new Test2();
        int[][] arr1 = {{7,4,6,5,9}, {6,1,3,4,5}, {4,8,5,6,9}, {1,3,0,6,4}, {6,4,8,1,7}};

        method.solution(arr1);
    }
}

 

리뷰) 

+ 중앙 값을 먼저 가져와야 한다.

+ for문 안에 병렬 for문이 3개나 필요없다 한개로 끝난다. 

+ 검사하는 숫자 개수와 큰 수 일때의 경우의 개수 비교가 중요하다. 

+ 배열의 위치를 잘 인지하고 있어야 풀 수 있다. 

 

+ Recent posts