인프런 커뮤니티 질문&답변

kokoku님의 프로필 이미지
kokoku

작성한 질문수

자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비

12. 멘토링

12번 멘토링 질문입니다!

작성

·

292

·

수정됨

0

안녕하세요, 12번 멘토링 문제 풀다가 첫 번째 채점 결과 값이 3으로 잘 나왔습니다. 그런데 그 다음 입력부터는 전부 오답이 나오는 상황인데, 어떤 부분에서 틀린 건지 알려주시면 감사하겠습니다 ㅠㅠ

 

// package = " ";

import java.io.*;
import java.util.*;

class Main
{
	public int Solution(int n, int m, int arr[][]){
		
		String mathMark = "";

		ArrayList<Integer> ans = new ArrayList<>();
		HashMap<String, Integer> countMap = new HashMap<>();

		for(int i = 0; i < n; i++){ // 첫째부터 계속 다음 줄 내려가서 검사
			for(int j = 0; j < m; j++){ // 
				for(int k = 0; k < m; k++){
					// System.out.println("j값 : "+j+", "+"k값 : "+k);
					if(j != k && j < k){
						// System.out.println(arr[i][j]+", "+arr[i][k]);
						if(i == n-1 && j == m-1 && k == m-1){
							mathMark += arr[i][j]+""+arr[i][k];
						}
						else{
							mathMark += arr[i][j]+""+arr[i][k]+" ";
						}
						
					}
				}
			}
		}
		
		/* m개 값을 가지고 있는 수 찾기 */
		String numArray[] = mathMark.split(" ");

		// 숫자 등장 횟수 카운트
		for(int i = 0; i < numArray.length; i++){
			countMap.put(numArray[i],countMap.getOrDefault(numArray[i],0) + 1);
		}
		
		// 등장 횟수가 3 이상인 숫자 Count
		
		for(Map.Entry<String, Integer> entry : countMap.entrySet()){
			System.out.println(entry.getKey()+" "+entry.getValue());
			if(entry.getValue() == n){
				ans.add(1);
			}
		}

		return ans.size();
	}

	public static void main(String[] args) throws Exception{
		Main m = new Main();
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		String[] numStr = br.readLine().split(" "); // 1. N과 M 입력받기
		int column = Integer.parseInt(numStr[0]);
		int raw = Integer.parseInt(numStr[1]);
		int arr[][] = new int[raw][column];

		for(int i = 0; i < raw; i++){
			String[] test = br.readLine().split(" ");
			for(int j = 0; j < column; j++){
				arr[i][j] = Integer.parseInt(test[j]);
			}
		}

		System.out.println(m.Solution(raw, column, arr));
		
		br.close();
	}
}

답변 1

0

안녕하세요, 인프런 AI 인턴입니다.

제공해주신 코드를 살펴본 결과, 몇 가지 주목할 점이 있습니다.

  1. int column = Integer.parseInt(numStr[0]);int raw = Integer.parseInt(numStr[1]);에서 columnraw의 명명이 혼동될 수 있습니다. 일반적으로 행과 열을 의미하는 변수명으로 nm을 사용하는데, 여기서는 n을 열(column)의 수, m을 행(row)의 수로 사용하고 있습니다. int arr[][] = new int[raw][column];에서 배열을 선언할 때 행과 열의 순서를 혼동하신 것 같습니다.

  2. 조합을 만드는 로직에서 if(j != k && j < k) 조건을 사용하고 있습니다. 이 조건은 정상적으로 중복 없이 두 번째와 세 번째 인덱스가 조합될 수 있도록 합니다. 하지만 문제 해결의 핵심은 조합의 결과가 아니라, 이러한 조합들이 각 테스트 케이스마다 어떻게 반복되는지, 그리고 그 반복 횟수를 기준으로 정답을 도출하는 것입니다.

  3. mathMark += arr[i][j]+""+arr[i][k]+" ";에서 조합된 문자열을 하나의 문자열로 누적하고 있습니다. 이후 String numArray[] = mathMark.split(" ");으로 분리하여 각 조합의 등장 횟수를 세고 있습니다. if(entry.getValue() == n){ 조건에서 등장 횟수가 n과 같은 경우만 카운트하고 있습니다. ‘n’이 아닌 ’m’(행의 개수)과 비교해야 정상적으로 동작할 것입니다.

  4. 문제 해결의 핵심은 특정 조건을 만족하는 조합의 개수를 찾는 것인데, 주어진 코드는 조합을 만들고 이후 해당 조합의 등장 횟수를 통해 문제를 해결하려고 하고 있습니다. 주어진 문제에서 요구하는 조건에 맞게 로직을 다시 한 번 검토해보세요.

  5. 마지막으로, 입력 받는 부분에서 int raw = Integer.parseInt(numStr[1]); int arr[][] = new int[raw][column];처럼 배열을 선언하는 부분에서의 행과 열의 개념이 혼동되는 부분을 수정하세요. int n = Integer.parseInt(numStr[0]); int m = Integer.parseInt(numStr[1]); 그리고 int arr[][] = new int[n][m];와 같이 수정하는 것이 좋겠습니다.

이 포인트들을 고려하여 코드를 다시 한 번 확인해 보시기 바랍니다.

kokoku님의 프로필 이미지
kokoku

작성한 질문수

질문하기