๐Ÿ“‚์ฝ”๋”ฉํ…Œ์ŠคํŠธ:CodingTest

ํ”Œ๋กœ์ด๋“œ ์›Œ์…œ ์•Œ๊ณ ๋ฆฌ์ฆ˜

mc.thd 2023. 12. 14. 16:18
  • ๋ชจ๋“  ๋…ธ๋“œ์—์„œ ๋‹ค๋ฅธ ๋ชจ๋“  ๋…ธ๋“œ๊นŒ์ง€์˜ ์ตœ๋‹จ๊ฒฝ๋กœ๋ฅผ ๋ชจ๋‘ ๊ณ„์‚ฐํ•จ
  • ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋‹จ๊ณ„๋ณ„๋กœ ๊ฑฐ์ณ ๊ฐ€๋Š” ๋…ธ๋“œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ˆ˜ํ–‰
    • ๋‹ค์ต์ŠคํŠธ๋ผ์™€ ๋‹ค๋ฅด๊ฒŒ ๋งค ๋‹จ๊ณ„๋งˆ๋‹ค ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ ์ค‘์— ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐ–๋Š” ๋…ธ๋“œ๋ฅผ ์ฐพ๋Š” ๊ณผ์ •์ด ํ•„์š”ํ•˜์ง€ ์•Š์Œ.
  • 2์ฐจ์› ํ…Œ์ด๋ธ”์— ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ์ •๋ณด๋ฅผ ์ €์žฅ
  • DP ์œ ํ˜•์— ์†ํ•จ (์ ํ™”์‹์— ๋งž๊ฒŒ 3์ค‘ FOR๋ฌธ์„ ์ด์šฉํ•ด์„œ 2์ฐจ์› ํ…Œ์ด๋ธ”์„ ๊ฐฑ์‹ )
  • ๋…ธ๋“œ์˜ ๊ณ„์ˆ˜๊ฐ€
  • ๋ฐ€์ง‘๊ทธ๋ž˜ํ”„(์™„์ „๊ทธ๋ž˜ํ”„์— ๊ฐ€๊นŒ์šด ๊ทธ๋ž˜ํ”„)์ธ ๊ฒฝ์šฐ ํ”Œ๋กœ์ด๋“œ ์›Œ์ƒฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ํšจ์œจ์ ์ด๋‹ค.
    • ๋ฐ€์ง‘๊ทธ๋ž˜ํ”„๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ ๋‹ค์ต์ŠคํŠธ๋ผ๋ฅผ n๋ฒˆ ๋Œ๋ฆฌ๋Š”๊ฒŒ ๋น ๋ฅด๋‹ค
  • O(n^3)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋กœ ๋‹ค์ต์ŠคํŠธ๋ผ(์ธ์ ‘ํ–‰๋ ฌ์„ ์‚ฌ์šฉํ•œ ๊ฒฝ์šฐ)์˜ ์‹œ๊ฐ„๋ณต์žก๋„์™€ ๋™์ผํ•˜๋‹ค
    • N์ด 100์ด๋ฉด → 100๋งŒ์ด์–ด์„œ ๊ฐ€๋Šฅ, 500์ด์–ด๋„ → 1์–ต 2์ฒœ 500๋งŒ ์ด์–ด์„œ tryํ•ด๋ณผ ์ˆ˜ ์žˆ๋‹ค.
    • ๊ทธ๋Ÿฌ๋‚˜ ํ”Œ๋กœ์ด๋“œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋งค์šฐ ๊ฐ„๋‹จํ•˜์—ฌ ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํšจ์œจ์ (์ฝ”๋”ฉ์ด ํšจ์œจ์ ์ด๋ผ๋Š” ๋œป, ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ ํšจ์œจ์ ์ด๋ผ๋Š” ๋œป์ด ์•„๋‹ˆ๋‹ค!)์ด๋‹ค
  • ์Œ์˜ ๊ฐ€์ค‘์น˜๋„ ๋œ๋‹ค
  • ๋…ธ๋“œ์˜ ๊ฐฏ์ˆ˜๊ฐ€ ์ ์€ ๊ฒฝ์šฐ (500๊ฐœ ์ดํ•˜) ์— ์‚ฌ์šฉํ•ด์•ผ ํ•จ

 

๐Ÿ’ก์Œ์ˆ˜ ์‚ฌ์ดํด ๊ฒ€์ถœ
์ž๊ธฐ ์ž์‹ ์—๊ฒŒ ๊ฐ€๋Š” ๊ฐ„์„  ๊ฑฐ๋ฆฌ ์ฆ‰ dist[i][i] < 0 ์ด๋ฉด ์Œ์ˆ˜ ์‚ฌ์ดํด์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ

์ ํ™”์‹

a์—์„œ b๋กœ ๊ฐ€๋Š” ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ณด๋‹ค a์—์„œ k๋ฅผ ๊ฑฐ์ณ b๋กœ ๊ฐ€๋Š” ๊ฑฐ๋ฆฌ๊ฐ€ ๋” ์งง์€์ง€ ๊ฒ€์‚ฌ

k์— ๋ชจ๋“  ๋…ธ๋“œ, ๋ชจ๋“  ๋…ธ๋“œ a to b → 3์ค‘ ๋ฐ˜๋ณต๋ฌธ์ด ๋œ๋‹ค

์ฝ”๋“œ

ํŒŒ์ด์ฌ

INF = int(1e9) # ๋ฌดํ•œ์„ ์˜๋ฏธํ•˜๋Š” ๊ฐ’์œผ๋กœ 10์–ต

n = int(input())
m = int(input())

graph = [[INF] * (n+1) for _ in range(n+1)]

for a in range(1, n+1):
	for b in range(1, n+1):
    	if a==b:
        	graph[a][b]=0
 
# ๊ฐ ๊ฐ„์„ ์— ๋Œ€ํ•œ ์ •๋ณด ์ž…๋ ฅ๋ฐ›์•„, ๊ทธ ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”
for _ in range(m):
	# A์—์„œ B๋กœ ๊ฐ€๋Š” ๋น„์šฉ์€ C
    a,b,c = map(int,input().split())
    graph[a][b] = c
 
 # ํ”Œ๋กœ์ด๋“œ์›Œ์…œ ์•Œ๊ณ ๋ฆฌ์ฆ˜
 for k in rangE(1,n+1):
 	for a in range(1,n+1):
    	for b in range(1,n+1):
        	graph[a][b] = min(graph[a][b], graph[a][k] + graph[k][b])
 
 # ์ˆ˜ํ–‰ ๊ฒฐ๊ณผ ์ถœ๋ ฅ
 for a in range(1, n+1):
 	for b in range(1, n+1):
    	if graph[a][b]==INF:
        	print("INFINITY", end=" ")
        else:
        	print(graph[a][b], end= " ")
    print()

 

์ž๋ฐ”

public class Main{
	
    public static final int INF = (int) 1e9; // ๋ฌดํ•œ์„ ์˜๋ฏธํ•˜๋Š” ๊ฐ’์œผ๋กœ 10์–ต
    public static int n,m; // n : ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜, m : ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜
    public static int[][] graph = new int[501][501]; // ๋…ธ๋“œ ๊ฐœ์ˆ˜์˜ ์ตœ๋Œ€๋Š” 500๊ฐœ๋ผ๊ณ  ๊ฐ€์ •
    

	public static void main(String[] args){
    	Scanner sc = new Scanner(System.in);
        
        n = sc.nextInt();
        m = sc.nextInt();
        
        // ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ํ…Œ์ด๋ธ”์„ ๋ชจ๋‘ ๋ฌดํ•œ์œผ๋กœ ์ดˆ๊ธฐํ™”
        for(int i=0;i<501;i++){
        	Arrays.fill(graph[i],INF);
        }
        
        for(int i=1;i<=n;i++){
        	for(int j=1;j<=n;j++){
            	if(i==j){
                	graph[i][j]=0;
                }
            }
        }
        
        // ๊ฐ ๊ฐ„์„ ์— ๋Œ€ํ•œ ์ •๋ณด ์ž…๋ ฅ
        for(int i=0;i<m;i++){
        	int a = sc.nextInt();
            int b = sc.nextInt();
            int c = sc.nextInt();
            
            graph[a][b]=c;
        }
        
        // ํ”Œ๋กœ์ด๋“œ ์›Œ์…œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ 
        for(int k=1;k<=n;k++){
        	for(int a=1;a<=n;a++){
            	for(int b=1;b<=n;b++){
                	graph[a][b] = Math.min(graph[a][b], graph[a][k] + graph[k][b]);
                }
            }
        }
        
        // ๊ฒฐ๊ณผ ์ถœ๋ ฅ
        for(int a=1; a<=n; a++){
        	for(int b=1;b<=n;b++){
            	if(graph[a][b]==INF){
                	System.out.print("INFINITY ");
                }else{
                	System.out.print(graph[a][b] + " ");
                }
            }
            System.out.println();
        }
        
    }

}