35-java - 문자열 심화문제들2

jin·2022년 7월 30일
0

1. 도서연체

int[] today = { 2020, 12, 4 };

String rentalData = "";		
rentalData += "책번호/책제목/대여날짜/회원번호\n";
rentalData += "20122/연필로쓰기/2020-11-25/1001\n";
rentalData += "40143/외국어 공부의 감각/2020-11-27/1003\n";
rentalData += "54321/컴퓨터활용능력/2020-11-27/1041\n";
rentalData += "26543/아무튼,외국어/2020-12-01/1034";
System.out.println("=============================");
rentalData = rentalData.replace("\n", "/");
String[] token1 = rentalData.split("/");
String[][] rentalDataTemp = new String[token1.length/4-1][4];
int size = rentalDataTemp.length * rentalDataTemp[0].length;
		
int rowIndex = 0;
int colIndex = 0;
for (int i = 4; i < size+4; i++) {
	rentalDataTemp[rowIndex][colIndex] = token1[i];
	colIndex++;
	if (i % 4 == 3) {
		rowIndex++;
		colIndex = 0;
	}
}
for (int i = 0; i < rentalDataTemp.length; i++) {
	System.out.println(Arrays.toString(rentalDataTemp[i]));
}
System.out.println("=============================");
String userData = "";
userData += "회원번호/책번호/대여일수(day)\n";
userData += "1001/20122/10\n";
userData += "1003/40143/8\n";
userData += "1041/54321/5\n";
userData += "1034/26543/2";
userData = userData.replace("\n", "/");
String[] token2 = userData.split("/");
String[][] userDataTemp = new String[token2.length/3-1][3];
size = userDataTemp.length * userDataTemp[0].length;
rowIndex = 0;
colIndex = 0;
for (int i = 3; i < size+3; i++) {
	userDataTemp[rowIndex][colIndex] = token2[i];
	colIndex++;
	if (i % 3 == 2) {
		rowIndex++;
		colIndex = 0;
	}
}
for (int i = 0; i < rentalDataTemp.length; i++) {
	System.out.println(Arrays.toString(userDataTemp[i]));
}
//위 데이터는 도서관 책 대여 데이터이다.
// 오늘은 12월4일 이라고했을때 연체한 회원번호 출력
String[] over = new String[userDataTemp.length];
int todaySum = (today[0]-1) * 365
		+(today[0]-1)/4
		-(today[0]-1)/100
		+(today[0]-1)/400;
int monthList[] = {31,28,31,30,31,30,31,31,30,31,30,31};
for (int i = 0; i < today[1]-1; i++) {
	if (i==1) {
		if ((today[0] % 400 == 0) 
				|| (today[0] % 100 != 0 && today[0] % 4 == 0) ) {
			todaySum++;
		}
	}
	todaySum += monthList[i];
}
//		String[] token3 = rentalDataTemp[]
for (int i = 0; i < rentalDataTemp.length; i++) {
	String[] rentalToken = rentalDataTemp[i][2].split("-");
	int period = Integer.parseInt(userDataTemp[i][2]);
	int[] rentalDay = new int[rentalToken.length];
	for (int j = 0; j < rentalToken.length; j++) {
		rentalDay[j] = Integer.parseInt(rentalToken[j]);
	}
	int rentalSum = (rentalDay[0]-1) * 365
			+(rentalDay[0]-1)/4
			-(rentalDay[0]-1)/100
			+(rentalDay[0]-1)/400;
	for (int j = 0; j < rentalDay[1]-1; j++) {
		if (j==1) {
			if ((rentalDay[0] % 400 == 0) 
					|| (rentalDay[0] % 100 != 0 && rentalDay[0] % 4 == 0) ) {
				rentalSum++;
			}
		}
		rentalSum += monthList[j];
	}
	rentalSum += period;
	
	int result = rentalSum - todaySum;
	if (result > 0) {
		over[i] = rentalDataTemp[i][3];
	}
}
System.out.println("======================================");
System.out.print("연체 회원 : ");
for (int i = 0; i < over.length; i++) {
	if (over[i] != null) {
		System.out.print(over[i] + " ");
	}
}

어려웠다기보다는 머리가 아팠다. 쪼개고 더하고 곱하고 빼고 생각할 부분이 많았다.

2. 장바구니 검색

