JAVA/코드 과제

[JAVA] 스타트와 링크 (백준 14889번)

나는나는용 2023. 4. 1. 04:32
728x90

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

이 문제는 nCr을 실습하는 문제이다.

초기 코드는 보잘것 없다… 실행해봤자, 팀원 수와, 능력치 입력만 할 수 있는게 전부였다.

그래도 막, 뭐라도 해보겠다고, 이것저것 import하고, nCr 실제 계산식도 만들어보려고 팩토리얼메서드도 만들어보고 이것저것 난리였는데, 결국은 아무것도 안됐다. (아래는 일단 입력받는 부분만…)

그래 일단, 입력받는 부분은 너무 정상적으로 잘 구현하였다.

인원수와, 그에 맞는 능력치 입력까지는 좋았다.

하지만 팀을 어떻게 중복없이 반으로짜서 그에 대한 능력치 합을 구해야할지 몰랐다.

 

nCr에서도 왜 자기자신을 호출하는지는 알았다.

그러나 방문처리를 어떻게 하는지와, 팀 중복이 되지 않기 위해서는 어떻게 설정을 해줘야 하는지를 잘 몰랐었다.

일단은 돌아가야되지 않겠는가 하여 nCr의 기본 알고리즘 틀을 가져와보고, 디버깅을 통해 방문처리를 어떤 순서로 해주는지와, 능력치 합은 그에 따라서 어떻게 되는지를 구현해보았다.

실행되는 코드 (제출본)

그에 따른 실행 결과는 올바르게 나왔다.

컴공생의 과제답게 일단 돌아가니까, 일단은 잘 작동하니까 넘어가려 하였으나 앞으로 nCr과 nPr 문제는 많이 등장할테니, 어떻게 팀이 짜여지고 능력치 계산이 되는건지 디버깅을 통해 세세하게 봐봐야겠다.

 

디버깅을 할 때에는 static에 대한 값은 확인할 수 없으므로 번거롭겠지만 전부 로컬변수로 집어넣어줘야 한다.

아래 코드는 static 변수를 로컬 변수로 집어넣어주고 매개변수로 넘겨주고~~ 한 결과이다.

단순 각 인스턴스 값들의 변화를 보기 위해 로컬로 넣어준 것이기 때문에 실행은 되지 않는다.

왜냐하면 이전에 static을 썼을때에는 공용공간에 있는 Min의 값을 diff()메서드에서 접근하면서 계속 바꿔주었는데,

로컬로 빼주게 됨으로써 Min의 값은 diff()메서드 내에서만 변하기 때문이다.

 

diff()에서 변하게 된 Min의 값을 public void diff~~가 아닌 public int diff~~로 해준 뒤 return  int  모시깽이를 한다고 하더라도, 애초에 diff()를 불러오는 곳인 nCr()메서드도 void이다.

 

그렇다고해서 nCr을 void가 아닌 int로 해줄 수 있는것도 아니다.

nCr에서는 cnt==number/2인 상황에서만 return을 해주는데, 그 외의 상황에 대한 return이 지정되지 않았기 때문에 반환형을 void에서 int로 바꿀 수 없다.

 

혹시 조건을 만족하는 경우에만 반환해주는 메서드에 대한 처리방법이 있다면 위 코드를 디버깅용 코드가 아닌 실제 로컬변수만으로도 돌아가는 코드로 수정해보겠다.

아직 가방끈이 너무 짧다...ㅠ

 

디버깅하는 방법은 다른 게시물에서 조쿰 더 자세히 다루겠다.

 

728x90