https://www.acmicpc.net/problem/24263

(μ•Œκ³ λ¦¬μ¦˜ μˆ˜μ—… λ¬Έμ œλŠ” μ‹œκ°„ λ³΅μž‘λ„κ°€ 무엇인지 ν™•μΈν•˜κ³  풀어보기)

 

문제

 

μ˜€λŠ˜λ„ μ„œμ€€μ΄λŠ” μ•Œκ³ λ¦¬μ¦˜μ˜ μˆ˜ν–‰μ‹œκ°„ μˆ˜μ—… 쑰ꡐλ₯Ό ν•˜κ³  μžˆλ‹€. μ•„λΉ κ°€ μˆ˜μ—…ν•œ λ‚΄μš©μ„ 학생듀이 잘 μ΄ν•΄ν–ˆλŠ”μ§€ 문제λ₯Ό ν†΅ν•΄μ„œ ν™•μΈν•΄λ³΄μž.

μž…λ ₯의 크기 n이 주어지면 MenOfPassion μ•Œκ³ λ¦¬μ¦˜ μˆ˜ν–‰ μ‹œκ°„μ„ 예제 좜λ ₯κ³Ό 같은 λ°©μ‹μœΌλ‘œ 좜λ ₯ν•΄λ³΄μž.

MenOfPassion μ•Œκ³ λ¦¬μ¦˜μ€ λ‹€μŒκ³Ό κ°™λ‹€.

MenOfPassion(A[], n) {
    sum <- 0;
    for i <- 1 to n - 1
        for j <- i + 1 to n
            sum <- sum + A[i] × A[j]; # μ½”λ“œ1
    return sum;
}

 

μž…λ ₯

첫째 쀄에 μž…λ ₯의 크기 n(1 ≤ n ≤ 500,000)이 주어진닀.

 

좜λ ₯

첫째 쀄에 μ½”λ“œ1 의 μˆ˜ν–‰ 횟수λ₯Ό 좜λ ₯ν•œλ‹€.

λ‘˜μ§Έ 쀄에 μ½”λ“œ1의 μˆ˜ν–‰ 횟수λ₯Ό λ‹€ν•­μ‹μœΌλ‘œ λ‚˜νƒ€λ‚΄μ—ˆμ„ λ•Œ, μ΅œκ³ μ°¨ν•­μ˜ 차수λ₯Ό 좜λ ₯ν•œλ‹€. 단, λ‹€ν•­μ‹μœΌλ‘œ λ‚˜νƒ€λ‚Ό 수 μ—†κ±°λ‚˜ μ΅œκ³ μ°¨ν•­μ˜ μ°¨μˆ˜κ°€ 3보닀 크면 4λ₯Ό 좜λ ₯ν•œλ‹€.

 

예제 μž…λ ₯1 예제 좜λ ₯1
7 7
1

 

μ½”λ“œ1 이 21회 μˆ˜ν–‰λ˜κ³  μ•Œκ³ λ¦¬μ¦˜μ˜ μˆ˜ν–‰ μ‹œκ°„μ΄ n²μ— λΉ„λ‘€ν•œλ‹€.

 

μ†ŒμŠ€ μ½”λ“œ
# 문제 μ‹œκ°ν™”
n = int(input())
sum = 0
count = 0

for i in range(1,n):
    for j in range(i+1,n+1):
        sum += (i * j)    # μ½”λ“œ 1
        count += 1
        print("{:^4}+({}*{})={:^4} ({:^2}번 μˆ˜ν–‰)\t".format(sum-(i*j),i,j,sum,count), end="   ")
    print()
# μ •λ‹΅ μ½”λ“œ
n = int(input())

print(int(n*(n-1)/2))
print(2)

 

풀이

문제 μ‹œκ°ν™”

  • 첫 번째 for문은 총 n번 μˆ˜ν–‰
  • 두 번째 for문은 n-i번 μˆ˜ν–‰
    • i=1인 경우, n-1번 μˆ˜ν–‰
    • i=2인 경우, n-2번 μˆ˜ν–‰
  • μˆ˜ν–‰ 횟수 곡식을 첫 번째 쀄에 좜λ ₯
    • 첫 번째 for문이 μˆ˜ν–‰λœ 횟수 nκ³Ό 두 번째 for문이 μˆ˜ν–‰λœ 횟수 n-iλ₯Ό κ³±ν•œ κ°’ (쀑볡을 μ œκ±°ν•˜κΈ° μœ„ν•΄ 2둜 λ‚˜λˆ„κΈ°)
  • μœ„μ˜ κ³΅μ‹μ—μ„œ μ΅œκ³ μ°¨ν•­μ˜ 차수인 2λ₯Ό 두 번째 쀄에 좜λ ₯
    • μ‹œκ°„ λ³΅μž‘λ„(=μ½”λ“œ1의 μˆ˜ν–‰νšŸμˆ˜)λŠ” n*(n-1)/2μ΄λ―€λ‘œ μ΅œκ³ μ°¨ν•­μ˜ μ°¨μˆ˜λŠ” 2

 

