Skip to content

Conversation

@kokeunho
Copy link
Collaborator

๐Ÿ”— ๋ฌธ์ œ ๋งํฌ

[PCCP ๊ธฐ์ถœ๋ฌธ์ œ] 3๋ฒˆ / ์•„๋‚ ๋กœ๊ทธ ์‹œ๊ณ„
https://school.programmers.co.kr/learn/courses/30/lessons/250135

โœ”๏ธ ์†Œ์š”๋œ ์‹œ๊ฐ„

?

โœจ ์ˆ˜๋„ ์ฝ”๋“œ

์˜ค๋ž˜ ๊ณ ๋ฏผํ•ด๋ดค๋Š”๋ฐ
ํ’€์ด๋ฒ•์ด ๋– ์˜ค๋ฅด์ง€ ์•Š์•„ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ํ’€์ด๋ฅผ ๋ดค์Šต๋‹ˆ๋‹ค.
๊ฐ๋„๋ฅผ ๊ณ„์‚ฐํ•˜์—ฌ ํ‘ธ๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

์šฐ์„  ์‹œ์ž‘ ์‹œ๊ฐ„๊ณผ ๋ ์‹œ๊ฐ„์„ ์ดˆ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
1h = 60๋ถ„ = 3600์ดˆ ์ด๋ฏ€๋กœ
3600 * hour + 60 * min + sec์„ ํ•˜์—ฌ ์ดˆ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ์‹œ์ž‘ ์‹œ๊ฐ„์—์„œ ๋ ์‹œ๊ฐ„๊นŒ์ง€ 1์ดˆ์”ฉ ์ฆ๊ฐ€ ์‹œ์ผœ

ํ•ด๋‹น ์‹œ๊ฐ„์— ์ดˆ, ๋ถ„, ์‹œ์นจ์˜ ๊ฐ๋„๋ฅผ ๊ณ„์‚ฐํ•˜๊ณ 
์ดˆ์นจ๊ณผ ์‹œ์นจ์˜ ๊ฒน์นจ ์—ฌ๋ถ€
์ดˆ์นจ๊ณผ ๋ถ„์นจ์˜ ๊ฒน์นจ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

์ด๋•Œ ๊ฒน์นจ์˜ ์—ฌ๋ถ€๋Š” ํ˜„์žฌ์˜ ์ดˆ์นจ๊ณผ ์‹œ(๋ถ„)์นจ์˜ ๊ฐ๋„ ์ฐจ์ด๊ฐ€ ์–‘์ˆ˜์—์„œ
์Œ์ˆ˜๋กœ ๋ฐ”๋€Œ๋ฉด ์ดˆ์นจ์ด ์‹œ(๋ถ„)์นจ์„ ์ถ”์›”ํ–ˆ๋‹ค๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ๊ฒน์นจ์ด ๋ฐœ์ƒํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋ฌธ์ œ์—์„œ ์ดˆ, ๋ถ„, ์‹œ์นจ ์„ธ ๊ฐœ๊ฐ€ ๋ชจ๋‘ ๊ฒน์น˜๋Š” ๊ฒƒ์€ ํ•˜๋‚˜๋กœ ์นœ๋‹ค๊ณ  ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—
hMatch์™€ mMatch๊ฐ€ ๋ชจ๋‘ ์ฐธ์ผ ๋•Œ, ์‹œ์นจ๊ณผ ๋ถ„์นจ์˜ ๊ฐ๋„๊ฐ€ ๊ฐ™์€์ง€ ํ™•์ธํ•˜๊ณ  ๊ฐ™๋‹ค๋ฉด +1 ์•„๋‹ˆ๋ผ๋ฉด +2๋ฅผ ํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์‹ค ์ด ๋ถ€๋ถ„์ด ํ—ท๊ฐˆ๋ ธ๋˜๊ฒŒ, ์ €๋Š” ์ฒ˜์Œ์— ์•„๋ž˜์ฒ˜๋Ÿผ ์ž‘์„ฑํ–ˆ์—ˆ์Šต๋‹ˆ๋‹ค.

            if (hMatch) answer++;
            if (mMatch) answer++;
            if (hMatch && mMatch) answer--;

