[SWEA] D2 - 21425 번 | +=

EllievVΒ·2024λ…„ 11μ›” 13일

🐊 CodingTest

λͺ©λ‘ 보기
7/18

πŸ” 문제 보러 κ°€κΈ°

μ£Όμ–΄μ§„ μ •μˆ˜ A, B, N에 λŒ€ν•΄, λ³€μˆ˜ x와 yκ°€ 각각 A와 B둜 μ΄ˆκΈ°ν™”λœ μƒνƒœμ—μ„œ x += y λ˜λŠ” y += x 연산을 반볡적으둜 μˆ˜ν–‰ν•˜μ—¬, xλ‚˜ y 쀑 ν•˜λ‚˜μ˜ 값이 N을 μ΄ˆκ³Όν•  λ•ŒκΉŒμ§€ μ΅œμ†Œ λͺ‡ 번의 연산이 ν•„μš”ν•œμ§€ κ³„μ‚°ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±

문제 상세 μ„€λͺ…

C, C++, Python, JavaΒ λ“±μ˜ μ–Έμ–΄μ—λŠ”Β +=Β μ—°μ‚°μžκ°€ μžˆλ‹€.Β μ •μˆ˜ν˜• λ³€μˆ˜Β x, yκ°€ μžˆμ„ λ•ŒΒ β€œx += y”λ₯Ό ν•˜λ©΄Β x에 μ €μž₯된 값이 (기쑴에 x에 μ €μž₯λ˜μ–΄ 있던 κ°’) + (기쑴에 y에 μ €μž₯λ˜μ–΄ 있던 κ°’)으둜 바뀐닀.

ν˜„μž¬Β x에 μ €μž₯된 값은 A, y에 μ €μž₯된 값은 B이닀.Β λ‹Ήμ‹ μ€Β β€œx += yβ€Β λ˜λŠ”Β β€œy += x” 연산을 μ›ν•˜λŠ” μˆœμ„œλŒ€λ‘œ μ›ν•˜λŠ” 만큼 μˆ˜ν–‰ν•˜μ—¬, xλ‚˜Β yΒ λ‘˜ 쀑 ν•˜λ‚˜ 이상에 μ €μž₯된 값이 NΒ μ΄ˆκ³Όκ°€ 되게 ν•˜λ €κ³  ν•œλ‹€. 연산을 ν•©μ³μ„œ μ΅œμ†Œ λͺ‡ 번 μˆ˜ν–‰ν•΄μ•Ό ν•˜λŠ”μ§€ κ³„μ‚°ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜λΌ.

μž…λ ₯

첫 번째 쀄에 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ˜ 수 Tκ°€ μ£Όμ–΄μ§„λ‹€.

각 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λŠ” ν•œ 개의 μ€„λ‘œ 이루어진닀. 각 μ€„μ—λŠ” μ„Έ 개의 μ •μˆ˜

이 곡백 ν•˜λ‚˜μ”©μ„ μ‚¬μ΄λ‘œ 두고 μ£Όμ–΄μ§„λ‹€.

ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ˜ κ°œμˆ˜λŠ”Β 600,000개 μ΄μƒμœΌλ‘œ μƒλ‹Ήνžˆ λ§ŽμŒμ— μœ μ˜ν•˜λΌ.

좜λ ₯

각 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λ§ˆλ‹€,Β ν•œ 쀄에 ν•˜λ‚˜μ”©Β xλ‚˜Β yΒ λ‘˜ 쀑 ν•˜λ‚˜ 이상에 μ €μž₯된 값이 NΒ μ΄ˆκ³Όκ°€ 되게 ν•˜κΈ° μœ„ν•΄Β β€œx += y”, β€œy += x” 연산을 μ΅œμ†Œ λͺ‡ 번 μˆ˜ν–‰ν•΄μ•Ό ν•˜λŠ”μ§€ 좜λ ₯ν•œλ‹€.

μž…λ ₯좜λ ₯
5
1 2 2
1 2 3
1 2 4
1 2 5
10 7 1293
1
2
2
3
11

λ‚΄ μ½”λ“œ

package D2;

// SWEA D2 21425번 "+=" 문제 풀이 

import java.util.*;

public class N21425 {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		
		int T = scan.nextInt();
		
		Sol sol = new Sol();
		
		for (int i = 0; i < T; i++) {
			int A = scan.nextInt();
			int B = scan.nextInt();
			int N = scan.nextInt();
			
			System.out.println(sol.solution(A, B, N));
		}
		
	}
}