이전 ν¬μŠ€νŒ…κ³Ό λ§ˆμ°¬κ°€μ§€λ‘œ μ‹œκ°„ λ³΅μž‘λ„μ— λŒ€ν•΄ μ•Œλ©΄ μ‰½κ²Œ ν’€ 수 μžˆλŠ” λ¬Έμ œμ˜€λ‹€. μ΅μˆ™ν•œ μ–Έμ–΄λ‘œ for문이 총 λͺ‡ 번 μˆ˜ν–‰λ˜λŠ”μ§€λ₯Ό μ‹œκ°ν™”ν•΄λ³΄λ©΄ 쒋을 것 κ°™λ‹€.

https://www.acmicpc.net/problem/24263

(μ•Œκ³ λ¦¬μ¦˜ μˆ˜μ—… λ¬Έμ œλŠ” μ‹œκ°„ λ³΅μž‘λ„κ°€ 무엇인지 ν™•μΈν•˜κ³  풀어보기)

 

문제

 

μ˜€λŠ˜λ„ μ„œμ€€μ΄λŠ” μ•Œκ³ λ¦¬μ¦˜μ˜ μˆ˜ν–‰μ‹œκ°„ μˆ˜μ—… 쑰ꡐλ₯Ό ν•˜κ³  μžˆλ‹€. μ•„λΉ κ°€ μˆ˜μ—…ν•œ λ‚΄μš©μ„ 학생듀이 잘 μ΄ν•΄ν–ˆλŠ”μ§€ 문제λ₯Ό ν†΅ν•΄μ„œ ν™•μΈν•΄λ³΄μž.

μž…λ ₯의 크기 n이 주어지면 MenOfPassion μ•Œκ³ λ¦¬μ¦˜ μˆ˜ν–‰ μ‹œκ°„μ„ 예제 좜λ ₯κ³Ό 같은 λ°©μ‹μœΌλ‘œ 좜λ ₯ν•΄λ³΄μž.

MenOfPassion μ•Œκ³ λ¦¬μ¦˜μ€ λ‹€μŒκ³Ό κ°™λ‹€.

MenOfPassion(A[], n) {
    sum <- 0;
    for i <- 1 to n
        sum <- sum + A[i]; # μ½”λ“œ1
    return sum;
}

 

μž…λ ₯

첫째 쀄에 μž…λ ₯의 크기 n(1 ≤ n ≤ 500,000)이 주어진닀.

 

좜λ ₯

첫째 쀄에 μ½”λ“œ1 의 μˆ˜ν–‰ 횟수λ₯Ό 좜λ ₯ν•œλ‹€.

λ‘˜μ§Έ 쀄에 μ½”λ“œ1의 μˆ˜ν–‰ 횟수λ₯Ό λ‹€ν•­μ‹μœΌλ‘œ λ‚˜νƒ€λ‚΄μ—ˆμ„ λ•Œ, μ΅œκ³ μ°¨ν•­μ˜ 차수λ₯Ό 좜λ ₯ν•œλ‹€. 단, λ‹€ν•­μ‹μœΌλ‘œ λ‚˜νƒ€λ‚Ό 수 μ—†κ±°λ‚˜ μ΅œκ³ μ°¨ν•­μ˜ μ°¨μˆ˜κ°€ 3보닀 크면 4λ₯Ό 좜λ ₯ν•œλ‹€.

 

예제 μž…λ ₯1 예제 좜λ ₯1
7 7
1

 

→ μ½”λ“œ 1이 7회 μˆ˜ν–‰λ˜κ³  μˆ˜ν–‰ μ‹œκ°„μ΄ n에 λΉ„λ‘€ν•œλ‹€.

 

μ†ŒμŠ€ μ½”λ“œ
# 문제 μ‹œκ°ν™”
n = int(input())
sum = 0