ํ•˜์ง€๋งŒ ์ดˆ์นจ์€ 1์ดˆ์— 6๋„๋ฅผ ์›€์ง์ผ ์ˆ˜ ์žˆ๊ณ  6๋„ ์•ˆ์—์„œ ์‹œ์นจ, ๋ถ„์นจ์„ ์ถ”์›”ํ–ˆ์–ด๋„
๊ทธ๊ฒƒ์ด ์„ธ ์นจ์ด ๋ชจ๋‘ ๊ฒน์ณค์—ˆ๋‹ค๋Š” ๋œป์€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ œ ์ฝ”๋“œ๋Š” ํ‹€๋ ธ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋งˆ์ง€๋ง‰์œผ๋กœ ์‹œ์ž‘๋ถ€ํ„ฐ ์„ธ๊ฐœ์˜ ์นจ์ด ๊ฒน์น˜๋Š” ๊ฒฝ์šฐ๋„ ๊ณ„์‚ฐํ•ด์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
(ํ˜„์žฌ ์‹œ์ ์˜ ๊ฐ ์นจ์˜ ๊ฐ๋„์™€ 1์ดˆ ๋’ค ์‹œ์ ์˜ ๊ฐ๋„๋“ค์„ ๋น„๊ตํ•˜์—ฌ ๊ฒน์นจ ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•˜๋ฏ€๋กœ ์‹œ์ž‘๋ถ€ํ„ฐ ๊ฒน์น˜๋Š” ๊ฒฝ์šฐ๋Š” ๊ณ„์‚ฐํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ)
0์‹œ 0๋ถ„ 0์ดˆ์™€ 12์‹œ 0๋ถ„ 0์ดˆ๊ฐ€ ๊ทธ ๊ฒฝ์šฐ์— ํ•ด๋‹นํ•˜์—ฌ ๋”ฐ๋กœ ๊ณ„์‚ฐํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

์‹ ๊ฒฝ์จ์•ผํ•  ๊ฒƒ์ด ๋„ˆ๋ฌด ๋งŽ์•˜๋˜ ๋ฌธ์ œ์˜€์Šต๋‹ˆ๋‹ค...
ํ•˜์ง€๋งŒ ํด๋กœ๋“œํ•œํ…Œ ํ•ด๋‹น ๋ฌธ์ œ ํ’€์ด๋ฒ•์„ ๋ฌผ์–ด๋ณด๋‹ˆ
์ˆ˜ํ•™์„ ์‚ฌ์šฉํ•œ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์„ ์•Œ๋ ค์คฌ์Šต๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ํ•ด๋‹น ๋ฐฉ์‹์€ ๋ฏธ๋ฆฌ ๊ณ„์‚ฐ๋œ ์ˆ˜ํ•™ ๊ณต์‹์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์‹œ์นจ๊ณผ ๋ถ„์นจ์€ 12์‹œ๊ฐ„ ์•ˆ์— 11๋ฒˆ ๊ฒน์นฉ๋‹ˆ๋‹ค.
์‹œ์นจ๊ณผ ์ดˆ์นจ์€ 12์‹œ๊ฐ„์— 719๋ฒˆ
๋ถ„์นจ๊ณผ ์ดˆ์นจ์€ 12์‹œ๊ฐ„์— 708๋ฒˆ

๊ทธ๋Ÿฌ๋ฉด ์•„๋ž˜์ฒ˜๋Ÿผ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์„œ ํ’€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

import java.util.*;

