본문 바로가기
ALGORITHM/Implement

[JAVA] 백준 1592번

by sjs_2215 2019. 8. 17.

https://www.acmicpc.net/problem/1592

 

1592번: 영식이와 친구들

일단 1번이 공을 잡는다. 1번은 공을 한 번 잡았기 때문에, 공을 3번에게 던진다. 3번은 공을 한 번 잡았기 때문에, 공을 5번에게 던진다. 5번은 2번에게 던지고, 2번은 4번에게 던진다. 4번은 1번에게 던진다. 1번은 이제 공을 두 번 잡았기 때문에, 공을 4번에게 던진다. 4번은 2번에게 던지고, 2번은 5번에게 던지고, 5번은 3번에게 던지고, 마지막으로 3번은 1번에게 던진다. 1번은 이제 공을 세 번 잡았기 때문에, 게임은 끝난다.

www.acmicpc.net

영식이와 친구들 1592번

문제 재정의:

 

사람 n명,

한 사람이 공을 m번 받으면 종료된다,

m보다 적게 공을 받은 사람이 L번째 사람에게 시계방향으로 공을 준다.

짝수번이면 반시계 방향으로 L번째 사람에게 공을 준다.

공을 총 몇 번 던지는지 출력

 


 

생각한 것:

 

  • 1번 자리는 자동으로 공 받은 횟수=1
  • 배열로 하기로 함
    -> 사람수가 고정적이고 순회하는 문제이기에 순회 빠를 것 같아서
  • 본인이 공을 받은 횟수 알아둬야 함, 이게 홀/짝인지 알고 있어야 함
    -그래야 m번째 됐을때 멈출 수 있음
  • 시계방향 반시계 방향은 어떻게 순회?
    그냥 ++, --하고, 제일 오른쪽 값 가면 첫 번째로 돌아가게
  • 총 몇 번 공 던지는지 total값
  • 사람의 인덱스 번호 알아둬야 함
    -그래야 l번째 사람이 누군지 앎

 

코드

package till;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = null;

        st = new StringTokenizer(br.readLine()); //공백 기준으로 나눔

          int n = Integer.parseInt(st.nextToken()); //사람수
           int m = Integer.parseInt(st.nextToken()); //최대 던진 횟수
           int l = Integer.parseInt(st.nextToken()); //몇번째 사람

           int people[] = new int[n+1];//인덱스 1부터 유효

        //배열 1인덱스 빼고 0으로 초기화
           for(int i=0;i<people.length;i++){
               if(i==1){
                   people[1]=1; //1번 자리는 자동으로 공 받은 횟수=1
               }
               else
               people[i]=0;//다른 사람은 0으로 초기화
           }


      int result=0;
      int t=1;

      while(true){
          if(people[t]%2==0){//받은 횟수가 짝수일때 반시계방향

              if(check(people)==m){ //최대 던짓 횟수 도달하면 while문 종료
                  break;
              }
              else{
                  t=t-l;//반시계 방향이니 인덱스 마이너스
                  if(t<=0){ //인덱스 마이너스 되면 순회시키기 위해 n플러스 해줌
                      t=n+t;
                  }
                  people[t]=people[t]+1;                
                  result++;
              }
          }
          else if(people[t]%2==1){//받은 횟수가 홀수일때 시계방향

              if(check(people)==m){ //최대 던짓 횟수 도달하면 while문 종료
                  break;
              }
              else{
                  t=t+l;//시계 방향이니 인덱스 플러스
                  if(t>n){ //인덱스 n 넘으면 순회시키기 위해 n마이너스 해줌
                      t=t-n;
                  }
                  people[t]=people[t]+1;
                  result++;  
              }
          }        
      }
      System.out.println(result);
    }

    public static int check(int[] array){ //현재 배열의 제일 큰수가 뭔지
        int pivot=array[1];
        for(int i=2;i<array.length;i++){
            if(pivot<array[i]){
                pivot=array[i];
            }           
        }
        return pivot;
    }
}

 

 


 

깨달은 점:

 

최대 던짓 횟수 도달하면 while문 종료하는 if문을 앞으로? 빼서 도달 안 했을 때의 작업을 else문에 넣는 것.

처음엔 if문 - if문으로 했었어서 첨엔 답 틀리게 나옴.

정답율 60% 이상인 것-생각한 대로 코딩하면 바로 답 나오는 듯. 이상한 실수만 안 하면

'ALGORITHM > Implement' 카테고리의 다른 글

[JAVA] 백준 1789번  (0) 2019.09.01
[JAVA] 백준 10871번  (0) 2019.09.01
[JAVA] 백준 2455번  (0) 2019.08.25
[JAVA] 백준 1173번  (0) 2019.08.17
[JAVA] 프로그래머스 가장 큰 수  (0) 2019.07.15

Comments