for i in range(1,n+1):
    sum += i    # μ½”λ“œ 1
    print(sum-i, "+", i, "=", sum, "\t", i,"번 μˆ˜ν–‰")
# μ •λ‹΅ μ½”λ“œ
n = int(input())

print(n)
print(1)

 

풀이

문제 μ‹œκ°ν™”

  • λ¬Έμ œμ—μ„œ μ½”λ“œ1은 총 n번 μˆ˜ν–‰
  • μž…λ ₯의 크기 n을 첫 번째 쀄에 좜λ ₯
  • μ΅œκ³ μ°¨ν•­μ˜ 차수인 1을 두 번째 쀄에 좜λ ₯
    • μ‹œκ°„ λ³΅μž‘λ„(=μ½”λ“œ1의 μˆ˜ν–‰νšŸμˆ˜)λŠ” nμ΄λ―€λ‘œ μ΅œκ³ μ°¨ν•­μ˜ μ°¨μˆ˜λŠ” 1

 

μ‹œκ°„λ³΅μž‘λ„κ°€ 뭔지 λͺ°λžμ„ λ•ŒλŠ” 문제 이해가 μ•„μ˜ˆ μ•ˆλλŠ”λ° κ°œλ…μ„ μ•Œκ³  λ‚˜μ„œ ν‘Έλ‹ˆκΉŒ μ‰½κ²Œ ν’€ 수 μžˆμ—ˆλ‹€. 일단 문제의 λ‚΄μš©μ„ μ‹œκ°ν™”ν•΄μ„œ μ½”λ“œκ°€ 총 λͺ‡ 번 μˆ˜ν–‰λ˜λŠ”μ§€ μ•Œλ©΄ μ‰½κ²Œ ν’€ 수 μžˆλ‹€!!!

https://www.acmicpc.net/problem/2745

 

문제

 

B진법 수 N이 주어진닀. 이 수λ₯Ό 10μ§„λ²•μœΌλ‘œ λ°”κΏ” 좜λ ₯ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

10진법을 λ„˜μ–΄κ°€λŠ” 진법은 숫자둜 ν‘œμ‹œν•  수 μ—†λŠ” μžλ¦¬κ°€ μžˆλ‹€. 이런 κ²½μš°μ—λŠ” λ‹€μŒκ³Ό 같이 μ•ŒνŒŒλ²³ λŒ€λ¬Έμžλ₯Ό μ‚¬μš©ν•œλ‹€.

A: 10, B: 11, ..., F: 15, ..., Y: 34, Z: 35

 

μž…λ ₯

첫째 쀄에 Nκ³Ό Bκ°€ 주어진닀. (2 ≤ B ≤ 36)

B진법 수 N을 10μ§„λ²•μœΌλ‘œ λ°”κΎΈλ©΄, 항상 10얡보닀 μž‘κ±°λ‚˜ κ°™λ‹€.

 

좜λ ₯

첫째 쀄에 B진법 수 N을 10μ§„λ²•μœΌλ‘œ 좜λ ₯ν•œλ‹€.

 

예제 μž…λ ₯1 예제 좜λ ₯1
ZZZZZ 36 60466175

 

 

μ†ŒμŠ€ μ½”λ“œ
# 1
N,B = input().split()

idx = len(N) - 1
decimal_num = 0

for num in N:
    add_num = 0
    if num.isdigit():
        add_num = int(num) * (int(B)**idx)
    else:
        add_num = (ord(num)-55) * (int(B)**idx)
    decimal_num += add_num
    idx -= 1

print(decimal_num)

 

풀이 # 1

  • 숫자λ₯Ό N, 진법을 B에 μ €μž₯
  • 숫자의 κΈΈμ΄μ—μ„œ 1을 λΊ€ 값을 idx에 μ €μž₯ (진법 계산 μ‹œ μ‚¬μš©)
  • N을 ν•œ μžλ¦¬μ”© λŒλ©΄μ„œ μˆ«μžμΈμ§€ λ¬ΈμžμΈμ§€ 확인
    • 숫자인 경우 ν•΄λ‹Ή μˆ«μžμ— idx μ œκ³±μ„ add_num으둜 μ‚¬μš©
    • 문자인 경우 ν•΄λ‹Ή 문자의 μ•„μŠ€ν‚€ μ½”λ“œ λ²ˆν˜Έμ—μ„œ 55λ₯Ό λΊ€ μˆ˜μ— idx μ œκ³±μ„ add_num으둜 μ‚¬μš©
  • decimal_num에 μœ„μ—μ„œ κ΅¬ν•œ 수λ₯Ό λ”ν•˜κ³  자릿수 idxμ—λŠ” 1을 λΊ΄κΈ°

 