class Sol {
		
	public int solution(int A, int B, int N) {
		
		int cnt = 0;
		
		while (true) {
			if (A >= B) {
				B = A + B;
				cnt++;
				if (B > N) {
					return cnt;
				}
				
			}else if(A < B) {
				A = A + B;
				cnt++;
				if (A > N) {
					return cnt;
				}
			}
		}		
	}
}

μ ‘κ·Ό 방법

A와 B μ€‘μ—μ„œ λ”ν•΄μ§€λŠ” 값을 μ„ νƒν• λ•Œ 더 큰 κ°’μœΌλ‘œ 선택해 더해야 += 연산을 μ΅œμ†Œλ‘œ μˆ˜ν–‰ν•΄ N의 값을 μ΄ˆκ³Όμ‹œν‚¬μˆ˜ μžˆμ„ 것이라고 μƒκ°ν–ˆλ‹€.

  1. A와 Bμ€‘μ—μ„œ 큰 값을 선택해 ν˜„μž¬μ˜ 총합에 λ”ν•œλ‹€.
  2. λ”ν•˜λŠ” 횟수λ₯Ό μ €μž₯ν•œλ‹€.
  3. 총합이 N보닀 크닀면 횟수λ₯Ό λ¦¬ν„΄ν•œλ‹€.

κ°œμ„  μ½”λ“œ

package D2;

//SWEA D2 21425번 "+=" 문제 풀이 κ°œμ„   

import java.util.*;

public class N21425_b {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		
		int T = scan.nextInt();
		
		StringBuilder result = new StringBuilder();
		
		for(int i = 0; i < T; i++) {
			int A = scan.nextInt();
			int B = scan.nextInt();
			int N = scan.nextInt();
			
			result.append(solution(A, B, N)).append("\n");
		}
		
		System.out.print(result);
		scan.close();
	}
	
	public static int solution(int A, int B, int N) {
		int cnt = 0;
		
		while(Math.max(A, B) <= N) {
			if (A < B) {
				A += B;
			}else {
				B += A;
			}
			cnt++;
		}
		return cnt;
	}
}

Point

  1. StringBuilder μ‚¬μš©

    κ²°κ³Όλ₯Ό StringBuilder에 λˆ„μ ν•΄ System.out.print둜 ν•œλ²ˆμ— 좜λ ₯ν•œλ‹€.
    μ΄λŠ” ν…ŒμŠ€νŠΈμΌ€μ΄μŠ€κ°€ λ§Žμ„ λ•Œ μž…μΆœλ ₯ 속도λ₯Ό κ°œμ„ ν•΄μ€€λ‹€.

  2. Math.max μ‚¬μš©

    이전 μ½”λ“œλŠ” while(true) μ½”λ“œλ‘œ 반볡문 내뢀에 쑰건문을 λ„£μ–΄μ„œ 반볡 μ§„ν–‰ μ—¬λΆ€λ₯Ό κ²°μ •ν–ˆμ—ˆλŠ”λ° λ§€ λ°˜λ³΅μ‹œμ— Math.maxλ₯Ό μ‚¬μš©ν•΄ A와 B 쀑 더 큰 값이 N을 λ„˜λŠ”μ§€ ν™•μΈν•œλ‹€.
    이둜써, 반볡문 λ‚΄λΆ€ 쑰건문이 κ°„κ²°ν•΄μ‘Œκ³ , λΆˆν•„μš”ν•œ else if μ ˆμ„ μ œκ±°ν•  수 μžˆλ‹€.

  3. μŠ€μΊλ„ˆ μžμ› ν•΄μ œ
    scan.closeλ₯Ό 톡해 μŠ€μΊλ„ˆ 객체λ₯Ό λ‹«μ•„μ€€λ‹€.

  4. λ©”λͺ¨λ¦¬ μ‚¬μš© μ΅œμ ν™”
    맀번 μƒˆλ‘œμš΄ 객체λ₯Ό μƒμ„±ν•˜μ§€ μ•Šκ³  solution λ©”μ„œλ“œλ₯Ό static으둜 μ„ μ–Έν•΄ μ‚¬μš©ν•΄ λ©”λͺ¨λ¦¬ 관리λ₯Ό 더 μ‰½κ²Œ ν•œλ‹€.

profile
🌱

0개의 λŒ“κΈ€