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

xogh7532님의 프로필 이미지
xogh7532

작성한 질문수

코딩테스트 실전 모의고사(with C++) : 대기업 대비

3. 전투게임 코드설명(해쉬, 효율성)

전투게임

작성

·

97

0

- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.

자바로 작성했는데, 시간 초과가 납니다.
어느 부분이 잘 못 작성한건지 궁금합니다.

 

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

class Node implements Comparable<Node>{
	int idx;
	char team;
	int power;
	Node(int idx, char team, int power){
		this.idx = idx;
		this.team =team;
		this.power = power;
	}
	@Override
	public int compareTo(Node o) {
		return this.power - o.power;
	}
}
public class Main {
	public static void main(String[] argvs) {
		Scanner sc = new Scanner(System.in);
		
		int n=sc.nextInt();
		
		int[] answer = new int[n+1];
		
		ArrayList<Node> list = new ArrayList<>();
		for(int i=1; i<=n; i++) {
			char a = sc.next().charAt(0);
			int b=sc.nextInt();
			list.add(new Node(i,a,b));
		}
		Collections.sort(list); //정렬
		
		HashMap<Character, Integer> map = new HashMap<>();
		int j=0,total=0;
		
		for(int i=1; i<n; i++) {
			for(;j<n; j++) {
				if(list.get(j).power<list.get(i).power) {
					total+=list.get(j).power; //쫓아오는 학생의 파워를 누적합
					char x =list.get(j).team; //쫓아오는 학생의 팀을 표시
					map.put(x, map.getOrDefault(x, 0)+list.get(j).power); //해싱해준다.
				}
				else break;
			}
			answer[list.get(i).idx] = total - map.getOrDefault(list.get(i).team, 0); //전체 누적합에서 자신의 팀이 있다면 그 점수는 빼준다.
		}
		
		for(int i=1; i<=n; i++)
			System.out.println(answer[i]);
	}
}

 

답변 1

0

안녕하세요, 인프런 AI 인턴입니다. xogh7532님의 질문과 관련하여, 자바로 작성된 코드에서 시간 초과 문제가 발생하고 있는 상황을 해결하기 위한 유사한 질문을 찾았습니다.

질문자님이 겪고 계신 시간 초과 문제는 대부분 정렬이나 자료 구조의 선택, 그리고 알고리즘 효율성과 관련이 있습니다. 제가 찾은 정보에 따르면, 시간 초과 문제는 보통 더 효율적인 자료 구조 사용이나 알고리즘 로직을 개선함으로써 해결될 수 있습니다.

유사한 질문

  • “자바런타임에러” 에서 질문자는 자바로 로직을 작성했지만 런타임 에러가 발생하였습니다. 이 경우에는 특정 메서드의 구현 방식 변경을 통해 문제가 해결되었습니다.

물론, 런타임 에러와 시간 초과는 서로 다른 유형의 문제입니다만, 두 경우 모두 알고리즘의 구현 방법이나 사용된 자료구조의 성능이 원인이 될 수 있습니다. 본질적으로 알고리즘의 효율성을 개선하거나, 더 효율적인 자료 구조를 사용해야 하는 필요성을 공유합니다.

이에, xogh7532님께서 작성하신 코드의 경우, 정렬 및 반복문 실행 과정에서 시간 복잡도가 높아져 시간 초과 문제가 발생할 가능성이 있습니다. 특히, 정렬과 이후의 for-loop에서 많은 연산이 이루어지는 것을 개선하기 위한 방법을 고려해보시기 바랍니다.

예를 들어, 불필요한 반복 연산을 줄이거나, 특정 조건에서 루프를 조기 종료할 수 있는 로직을 추가하는 등의 방법을 시도해 보는 것이 좋습니다. 또한, 특정 자료 구조에 대한 접근 효율성을 높일 수 있는 자료 구조(예를 들어, TreeMap이나 PriorityQueue 등)를 사용하는 것도 고려해 보실 수 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

xogh7532님의 프로필 이미지
xogh7532

작성한 질문수

질문하기