# 2
N,B = input().split()

N = N[::-1]
numbers = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
decimal_num = 0

for idx,num in enumerate(N):
    decimal_num += (int(B)**idx)*(numbers.index(num))

print(decimal_num)

 

풀이 # 2

  • 숫자λ₯Ό N, 진법을 B에 μ €μž₯
  • 숫자 N을 거꾸둜 λ§Œλ“€κΈ° (진법 κ³„μ‚°μ‹œμ— μ•žμ—μ„œλΆ€ν„° μžλ¦Ώκ°’μ„ κ³±ν•˜κΈ° μœ„ν•œ κ³Όμ •)
  • μˆ«μžμ™€ 문자λ₯Ό numbers에 μ €μž₯
  • N을 ν•œ μžλ¦¬μ”© λŒλ©΄μ„œ κ°’ λ”ν•˜κΈ°
    • (Bμ§„λ²•μ˜ idx 제곱) x (numbersμ—μ„œ num의 인덱슀 번호)

 

μ•„μŠ€ν‚€μ½”λ“œ 번호λ₯Ό μ΄μš©ν•œ 첫 번째 ν’€μ΄λ‘œ ν’€μ—ˆλŠ”λ° λ‹€λ₯Έ 풀이λ₯Ό μ°Ύμ•„λ³΄λ‹ˆ λŒ€λΆ€λΆ„ 두 번째 ν’€μ΄λ‘œ ν‘Ό 것 κ°™λ‹€. ν™•μΈν•΄λ³΄λ‹ˆ μ‚¬μš©λ˜λŠ” λ©”λͺ¨λ¦¬ 크기와 μ‹œκ°„μ€ λ˜‘κ°™μ•„μ„œ νŽΈν•œ λ°©λ²•μœΌλ‘œ ν’€λ©΄ 될 λ“― ν•˜λ‹€.

https://www.acmicpc.net/problem/2563

 

문제

 

κ°€λ‘œ, μ„Έλ‘œμ˜ 크기가 각각 100인 μ •μ‚¬κ°ν˜• λͺ¨μ–‘μ˜ 흰색 도화지가 μžˆλ‹€. 이 도화지 μœ„μ— κ°€λ‘œ, μ„Έλ‘œμ˜ 크기가 각각 10인 μ •μ‚¬κ°ν˜• λͺ¨μ–‘μ˜ 검은색 색쒅이λ₯Ό μƒ‰μ’…μ΄μ˜ λ³€κ³Ό λ„ν™”μ§€μ˜ 변이 ν‰ν–‰ν•˜λ„λ‘ 뢙인닀. μ΄λŸ¬ν•œ λ°©μ‹μœΌλ‘œ 색쒅이λ₯Ό ν•œ μž₯ λ˜λŠ” μ—¬λŸ¬ μž₯ 뢙인 ν›„ 색쒅이가 뢙은 검은 μ˜μ—­μ˜ 넓이λ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

 

예λ₯Ό λ“€μ–΄ 흰색 도화지 μœ„μ— μ„Έ μž₯의 검은색 색쒅이λ₯Ό κ·Έλ¦Όκ³Ό 같은 λͺ¨μ–‘μœΌλ‘œ λΆ™μ˜€λ‹€λ©΄ 검은색 μ˜μ—­μ˜ λ„“μ΄λŠ” 260이 λœλ‹€.

 

μž…λ ₯

첫째 쀄에 μƒ‰μ’…μ΄μ˜ μˆ˜κ°€ 주어진닀. 이어 λ‘˜μ§Έ 쀄뢀터 ν•œ 쀄에 ν•˜λ‚˜μ”© 색쒅이λ₯Ό 뢙인 μœ„μΉ˜κ°€ 주어진닀. 색쒅이λ₯Ό 뢙인 μœ„μΉ˜λŠ” 두 개의 μžμ—°μˆ˜λ‘œ μ£Όμ–΄μ§€λŠ”λ° 첫 번째 μžμ—°μˆ˜λŠ” μƒ‰μ’…μ΄μ˜ μ™Όμͺ½ λ³€κ³Ό λ„ν™”μ§€μ˜ μ™Όμͺ½ λ³€ μ‚¬μ΄μ˜ 거리이고, 두 번째 μžμ—°μˆ˜λŠ” μƒ‰μ’…μ΄μ˜ μ•„λž˜μͺ½ λ³€κ³Ό λ„ν™”μ§€μ˜ μ•„λž˜μͺ½ λ³€ μ‚¬μ΄μ˜ 거리이닀. μƒ‰μ’…μ΄μ˜ μˆ˜λŠ” 100 μ΄ν•˜μ΄λ©°, 색쒅이가 도화지 λ°–μœΌλ‘œ λ‚˜κ°€λŠ” κ²½μš°λŠ” μ—†λ‹€.

 

