혼자서 코딩연습하는 것도 의미가 있지만, 여럿이서 하는 것도 문제에 대한 접근 방식을 폭넓힐 수 있을 것 같아서 스터디에 참여하게 되었다.
기초적인 문제들도 버벅대는 나인지라...
잘 할 수 있을까...가 제일 걱정이었다. 그래도 혼자서 낑낑대면서 하는 것 보단 좀 덜 답답(?)할 것 같아서
어쨌든 한번 해보자고~! 하면서 시작했다.
뭐 맨처음엔 그냥 쌍으로 이뤄서 의견 나눠서 코딩하는건 줄 알았는데
한명이 코드 작성을 드라이브 하고 한명이 그 코드를 작성하면서 하는 방식이었다.
우리는 처음 스터디 시작한거라 페어로 한게 아니라 그냥 단체로 했다...
한명씩 돌아가면서 네비게이터를 하고, 스터디장님께서 드라이브를 하셨다.
그 다음에는 스터디장님께서 네비게이터를 하고 돌아가면서 코드를 작성하는 방식으로 했다.
그 때까진 이 베타 테스트가 예정 30분이었던 스터디시간을 훌쩍 넘어...
2시간 30분동안 모두를 헤매게 할지 몰랐다...
살려줘.........
그렇게 처음으로 내가 네비게이터를 하면서 진행됐다.
다같이 머리를 싸매고 결국 해결한 방법은 두가지!
HashMap과 이차원배열이었다..
근데 결국 나만 못풀었다. 워낙 늦은시간(11시)이기도 했고 너무 졸렸고.....하루종일 코딩만 붙잡고 있으니 머리가 잘 안굴러갔따 ㅋㅋㅋㅋ변명아님 ㅠ 암튼 아래는 해시맵 접근 방법에 대해서 한번 리뷰해보려고 한다.
import java.util.*;
package main.java;
import java.util.*;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int member;
int team;
// 입력받고 조건에 맞지 않으면 다시 입력받기
do {
System.out.print("참가인원 수를 입력해 주세요.(0 이상의 정수): ");
member = scanner.nextInt();
System.out.print("팀의 갯수를 입력해 주세요.(0 이상의 정수, 참가인원이 나누어 떨어지는 수): ");
team = scanner.nextInt();
if (member == 0 || team == 0 || member % team != 0) {
System.out.println("0을 입력하셨거나, 나누어 떨어지지 않는 수를 입력하셨습니다");
}
} while (member == 0 || team == 0 || member % team != 0);
while(team % member !=){
System.out.println("0을 입력하셨거나, 나누어 떨어지지 않는 수를 입력하셨습니다"")
System.out.print("참가인원 수를 입력해 주세요.(0 이상의 정수): ");
member = scanner.nextInt();
System.out.print("팀의 갯수를 입력해 주세요.(0 이상의 정수, 참가인원이 나누어 떨어지는 수): ");
team = scanner.nextInt();}
뭐이런식으로 생각을 했다. 아직 내가 초심자라 그런가 ㅋㅋㅋ내가 짠 게 더 예뻐보인다....(줄 정리의 위력)
암튼 이렇게 뭐 도입부는 어떻게 했다. 그런데 그 이후부터가 우리를 구렁텅이로 밀어넣었음.ㅋㅋㅋ
그래서 우리는 해시맵으로 접근을 했다.
HashMap<Integer, String> memberList = new HashMap<>();
String memberName;
for (int i = 0; i < member; i++) {
memberName = scanner.next();
for (int j = 0; j < team; j++) {
memberList.put(j, memberName);
}
}
System.out.print(memberList);
이렇게 해서 해시맵으로 짝을 지어서 출력하려고 했다.
그래서 해시맵 변수도 만들고 돌렸으나....
member의 변수만큼 (각 이름 입력) + 팀의 갯수만큼 j가 돌아가는데
이렇게 하면 j가 만약 2였다고 치면, [0, 1, 2] 이렇게 돌아가면서
memberName에는 마지막정보가 계속 덮어 씌워지게 되는 것이었다.
뭐 예를들면 1번팀에 [김철수, 김영희]가 있다면 i첫번째에서 김철수가 입력됐으니
1번팀에도 김철수..
2번팀에도 김철수...
3번팀에도 김철수...... 이렇게 되면서 계속 덮어써진다고 해야하나?
이거때문에 결국 2시간 반 걸린거다.ㅋㅋㅋ
약간 여기서 해결해야 한다는? 그런 생각에 씌여서 뭔가 다른 방식으로 해결할 생각을 못한 것 같다.
참 이런부분 내가 느낀점은 가능성에 대해서 곰곰히 생각해보아야 한다는 것 .
내가 처음 생각한 아이디어가 틀리다? 그럼 그걸 과감히 버리고 갈 필요도 있는 것이다.
수정해서 좋은거 얻을 가능성을 생각하는 것도 중요하지만..
내가 이 틀에 나의 생각, 방향이 갇혀있는 것이 아닌지를 고민해봐야겠다는 생각이 들었다.
결국 코딩도 창의적 행위가 아닐까 ㅋㅋㅋ 발상? 생각의 폭이 중요하다는 것을 새삼 깨달음...
아무튼 이부분은 먼저 member의 갯수만큼의 길이의 배열을 만들고 팀이름을 붙이는 방식으로 하고 ==> 랜덤으로 만들기 위해 팀번호를 뒤섞는다...==>이후 랜덤으로 섞인 팀 번호에 순서대로 참가자를 입력해서 출력 (사실 내가 한건 아니라서 했다고 하긴 뭐하지만...)
코드로 보면
// 랜덤한 팀 설정을 위하여, 입력받은 참가인원 수 길이의 배열 생성후 각각 팀번호 입력
ArrayList<Integer> nums = new ArrayList<>();
for (int i = 1; i <= team; i++) {
for (int j = 0; j < member / team; j++) {
nums.add(i);
}
}
(지금 이거 쓰면서 이해함 .......)
// 팀 번호 셔플
Collections.shuffle(nums);
// 셔플한 팀번호 배열에 순서대로 참가자 입력받아서 입력
HashMap<String, Integer> memberList = new HashMap<>();
for (int i = 0; i < nums.size(); i++) {
System.out.print((i + 1) + " 번째 참가자의 이름을 입력해 주세요: ");
String memberName = scanner.next();
memberList.put(memberName, nums.get(i));
}
그다음에 이거 함 섞어주고(랜덤으로 하려고)
memberList(해시맵) 선언 후..
1번째 참가자부터니까 i+1부터 입력부분을 포문 돌린다.
그리고 나서 입력한 내용을 nums배열의 i번째 인덱스로 넣는다.
(이 nums배열은 랜덤을 돌렸으니 팀이 랜덤으로 되는 것과 같은 효과인 것이다....)
// 해시맵에 value 기준으로 정렬해서 프린트 찍어보기
System.out.println();
List<Map.Entry<String, Integer>> entries = memberList.entrySet().stream()
.sorted(Map.Entry.comparingByValue())
.collect(Collectors.toList());
for (Map.Entry<String, Integer> entry : entries) {
System.out.printf("%s 님은 %d 번팀 %n", entry.getKey(), entry.getValue());
}
}
}
출력 짜잔...근데 이 출력 부분은 내가 모르는게 많아서 좀 더 공부해야할 것 같음....entry는 뭔데? stream은 또 뭐야,,,,저 맨아래 포문은 "향상된 포문" 이란 것인가...?
암튼 오늘 과제 하고 시간되면 쉐도우 코딩 한번 해야겠다...나는 어제 이걸 수행하지 못했기 때문에,,,, 이렇게도 해보고 어제 이차원 배열로 하신 분도 계신데 그렇게도 한번 해봐야겠다..
잘했어요