class Solution {
    public int solution(int h1, int m1, int s1, int h2, int m2, int s2) {
        int start = h1 * 3600 + m1 * 60 + s1;
        int end = h2 * 3600 + m2 * 60 + s2;
        
        // 12์‹œ๊ฐ„(43200์ดˆ) ๋‹จ์œ„๋กœ ๊ณ„์‚ฐ
        int count = 0;
        
        // ์‹œ์ž‘๊ณผ ๋ ์‚ฌ์ด์˜ ์™„์ „ํ•œ 12์‹œ๊ฐ„ ์ฃผ๊ธฐ๋“ค
        int fullCycles = (end - start) / 43200;
        count += fullCycles * 719; // 12์‹œ๊ฐ„๋‹น 719๋ฒˆ ๊ฒน์นจ
        
        // ๋‚จ์€ ์‹œ๊ฐ„์— ๋Œ€ํ•ด์„œ๋Š” ์ง์ ‘ ๊ณ„์‚ฐ
        int remainingStart = start % 43200;
        int remainingEnd = remainingStart + (end - start) % 43200;
        
        // ์‹œ์นจ-์ดˆ์นจ ๊ฒน์นจ ๊ณ„์‚ฐ (12์‹œ๊ฐ„์— 719๋ฒˆ)
        count += countOverlaps(remainingStart, remainingEnd, 43200.0 / 719);
        
        // ๋ถ„์นจ-์ดˆ์นจ ๊ฒน์นจ ๊ณ„์‚ฐ (1์‹œ๊ฐ„์— 59๋ฒˆ)
        count += countOverlaps(remainingStart, remainingEnd, 3600.0 / 59);
        
        // ์ค‘๋ณต ์ œ๊ฑฐ (์‹œ์นจ-๋ถ„์นจ-์ดˆ์นจ์ด ๋ชจ๋‘ ๊ฒน์น˜๋Š” ๊ฒฝ์šฐ)
        count -= countTripleOverlaps(remainingStart, remainingEnd);
        
        return count;
    }
    
    // ํŠน์ • ์ฃผ๊ธฐ๋กœ ๊ฒน์น˜๋Š” ํšŸ์ˆ˜ ๊ณ„์‚ฐ
    private int countOverlaps(int start, int end, double period) {
        int startCount = (int)(start / period);
        int endCount = (int)(end / period);
        return endCount - startCount;
    }
    
    // ์‹œ์นจ, ๋ถ„์นจ, ์ดˆ์นจ์ด ๋ชจ๋‘ ๊ฒน์น˜๋Š” ํšŸ์ˆ˜ (12์‹œ๊ฐ„์— 1๋ฒˆ)
    private int countTripleOverlaps(int start, int end) {
        // 0์ดˆ(12:00:00)์™€ 43200์ดˆ๊ฐ€ ํฌํ•จ๋˜๋Š”์ง€ ํ™•์ธ
        if (start <= 0 && end > 0) return 1;
        if (start <= 43200 && end > 43200) return 1;
        return 0;
    }
}

๋‹ค๋ฅธ ๊ฑด ๊ทธ๋ ‡๋‹ค ํ•ด๋„ ์‹œ์นจ๊ณผ ์ดˆ์นจ์ด 12์‹œ๊ฐ„์— 719๋ฒˆ ๊ฒน์น˜๋Š” ๊ฒƒ์„ ์ฐพ๊ธฐ๋ž€
์‰ฝ์ง€ ์•Š์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๐Ÿ“š ์ƒˆ๋กญ๊ฒŒ ์•Œ๊ฒŒ๋œ ๋‚ด์šฉ

Copy link
Collaborator

@wnsmir wnsmir left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ํ•˜ ์ด๋ฌธ์ œ ์ง„์งœ ๊ณจ์น˜์•„ํŒ ๋˜ ๊ธฐ์–ต์ด ๋‚ฉ๋‹ˆ๋‹ค....