좜λ ₯

첫째 쀄에 색쒅이가 뢙은 검은 μ˜μ—­μ˜ 넓이λ₯Ό 좜λ ₯ν•œλ‹€.

 

예제 μž…λ ₯1 예제 좜λ ₯1
3
3 7
15 7
5 2
260

 

 

μ†ŒμŠ€ μ½”λ“œ
# 도화지
paper = [[0 for col in range(100)] for row in range(100)]

n = int(input())

for _ in range(n):
    x,y = map(int, input().split())

    temp_x = x
    temp_y = y

    # μƒ‰μΉ ν•˜κΈ°
    while temp_x < x + 10:
        for idx in range(10):
            paper[temp_x][temp_y+idx] += 1
        temp_x += 1

# 도화지λ₯Ό λŒλ©΄μ„œ μƒ‰μΉ λ˜μ–΄ 있으면 cnt+1
cnt = 0
for row in paper:
    for col in row:
        if col > 0:
            cnt += 1

print(cnt)

 

풀이

  • 100 x 100 크기 도화지 2차원 리슀트둜 μ •μ˜
  • μƒ‰μ’…μ΄μ˜ 수λ₯Ό n에 μ €μž₯
  • μƒ‰μ’…μ΄μ˜ 수만큼 μƒ‰μΉ ν•˜λŠ” 과정을 반볡
    • μƒ‰μ’…μ΄μ˜ ν–‰ 번호λ₯Ό x, μ—΄ 번호λ₯Ό y에 μ €μž₯
    • ν–‰ λ²ˆν˜Έμ™€ μ—΄ 번호λ₯Ό μž„μ‹œλ‘œ temp_x, temp_y에 μ €μž₯
    • μƒ‰μ’…μ΄μ˜ 길이가 κ°€λ‘œμ„Έλ‘œ 10μ΄λ―€λ‘œ ν–‰μ—΄λ²ˆν˜Έμ˜ +10λ§ŒνΌμ„ 색칠
  • 도화지λ₯Ό λŒλ©΄μ„œ 값이 1보닀 큰 κ²½μš°μ— cnt+1

 

μ²˜μŒμ— 도화지λ₯Ό μ •μ˜ν•  λ•Œ [[0]*100]*100으둜 μ •μ˜ν–ˆμ—ˆλŠ”λ° μ›ν•˜λŠ” λŒ€λ‘œ λ‚˜μ˜€μ§€ μ•Šμ•„μ„œ μ°Ύμ•„λ³΄λ‹ˆ μ—°μ‚°μž *λ₯Ό μ΄μš©ν•˜μ—¬ 배열을 μ„ μ–Έν•˜λ©΄ λ‹¨μˆœν•˜κ²Œ μš”μ†Œλ§Œ λ³΅μ‚¬ν•˜λŠ” 얕은 볡사(shallow copy)κ°€ μΌμ–΄λ‚œλ‹€κ³  ν•œλ‹€. κ·Έλž˜μ„œ λ°”λΌλ³΄λŠ” κ°μ²΄λŠ” λ™μΌν•˜κ³  값을 λ³€κ²½ν•  κ²½μš°μ— λ‹€λ₯Έ μ›μ†Œμ˜ 값도 λ³€ν•˜λŠ” ν˜„μƒμ΄ λ°œμƒν•˜λ‹ˆ 값을 λ³€κ²½ν•˜μ§€ μ•ŠλŠ” κ²½μš°μ—λ§Œ μ‚¬μš©ν•˜λŠ” 것이 μ’‹λ‹€κ³  ν•œλ‹€. μ„ μ–Έ 방식을 λ³€κ²½ν•˜λ‹ˆκΉŒ λ‹€ν–‰νžˆ λ¬Έμ œμ—†μ΄ 정닡을 ꡬ할 수 μžˆμ—ˆλ‹€!!

+ Recent posts