본문 바로가기
Java (국비)/Java 이론

Flag 알고리즘

by Hwanii_ 2023. 5. 6.
728x90

컴퓨터에서 무언가를 기억하거나 또는 다른 프로그램에게 약속된 신호를 남기기 위한 용도로 프로그램에 사용되는 미리 정의된 비트.

 

즉, 특정 동작을 수행할지 말지 결정하는 변수를 플래그 라고 부른다. (보통 1비트)

 

깃발을 올린다 와 내린다 두가지 상태로만 신호를 줄 수 있는 것을 떠올려 보자.

 

게임에서 사망 플래그 떴다 라는 표현을 사용할 때의 플래그.

 

사망 플래그

 

boolean flag = false; 로 초기값을 두고 사용 한다.

boolean 타입은 초기값이 false 로 알고 있다. (아니면 수정 하겠음,,)

 

그런데 선언만 해주니까 값이 없다고 오류가 뜨는듯 하다.

 

? ? ?

 

초기화를 false로 해줘야 할듯 하다.

 

(23.05.20 추가)

 

사용 하는 이유 :

 

~~가 있는지 없는지,

~~가 되었는지 안되었는지,

~~가 T인지 F인지 판단하는 상황일 때,

무언가 오랜시간 진행이 되고 판단해야 할 때,

=> flag 알고리즘을 활용 한다.

 

예시)

정수를 1개 입력 했는데,

내가 입력한 정수와 내가 가진 모든 번호를 비교해보려 한다.

그러면, 모든 번호를 다 확인하면서 (오랜시간 진행하며) 번호가 동일한지 아닌지를

판단해야 하니,

이럴때 flag 알고리즘을 활용 한다.

만약에, 모든 번호를 다 확인했는데, 번호가 동일해 ? 그러면 true로 켜주고,

그렇지 않을경우는 기존의 초기값 false를 유지한다.

-------------------------------------------------------------------------------------------------------------------------------------------

 

아래의 예제문을 통해 정리 하겠다.

 

 

위와 같이, 랜덤으로 받을 배열의 값들이 중복이 되지 않아야 한다.

만약 중복이 되면, 어 중복이 됬네? 하고 값을 저장하지 않고 위의 과정을 반복하는 그런 그림을 그려야 한다.

 

 

위의 코드를 자세히 살펴보자.

 

while문을 돌리기 위해 int i = 0;

while문 안에 for문을 돌리기 위해 int j = 0;

이다.

 

for문을 풀이하면

 

1)

data[0] 에 랜덤 값을 하나 저장.

flag는 false 상태이고,

j가 0부터 시작해서, 0 < 0 이면 조건식이 참이 아니므로 1번째 for문은 끝나버린다.

if(flag == true) { continue; } 는

만약 플래그가 T이면 if문 밑으로 가지 말고 루프를 돌기 위해 올라간다.

지금은 for문이 작동 자체를 하지 않았고, 따라서 flag가 F 이기 때문에

else 부분의 명령어가 실행 된다.

i++;

 

2)

data[1] 에 랜덤 값을 하나 저장.

flag는 false 상태이고,

i가 1이 증가 했으므로, j = 0;  이고 0 < 1 이므로 조건식이 참이라 2번째 바퀴 for문이 실행 된다.

 

만약 data[0] 이랑 data[1] 이랑 같아?

만약에 같다면  플래그가 T가 되어 i = 1 상태로 다시 반복을 하게 된다.

즉, data[1]에 랜덤값을 또 저장 하게 되고,

 

또 비교 한다.

 

만약 data[0] 이랑 data[1] 이랑 같아?

만약에 다르다면, 플래그가 T가 되지 않아, 아래의 if문이 실행되지 않고

i++;

 

3)

data[2] 에 랜덤 값을 하나 저장.

flag는 false 상태이고,

j = 0; 0 < 2 조건이 만족되어 3번째 바퀴  for문이 실행 된다.

 

만약 data[0]이랑 data[2] 이랑 같아?

만약에 같으면, flag가 true 가 되어 버린다.

여기서 true가 되었다는 말은 data 배열 0번째의 값이 data 배열 2번째 값과 같다는 의미인데

굳이 data 배열 1번째의 값을 비교할 필요도 없이 다시 반복해야 하지만,

for문의 조건이 0 < 2 인 상황이므로,

data 배열 1번째의 값과 data 배열 2번째의 값도 비교를 하게 된다.

 

추가 ++

for(int j = 0; j < i; j++) { // arr[0]의 값은 랜덤 저장되고 비교할 필요가 없으므로 for문을 패스.

       if(arr[j] == arr[i]) {

           flag = true;

           break;

break; 를 쓰면서 for문을 부셔버릴 수 있다.

 

어찌됬던지간에 for문이 끝나려면,

data[0]과 data[1] 모두가 data[2]와 값이 달라야 flag가 false 상태를 유지하면서

else 문의 명령어가 실행 된다.

i++;

 

4)

이제는 i가 3이 되었다. while문의 조건에 따라 끝나거나,

5)

6)

도 가능하게 될텐데,

 

앞에 코드 분석과 동일한 패턴이므로 생략.

 

출력문

 

 

겹치는 수가 없음을 보여준다.

 

 

 

 

 

 

 

반응형

'Java (국비) > Java 이론' 카테고리의 다른 글

Java  (0) 2023.05.11
객체지향언어 (Object Oriented Language) 특징  (2) 2023.05.10
함수 간단 정리  (0) 2023.05.09
최대값, 최소값 알고리즘  (0) 2023.05.06
두 변수의 값 바꾸기  (0) 2023.05.06