๊ธฐ๋ก์— ๋‚จ์•„์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ๋ณด๋‹ˆ ์ €๋Š” ๊ฐ๋„๊ฐ€ ์•„๋‹ˆ๋ผ ์ˆ˜์‹์œผ๋กœ ํ’€์—ˆ์—ˆ๊ตฐ์š”

  1. ์ดˆโ€“๋ถ„ ์€ 3600/59์ดˆ๋งˆ๋‹ค, ์ดˆโ€“์‹œ ๋Š” 43200/719์ดˆ๋งˆ๋‹ค ๋ผ๋Š” ๊ทœ์น™์„ ์žก๊ณ 
  2. ๊ตฌ๊ฐ„ ์•ˆ์— ๋“ค์–ด์˜ค๋Š” ์‹œ๊ฐ์˜ ๊ฐœ์ˆ˜๋ฅผ ์„ธ๊ณ 
  3. 12์‹œ๊ฐ„๋งˆ๋‹ค ์ค‘๋ณต์œผ๋กœ ์นด์šดํŠธ๋˜๋Š” ๊ฑด ํ•œ ๋ฒˆ ๋นผ์ฃผ๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค
    ์ €๋Š” ์ฒ˜์Œ์— ๊ฐ๋„๋กœ ํ’€๋ คํ–ˆ๋‹ค๊ฐ€ ๋ชปํ’€๊ณ  ์ˆ˜์‹์œผ๋กœ ๋‘์‹œ๊ฐ„๋™์•ˆ ํ’€์—ˆ๋˜ ๊ธฐ์–ต์ด ๋‚ฉ๋‹ˆ๋‹ค...
    ์ด๋ฌธ์ œ ํ‘ผ๋‹ค๊ณ  ๊ณ ์ƒํ•˜์…จ์Šต๋‹ˆ๋‹ค
def solution(h1, m1, s1, h2, m2, s2):
    # 1) ๊ตฌ๊ฐ„์„ ์ดˆ ๋‹จ์œ„๋กœ ๋ณ€ํ™˜
    start = h1 * 3600 + m1 * 60 + s1
    end   = h2 * 3600 + m2 * 60 + s2

    # 2) ์ถฉ๋Œ ์ฃผ๊ธฐ๋ฅผ ๋ถ„์ˆ˜๋กœ ํ‘œํ˜„
    #    ์ดˆ์นจ ๋ถ„์นจ: T_sm = 3600/59  (k๋ฒˆ ์ถฉ๋Œ ์‹œ t = k * (3600/59))
    num_sm, den_sm = 59, 3600
    #    ์ดˆ์นจ ์‹œ์นจ: T_sh = 43200/719 (k๋ฒˆ ์ถฉ๋Œ ์‹œ t = k * (43200/719))
    num_sh, den_sh = 719, 43200
    #    ์ค‘๋ณต ์ถฉ๋Œ ์ฃผ๊ธฐ(์ดˆ์นจ ๋ถ„์นจ & ์ดˆ์นจ ์‹œ์นจ ๋™์‹œ): 12์‹œ๊ฐ„ = 43200์ดˆ
    L = 43200

    # 3) start~end ๊ตฌ๊ฐ„ ๋‚ด ์ถฉ๋Œ ํšŸ์ˆ˜ ๊ณ„์‚ฐ (์ •์ˆ˜ ์ˆ˜์‹์œผ๋กœ ceil/floor ๊ตฌํ˜„)
    #   * k_sm_start = ์ตœ์†Œ k such that k*(3600/59) >= start
    #   * k_sm_end   = ์ตœ๋Œ€ k such that k*(3600/59) <= end
    k_sm_start = (start * num_sm + den_sm - 1) // den_sm
    k_sm_end   = (end   * num_sm) // den_sm
    count_sm   = max(0, k_sm_end - k_sm_start + 1)

    k_sh_start = (start * num_sh + den_sh - 1) // den_sh
    k_sh_end   = (end   * num_sh) // den_sh
    count_sh   = max(0, k_sh_end - k_sh_start + 1)

    # 4) ๊ฐ™์€ ์‹œ์ ์— ๋‘ ์ถฉ๋Œ์ด ์ผ์–ด๋‚˜๋Š” (์ค‘๋ณต) ํšŸ์ˆ˜
    dup_start = (start + L - 1) // L
    dup_end   = end // L
    dup_count = max(0, dup_end - dup_start + 1)

    # 5) ์ตœ์ข… = (์ดˆ๋ถ„ ์ถฉ๋Œ + ์ดˆ์‹œ ์ถฉ๋Œ) โˆ’ ์ค‘๋ณต ์ถฉ๋Œ
    return count_sm + count_sh - dup_count

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants