항해 같은 팀인 지성님이 주신 문제

  • 임의의 정수값을 받아 길이 45의 배열에 1부터 45까지의 숫자가 채워지며 순서대로 정렬되면 출력되고 멈추는 함수를 만들어주세요.

[제한사항]

  • 이미 값이 채워진 인덱스에는 또 다시 같은 값을 채우지 않는다. 

[입출력 예]

[1,2,3,4,5,6,7,8,9,10,11,12, .... 44,45]

 

 


추측) 

배열 개수가 정해져있고 들어가야하는 숫자 또한 1부터 45까지의 나열이기 때문에 인덱스가 0부터 시작임을 생각해 임의의 정수값에 -1을 적용해 인덱스를 잡고 값을 집어넣는다. 집어넣기 전에 해당 자리가 int배열의 디폴트 값인 0이 아니면 값은 집어 넣지 않으면 될 거 같다. 

 

소스코드) 

import java.util.*;

public class chap01 {
    public static void main(String[] args) {

        int[] flag_arr = new int[45];
        while(true) {
            int randomNum = (int) (Math.random() * 45 + 1);
            if (flag_arr[randomNum - 1] != randomNum) {
                flag_arr[randomNum - 1] = randomNum;
            }

            int cnt = 0;
            for (int one : flag_arr) {
                if (one == 0) {
                    cnt++;
                }
            }

            if (cnt == 0) {
                break;
            }
        }
        System.out.println(Arrays.toString(flag_arr));
    }
}

 

리뷰) 

일단 생각한대로 코드 작성함에 있어서 루프문을 멈추는 부분에 대해서도 필요함을 깨달았다. 알고리즘을 막 시작해서 그런가 아직 문제를 풀면서 고려해야할 점을 많이 놓치고 있다는 생각이 든다. 만들기 전에 구체적으로 생각할 수 있는 연습이 필요하다는 생각이 들었다.

또한 무한 루프문 안에 또 for문이 너무 많이 돌아가는 게 아닌가 하는 생각이 든다. 이걸 줄일 수 있는 방법이 없을까?  

 

flag에 관련된 거라고 하셨는데 공부하려니 키워드를 뭐로 검색해야할지 모르겠다. 

보통 flag하면 boolean 값으로 토글처럼 사용하는 방식만 나오는데 ㅠ

+ Recent posts