코딩테스트 1. 단어장 만들기

도람·2025년 11월 2일

📖코딩 테스트

목록 보기
6/6
post-thumbnail

문제 단어장만들기

<주요 문제 정리>
1. N개의 단어가 있다.
2. 단어를 단어길이만큼 오름차순으로 정렬한다.
3. 단어의 길이가 같으면 단어를 사전순으로 정렬한다.
4. K번째 단어를 출력한다. (결과)

코딩 흐름

  1. N과 K를 공백을 통해 입력받는다.
  2. N개만큼 단어를 입력받는다.
  3. 단어 길이가 다르면 오름차순으로 정렬한다, 단어 길이가 똑같으면 사전순으로 정렬한다.
  4. k번째 단어를 출력한다.

코딩1 (실패)

//1. 단어 길이 정렬 
//2. 단어의 길이가 같은 단어를 사전순으로 정렬
//3. 사전의 앞에서 k번째 위치한 단어 출력하는 기능 설계
// 1. 리스트 stirng 타입 정의.
// 2. 단어장에 있는 수 n개와 단어의 위치K를 공백을 두고 입력받고
// 3. n개만큼 리스트가 돌아감


class Main {
public static void main(String[] args) throws Exception {
	
	Scanner sc = new Scanner(System.in);
	int N = sc.nextInt();
	int K = sc.nextInt();

	//System.out.println("N= " + N + " K= " + K);
	List<String> list = new ArrayList<>(N);

	for(int i =0; i <= N; i++){
		String word = sc.nextLine();
		list.add(word);
		}
	// for(int i=0; i < N ; i++){
	// 	System.out.println(i +"번째" + "word는: " + list.get(i));
	// 	}

        // 정렬: 1) 길이 오름차순  2) 길이 같으면 사전순
        list.sort((a, b) -> {
            if (a.length() != b.length()) {
                return a.length() - b.length(); // 글자수 기준 오름차순
            } else { //길이가 같을 경우
                return a.compareTo(b); // 사전순 정렬
            }
        });

	       //  for (String word : list) {
        //     System.out.println(word);
        // }
	System.out.println(list.get(K));
	}
}

처음엔 이렇게 제출을 했는데 테스트코드 15번째에서 막혔다.
타임아웃 오류가 걸렸다.
아마 문제 이 문제 중 조건

1 <= N <= 1000
1 <= K <= N에서 뭔가 생각하지 못한게 걸린듯 했다.
그래서 여기서부터는 챗지피티의 도움을 얻었다.


챗지피티가 말한 문제점


그리고나서 챗지피티한테 보완점에 대해 물어봤는데

처음에 변수 선언할 때

int N = sc.nextInt();
int K = sc.nextInt();
 sc.nextLine(); // ← 개행문자 제거 (매우 중요!)

이렇게 sc.nextLine()해야하는 이유는 이해가 안 갔다.


이것을 통해 N 과K 를 입력받고
for문에서 (int i; i < N; i++)
했을 때 N-1개만 입력받던 이유에 대해 이해할 수 있었다.


코딩2 - 보완

for (int i = 0; i < N; i++) { // <= 말고 < 로
            String word = sc.nextLine().trim();
            list.add(word);
        }

으로 .trim()을 넣어 빈 문자열이 들어가지 않도록 처리했다.

또한 처음에

int N = sc.nextInt();
        int K = sc.nextInt();
        sc.nextLine(); // ← 개행문자 제거 (매우 중요!)

하여 개행문자를 제거하도록 처리했다.

코딩2 - 보완 풀코드(실패)

class Main {
public static void main(String[] args) throws Exception {
	
	Scanner sc = new Scanner(System.in);
	int N = sc.nextInt();
	int K = sc.nextInt();
	sc.nextLine();

	//System.out.println("N= " + N + " K= " + K);
	List<String> list = new ArrayList<>(N);

	for(int i =0; i < N; i++){
		String word = sc.nextLine().trim();;
		list.add(word);
		}
	// for(int i=0; i < N ; i++){
	// 	System.out.println(i +"번째" + "word는: " + list.get(i));
	// 	}

        // 정렬: 1) 길이 오름차순  2) 길이 같으면 사전순
        list.sort((a, b) -> {
            if (a.length() != b.length()) {
                return a.length() - b.length(); // 글자수 기준 오름차순
            } else { //길이가 같을 경우
                return a.compareTo(b); // 사전순 정렬
            }
        });

	         //for (String word : list) {
           //  System.out.println(word);
         //}
	System.out.println(list.get(K-1));
	}
}

코딩3 - 보완

아무래도 system.out.println 말고 구름에서 처음 제공했던

 	public static void main(String[] args) throws Exception {
 		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
 		String input = br.readLine();
 		System.out.println("Hello Goorm! Your input is " + input);
 	}

를 이용해서 해야하는듯 했다.

이를통해 코드를 보완했다.

코딩3 - 보완 풀코드 (정답)

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

        // 첫 줄 입력 (N과 K)
        String[] firstLine = br.readLine().split(" ");
        int N = Integer.parseInt(firstLine[0]);
        int K = Integer.parseInt(firstLine[1]);

        // 단어 리스트 생성
        List<String> list = new ArrayList<>(N);

        // 단어 N개 입력받기
        for (int i = 0; i < N; i++) {
            list.add(br.readLine().trim());
        }

        // 정렬: 1) 길이 오름차순, 2) 길이 같으면 사전순
        list.sort((a, b) -> {
            if (a.length() != b.length()) {
                return a.length() - b.length();
            } else {
                return a.compareTo(b);
            }
        });

        // K번째 단어 출력 (인덱스는 0부터 시작하므로 K-1)
        System.out.println(list.get(K - 1));
    }
}

느낀 점

평소에는 C언어로 코딩테스트를 준비했지만,
Java로 문제를 풀어보니 문법이 많이 헷갈렸고,
시간 초과를 방지하기 위한 입력·출력 최적화와 관련된 공부가 더 필요하다고 느꼈다.

이 문제는 구름에서 출제된 것으로, 저작권은 구름에 있습니다.
아래 내용은 개인적인 풀이이며, 정답과 다를 수 있습니다.

profile
정도를 걷는 엔지니어

0개의 댓글