문제1) 회원별 아이템 구매목록 출력
예) 이만수==> 고래밥3,칸쵸1 / 김철민 ==> 고래밥1 / 이영희 ==> 고래밥1,새우깡2
문제2) 아이템별로 구입한 회원이름 출력
예) 고래밥==> 이만수,김철민,이영희 / 새우깡==> 이영희 / 칸쵸==> 이만수

String itemData = "1001/고래밥,1002/새우깡,1003/칸쵸";
String userData = "3001/이만수,3002/김철민,3003/이영희";

String cartData = "";
cartData += "3001/1001\n";
cartData += "3001/1001\n";
cartData += "3003/1002\n";
cartData += "3001/1001\n";
cartData += "3001/1003\n";
cartData += "3003/1002\n";
cartData += "3003/1001\n";
cartData += "3002/1001";

// 문제 풀기전 배열에 담아놓기
itemData = itemData.replace("/",",");
String[] token = itemData.split(",");
String[][] itemDataToken = new String[token.length/2][2];
int rowIndex = 0, colIndex = 0;
for (int i = 0; i < token.length; i++) {
	itemDataToken[rowIndex][colIndex] = token[i];
	colIndex++;
	if (i % 2 == 1) {
		rowIndex++;
		colIndex = 0;
	}
}
for (int i = 0; i < itemDataToken.length; i++) {
	System.out.println(Arrays.toString(itemDataToken[i]));
}
System.out.println();
rowIndex = 0;
colIndex = 0;
userData = userData.replace("/", ",");
token = userData.split(",");
String[][] userDataToken = new String[token.length/2][2];
for (int i = 0; i < token.length; i++) {
	userDataToken[rowIndex][colIndex] = token[i];
	colIndex++;
	if (i % 2 == 1) {
		rowIndex++;
		colIndex = 0;
	}
}
for (int i = 0; i < userDataToken.length; i++) {
	System.out.println(Arrays.toString(userDataToken[i]));
}
System.out.println();

cartData = cartData.replace("/", "\n");
token = cartData.split("\n");
rowIndex = 0; 
colIndex = 0;
String[][] cartDataToken = new String[token.length/2][2];
for (int i = 0; i < token.length; i++) {
	cartDataToken[rowIndex][colIndex] = token[i];
	colIndex++;
	if (i % 2 == 1) {
		rowIndex++;
		colIndex = 0;
	} 
}

for (int i = 0; i < cartDataToken.length; i++) {
	System.out.println(Arrays.toString(cartDataToken[i]));
}
//문제1) 회원별 아이템 구매목록 출력 
//예) 이만수==> 고래밥3,칸쵸1 / 김철민 ==> 고래밥1 / 이영희 ==> 고래밥1,새우깡2


for (int i = 0; i < userDataToken.length; i++) {
	String itemNum = itemDataToken[i][0];
	String memberNum = userDataToken[i][0];
	int[] buyCount = new int[itemDataToken.length];
	String[] buyItem = new String[itemDataToken.length];
	for (int j = 0 ; j < cartDataToken.length; j++) {
		if (cartDataToken[j][0].equals(memberNum)) {
			for (int k = 0; k < itemDataToken.length; k++) {
				if (itemDataToken[k][0].equals(cartDataToken[j][1])) {
					buyCount[k]++;
					buyItem[k] = itemDataToken[k][1];
				}
			}
		}
	}
	for (int j = 0; j < buyCount.length; j++) {
		if (buyCount[j] != 0) {
			System.out.printf("%s : ", userDataToken[i][1]);
			System.out.printf("%s : %d \n", buyItem[j], buyCount[j]);
		}
	}
}
System.out.println();
//문제2) 아이템별로 구입한 회원이름 출력 
//예) 고래밥==> 이만수,김철민,이영희 / 새우깡==> 이영희 / 칸쵸==> 이만수
for (int i = 0; i < itemDataToken.length; i++) {
	System.out.printf("%s ==> ", itemDataToken[i][1]);
	String[] names = new String[itemDataToken.length];
	for (int j = 0; j < userDataToken.length; j++) {
		for (int k = 0; k < cartDataToken.length; k++) {
			if (cartDataToken[k][0].equals(userDataToken[j][0])
					&& cartDataToken[k][1].equals(itemDataToken[i][0])) {
				names[j] = userDataToken[j][1]; 
			}
		}
		
	}
	for (int j = 0; j < names.length; j++) {
		if (names[j] != null) {
			System.out.printf("%s ", names[j]);
		}
	}
	System.out.println();
}

반복시킬 기준점은 잘잡았는데 정녕 값을 구하기 위해서 삼중for문밖에 없는지 고민하느라 시간을 쓴 문제
고민의 답은 현재로서는 없다

3. 장바구니 삭제

cart데이터는 현재 장바구니 상황이다.
input데이터는 삭제를 요청한데이터이다.

qwer은 아이디이고 3 은 삭제번호이다.
qwer 입장에서는 본인아이템은 3개밖에 없으니 칸쵸를 지우기위해 3을
선택했지만 실제 전체 데이터에서는 5번째 아이템이다.

마찬가지로 abcd 는 콜라와 사이다 를 구입했고 ,
콜라를 지우기위해 1번을 선택한것이고 실제로는3번아이템이 삭제되어야한다.

[ 정답 ] cart += "qwer/고래밥\n"; cart += "qwer/새우깡\n"; cart += "java/칸쵸\n"; cart
+= "java/고래밥\n"; cart += "abcd/사이다";

String item = "칸초/새우깡/고래밥/콜라/사이다";
String id = "qwer/abcd/java";


String cart = "";
cart += "qwer/고래밥\n";
cart += "qwer/새우깡\n";
cart += "abcd/콜라\n";
cart += "java/칸쵸\n";
cart += "qwer/칸쵸\n";
cart += "java/고래밥\n";
cart += "abcd/사이다";
String input[][] = {
		 {"qwer" , "3"}, 
		 {"abcd" , "1"}
};
String[] itemToken = item.split("/");
String[] idToken = id.split("/");

cart = cart.replace("\n", "/");
String[] token = cart.split("/");
int rowIndex = 0, colIndex = 0;
String[][] cartToken = new String[token.length/2][2];
for (int i = 0; i < token.length; i++) {
	cartToken[rowIndex][colIndex] = token[i];
	colIndex++;
	if (i % 2 == 1) {
		colIndex = 0;
		rowIndex++;
	}
}

int qwerCount = Integer.parseInt(input[0][1]);
int abcdCount = Integer.parseInt(input[1][1]);
int count1 = 0;
int count2 = 0;
cart = "";
for (int i = 0; i < cartToken.length; i++) {
	if (cartToken[i][0].equals(input[0][0])) {
		count1++;
	}
	if (cartToken[i][0].equals(input[1][0])) {
		count2++;
	}
	if (qwerCount == count1 || abcdCount == count2) {
		if (qwerCount == count1) {
			count1++;
			continue;
		} else {
			count2++;
			continue;
		}
	} 
	cart += cartToken[i][1]+"/";
	cart += cartToken[i][0]+"\n";
	
	
}
 System.out.println(cart);

위의 코드는 내가 작성한 답안이다. 구분자 기준으로 나눈 후 이차원배열에 넣고 해당 값이 나올때마다 카운트를 세줘 건너뛰려는 카운트에 도달하면 건너 뛰는 식으로 작성했다.

아래의 코드는 선생님이 답안 예시로 올려주신 코드인데 훨씬 간단하게 해결됐다. 지금까지 문자열 문제를 풀며, 문자열에서 구분자를 replace로 바꾼 후 행,열 인덱스를 따로 주는 방식에 갇혀 있었는데 아래 방법을 보고 그 후부터는 아래의 방식이 효율적이다 판단되어 주로 사용하게 됐다.

String item = "칸초/새우깡/고래밥/콜라/사이다";
String id = "qwer/abcd/java";

String cart = "";
cart += "qwer/고래밥\n";
cart += "qwer/새우깡\n";
cart += "abcd/콜라\n";
cart += "java/칸쵸\n";
cart += "qwer/칸쵸\n";
cart += "java/고래밥\n";
cart += "abcd/사이다";
String cartList[] = cart.split("\n");
System.out.println(Arrays.toString(cartList));
String input[][] = { 
		{ "qwer", "3" }, 
		{ "abcd", "1" } 
	};

for (int i = 0; i < input.length; i++) {
	int count = 0;
	int delete = Integer.parseInt(input[i][1]);
	for (int j = 0; j < cartList.length; j++) {
		String token[] = cartList[j].split("/");
		if (token[0].equals(input[i][0])) {
			count += 1;
			if (count == delete) {
				cartList[j] = "";
			}
		}
	}
	
	System.out.println("===정답===");
	cart = "";
	for (int ii = 0; ii < cartList.length; ii++) {
		if (cartList[ii] == "") {
			continue;
		}
		cart += cartList[ii] + "\n";
	}
	cart = cart.substring(0, cart.length() - 1);
	System.out.println(cart);
}

4. 학생관리

Scanner sc = new Scanner(System.in);
int max = 100;
String[][] dataList = new String[max][5];
 // 번호 , 아이디 , 비밀번호  , 이름 , 점수 
String sample[][] = { 
		{ "1001", "qwer", "1234", "김철수", "10" }, 
		{ "1002", "asdf", "2345", "이영희", "30" }, 
	};

// 이차원 배열을 이용해서 crud 구현
int size = 0;
for (int i = 0; i < sample.length; i++) {
	for (int j = 0; j < sample[i].length; j++) {
		dataList[i][j] = sample[i][j];
	}
	size += 1;
}

int num = 1003;
while (true) {
	System.out.println(" [0]종료 [1]가입 [2]탈퇴 [3]수정 [4]검색 [5] 전체출력");
	boolean check = false;
	int index = -1;
	int select = sc.nextInt();
	if (select == 0) {
		break;
	} else if (select == 1) {
		System.out.print("아이디 입력 : ");
		String id = sc.next();
		for (int i = 0; i < size; i++) {
			if (id.equals(dataList[i][1])) {
				System.out.println("이미 있는 아이디\n");
				check = true;
				break;
			}
		}
		if (check == true) { continue; }
		dataList[size][0] = num+"";
		dataList[size][1] = id;
		System.out.print("비밀번호 입력 : ");
		String pwd = sc.next();
		dataList[size][2] = pwd;
		System.out.print("이름 입력 : ");
		String name = sc.next();
		dataList[size][3] = name;
		System.out.print("점수 입력");
		int score = sc.nextInt();
		dataList[size][4] = score+"";
		System.out.println("가입 완료\n");
		num++;
		size++;
	} else if (select == 2) {
		System.out.print("삭제 아이디 입력 : ");
		String id = sc.next();
		for (int i = 0; i < size; i++) {
			if (dataList[i][1].equals(id)) {
				index = i;
				break;
			}
		}
		if (index == -1) {
			System.out.println("해당 아이디 없음\n");
			continue;
		}
		
		for (int i = index; i < size; i++) {
			dataList[i] = dataList[i+1];
		}
		System.out.println("삭제완료\n");
		size--;
		
	} else if (select == 3) {
		System.out.print("수정 아이디 입력 : ");
		String id = sc.next();
		for (int i = 0; i < size; i++) {
			if (dataList[i][1].equals(id)) {
				index = i;
				break;
			}
		}
		if (index == -1) {
			System.out.println("해당 아이디 없음\n");
			continue;
		}
		System.out.print("수정 비밀번호 입력 :");
		String pwd = sc.next();
		dataList[index][2] = pwd;
		System.out.print("이름 입력 : ");
		String name = sc.next();
		dataList[index][3] = name;
		System.out.print("점수 입력");
		int score = sc.nextInt();
		dataList[index][4] = score+"";
		System.out.println("수정 완료\n");
	} else if (select == 4) {
		System.out.print("검색 아이디 입력 : ");
		String id = sc.next();
		for (int i = 0; i < size; i++) {
			if (id.equals(dataList[i][1])) {
				System.out.printf("%s, %s, %s, %s, %s\n\n" 
						,dataList[i][0] ,dataList[i][1] ,dataList[i][2] ,dataList[i][3] ,dataList[i][4]);
				check = true;
				break;
			}
			
		}
		if (check == false) {
			System.out.println("해당 아이디 없음\n");
		}
	}else if (select == 5) {
		for (int i = 0; i < size; i++) {
			for (int j = 0; j < dataList[i].length; j++) {
				System.out.print(dataList[i][j]+ " ");
			}
			System.out.println();
		}
	} 
		
}

sc.close();

앞서 푼 문제들에서도 CRUD 관련된 문제들을 다 풀고 넘어가 큰 어려움 없이 풀 수 있었다.

5. 사원관리

//[부서정보]
//[부서번호,부서명,지역]
String[][] departmentData = { 
		{ "10", "ACCOUNTING", "NEW YORK" }, 
		{ "20", "RESEARCH", "DALLAS" },
		{ "30", "SALES", "CHICAGO" }, 
		{ "40", "OPERATIONS", "BOSTON" }, 
	};
// [사원정보]
// [번호,이름,직책,상사번호,입사일,급여,커미션,부서번호]
String[][] employeeData = { 
		{ "7369", "SMITH", "CLERK", "7902", "17-12-1980", "800", "0", "20" },
		{ "7499", "ALLEN", "SALESMAN", "7698", "20-2-1981", "1600", "300", "30" },
		{ "7521", "WARD", "SALESMAN", "7698", "22-2-1981", "1250", "500", "30" },
		{ "7566", "JONES", "MANAGER", "7839", "2-4-1981", "2975", "0", "20" },
		{ "7654", "MARTIN", "SALESMAN", "7698", "28-9-1981", "1250", "1400", "30" },
		{ "7698", "BLAKE", "MANAGER", "7839", "1-5-1981", "2850", "0", "30" },
		{ "7782", "CLARK", "MANAGER", "7839", "9-6-1981", "2450", "0", "10" },
		{ "7788", "SCOTT", "ANALYST", "7566", "13-7-1987", "3000", "0", "20" },
		{ "7839", "KING", "PRESIDENT", "NULL", "17-11-1981", "5000", "0", "10" },
		{ "7844", "TURNER", "SALESMAN", "7698", "8-9-1981", "1500", "0", "30" },
		{ "7876", "ADAMS", "CLERK", "7788", "13-7-1987", "1100", "0", "20" },
		{ "7900", "JAMES", "CLERK", "7698", "3-12-1981", "950", "0", "30" },
		{ "7902", "FORD", "ANALYST", "7566", "3-12-1981", "3000", "0", "20" },
		{ "7934", "MILLER", "CLERK", "7782", "23-1-1982", "1300", "0", "10" }
		};	

// [월급 등급]
// [등급 , 급여MIN , 급여MAX]
int salaryGradeData[][] = { 
		{ 1, 700, 1200 }, // 1등급이고 급여 700~1200 사이
		{ 2, 1201, 1400 }, 
		{ 3, 1401, 2000 }, 
		{ 4, 2001, 3000 },
		{ 5, 3001, 9999 } };

// 문제) # "DALLAS"에서 근무하는 사원의 이름,직급,부서번호,부서명을 조회하시오.	
String departMentNumber = "";		
for(int i = 0; i < departmentData.length; i++) {
	if(departmentData[i][2].equals("DALLAS")) {
		departMentNumber = departmentData[i][0];
	}
}
System.out.println(departMentNumber);	
for(int i = 0; i  < employeeData.length; i++) {
	if(departMentNumber.equals(employeeData[i][7])) {
		System.out.println(Arrays.toString(employeeData[i]));
	}
}

// 문제) # ALLEN과 같은 부서에 근무하는 사원의 이름, 부서번호를 조회하시오.
String depNum = "";
for(int i=0; i<employeeData.length; i++) {
	if(employeeData[i][1].equals("ALLEN")) {
		depNum = employeeData[i][7];
	}
}

for(int i=0; i<employeeData.length; i++) {
	if(depNum.equals(employeeData[i][7])) {
		System.out.println(employeeData[i][1] + " : " + employeeData[i][7]);
	}
}			
		
//	# 부서별 최대 급여와 최소 급여를 구하시오.
int[] sum = new int[departmentData.length];
int[] count = new int[departmentData.length];

for(int i = 0; i < departmentData.length; i++) {
	String department = departmentData[i][0];
	for (int j = 0; j < employeeData.length; j++) {
		if (department.equals(employeeData [j][7])) {
			sum[i] += Integer.parseInt(employeeData[j][5]);
			count[i]++;
		}
	}
}
System.out.println(Arrays.toString(sum));
System.out.println(Arrays.toString(count));
// 최대최소만 구하기 --> rank? min&max?
int[] rank = new int[sum.length];
for (int i = 0; i < sum.length; i++) {
	for (int j = 0; j < sum.length; j++) {
		if (sum[i] < sum[j]) {
			rank[i]++;
		}
	}
}
for (int i = 0; i < rank.length; i++) {
	if (rank[i] == 0) {
		System.out.println("최대급여 부서 : " + departmentData[i][1]);
		System.out.println("최대급여 : " + sum[i]);
	} else if (rank[i] == 3) {
		System.out.println("최소급여 부서 : " + departmentData[i][1]);
		System.out.println("최소급여 : " + sum[i]);
	}
}
System.out.println("=====================================");		
//#부서별로 급여 평균 (단, 부서별 급여 평균이 2000 이상만)
double[] avg = new double[sum.length];
for (int i = 0; i < avg.length; i++) {
	avg[i] = sum[i]/(count[i]+0.0);
	if (avg[i] >= 2000) {
		System.out.printf("%s 부서 평균 급여 %.1f\n",departmentData[i][1], avg[i]);
	}
}
//		System.out.println(Arrays.toString(sum));
//		System.out.println(Arrays.toString(count));
//		System.out.println(Arrays.toString(avg));

//#부서번호가 30번인 사원들의 이름, 직급, 부서번호, 부서위치를 조회하시오.	
for (int i = 0; i < employeeData.length; i++) {
	if (employeeData[i][7].equals("30")) {
		System.out.printf("이름: %s 직급: %s 부서번호: %s "
				,employeeData[i][1],employeeData[i][2],employeeData[i][7]);
		for (int j = 0; j < departmentData.length; j++) {
			if (employeeData[i][7].equals(departmentData[j][0])) {
				System.out.println("부서위치 :" + departmentData[j][2]);
				break;
			}
		}
	}
}
//	#DALLAS에서 근무하는 사원의 이름,직급,부서번호,부서명을 조회하시오.
String search = "DALLAS";
String result = "";
int index = -1;
for (int i = 0; i < departmentData.length; i++) {
	if (departmentData[i][2].equals(search)) {
		result = departmentData[i][0];
		index = i;
		break;
	}
}
System.out.println("====================================");
System.out.println(search+" 지역 근무 직원 명단");
for (int i = 0; i < employeeData.length; i++) {
	if(employeeData[i][7].equals(result)) {
		System.out.printf("이름: %s, 직급: %s, 부서번호: %s, 부서명: %s \n",
				employeeData[i][1], employeeData[i][2], employeeData[i][3]
				,departmentData[index][1]);
	
	}
}
System.out.println("====================================");	
search = "";
//# 이름에 A 가 들어가는 사원의 이름,부서명을 조회하시오.
System.out.println("이름에 A 가 들어가는 사원 목록");
for (int i = 0; i < employeeData.length; i++) {
	String name = employeeData[i][1];
	int find = name.indexOf("A");
	if (find != -1) {
		System.out.printf("이름: %s, ", employeeData[i][1]);
		search = employeeData[i][7];
		for (int j = 0; j < departmentData.length; j++) {
			if (search.equals(departmentData[j][0])) {
				System.out.println("부서명: "+departmentData[j][1]);
				break;
			}
		}
	} 
}
System.out.println("====================================");	
//# 사원명 'JONES'가 속한 부서명을 조회하시오.
for (int i = 0; i < employeeData.length; i++) {
	String name = "JONES";
	if (employeeData[i][1].equals(name)) {
		String find = employeeData[i][7];
		for (int j = 0 ; j < departmentData.length; j++) {
			if (find.equals(departmentData[j][0])) {
				System.out.printf("%s 가 속한 부서명 : %s",name, departmentData[j][1]);
			}
		}
	}
}
System.out.println("\n====================================");
System.out.println(Arrays.toString(count));
//# 10번 부서에서 근무하는 사원의 이름과 10번 부서의 부서명을 조회하시오.
System.out.println("10번 부서에 근무하는 사원 목록");
for (int i = 0; i < employeeData.length; i++) {
	String find = "10";
	if (find.equals(employeeData[i][7])) {
		System.out.printf("이름: %s, ",employeeData[i][1]);
		for (int j = 0; j < departmentData.length; j++) {
			if (employeeData[i][7].equals(departmentData[j][0])) {
				System.out.println("부서명: " + departmentData[j][1]);
				break;
			}
		}
		
	}
}

java로 select를 할 줄은 꿈에도 몰랐다. 예제 보자마자 익숙한 친구들이 나와서 깜짝 놀랐다. 이 문제가 final 문제인데 프로젝트 문제들 난이도가 좀 더 높았지 않았나 싶다.

0개의 댓글