E D R , A S I H C RSS

Eight Queen Problem Discussion

EightQueenProblem을 ν’€λ©΄μ„œ ν˜Ήμ€ ν‘ΈλŠ”λ° μ‹€νŒ¨ν•˜λ©΄μ„œ 얻은 ThreeFsλΌ μ΄μ•ΌκΈ°ν•΄ λ΄…μ‹œλ‹€.

당신은 μ–΄λ–€ μ‹μœΌλ‘œ 이 λ¬Έμ œμ— 접근을 ν–ˆκ³ , μ–΄λ–€ μ‚¬κ³ μ˜ 과정을 거쳀으며, μ–΄λ–€ κ³Όμ •μœΌλ‘œ ν”„λ‘œκ·Έλž˜λ°μ„ ν–ˆμœΌλ©°, μ–΄λ–€ λ””μžμΈ 결정을 ν–ˆμŠ΅λ‹ˆκΉŒ? λ§Œμ•½ μ‹€νŒ¨ν–ˆλ‹€λ©΄ 당신이 ν–ˆλ˜ 것 ν˜Ήμ€ ν•˜μ§€ μ•Šμ•˜λ˜ 것 쀑 무엇이 μ‹€νŒ¨μ˜ μ£Όμš”μΈμ΄μ—ˆλ‹€κ³  뢄석을 ν•˜μ‹­λ‹ˆκΉŒ?

λ§Œμ•½ 당신보닀 더 짧은 μ‹œκ°„μ—, 더 짧은 μ½”λ“œλ‘œ λ¬Έμ œλΌ ν•΄κ²°ν•œ μ‚¬λžŒμ΄ μžˆλ‹€λ©΄, κ·Έ μ‚¬λžŒκ³Ό ν•¨κ»˜ PairProgramming (ν˜Ήμ€ NetMeeting 등을 이용, VirtualPairProgramming)을 ν•΄μ„œ κ·Έ λ¬Έμ œλΌ ν•¨κ»˜ μƒˆλ‘œ ν’€μ–΄λ³΄μ„Έμš”. 당신은 무엇을 λ°°μ› μŠ΅λ‹ˆκΉŒ? κ·Έ μ‚¬λžŒμ€ μ–΄λ–€ λ°©μ‹μœΌλ‘œ ν”„λ‘œκ·Έλž¨μ˜ μ˜¬λ°”λ¦„(correctness)을 ν™•μΈν•©λ‹ˆκΉŒ? κ·Έ μ‚¬λžŒμ€ 디버깅을 μ–΄λ–»κ²Œ ν•©λ‹ˆκΉŒ(ν˜Ήμ€ 디버깅이 거의 ν•„μš”ν•˜μ§€ μ•Šμ€ 접근법이 μžˆλ˜κ°€μš”)? κ·Έ μ‚¬λžŒμ€ μ–΄λ–€ μˆœμ„œλ‘œ λ¬Έμ œμ— μ ‘κ·Όν•΄ κ°‘λ‹ˆκΉŒ? κ·Έ μ‚¬λžŒμ€ μ–΄λŠ μ •λ„λ‘œκΉŒμ§€ μ½”λ“œλΌ λͺ¨λ“ˆν™” ν•©λ‹ˆκΉŒ? 이 κ²½ν—˜μ΄ λ‹Ήμ‹ μ˜ ν”„λ‘œκ·Έλž˜λ°μ— μ•žμœΌλ‘œ μ–΄λ–€ λ³€ν™”λΌ λΆˆλŸ¬μ˜¬ 것이라 μƒκ°ν•©λ‹ˆκΉŒ?

일단 κ΅¬μ„μ—μ„œλΆ€ν„° μ±„μ›Œλ‚˜κ°€λ©΄ μ‹€νŒ¨ν•œλ‹€.. (7κ°œκΉŒμ§€λŠ” λ˜μ§€λ§Œ.. μ—¬λŸκ°œλŠ” λ˜μ§€ μ•ŠλŠ”λ‹€) λ­”κ°€ λ‹€λ₯Έλ°©λ²•μ„ μ°Ύμ•„ 보아야겠닀.

λ‘λ²ˆμ§Έ.. κ°€μž₯ μž‘μ€ μžλ¦¬μˆ˜λΌ μ±„μ›Œλ‚˜κ°€λ©΄ μ‹€νŒ¨ν•œλ‹€ (μ—­μ‹œ 7κ°œκΉŒμ§€ λ˜μ§€λ§Œ.. μ—¬λŸκ°œλŠ” λ˜μ§€ μ•ŠλŠ”λ‹€.) μ—­μ‹œ λ‹€λ₯Έλ°©λ²•μ„ μ°Ύμ•„μ•Όκ² λ‹€.

μ„Έλ²ˆμ§Έκ°λ„.. 성곡적이닀. 일단 ν•œμ„에 ν•œκ°œμ˜ ν€Έλ§Œ λ“€μ–΄κ°„λ‹€λŠ” 점에 μ°©μ•ˆν•˜μ—¬ λͺ¨λ“  점을 κ²€μ‚¬ν•˜μ˜€λ‹€... λΉ„νš¨μœ¨μ μ΄μ§€λ§Œ ν™•μ‹€ν•œ 방법ㅑㅑ;

-- μ„ ν˜Έ

  • Facts - 접근방법:
말 κ·ΈλŒ€λ‘œ κ·Έλƒ₯ 정곡법 (이 λ μ§€λŠ” λͺ¨λ₯΄κ² μ§€λ§Œ. -_-;)으둜 λ‚˜κ°”λ‹€. μ—¬κΈ°μ„œλŠ” ν…ŒμŠ€νŠΈ μ½”λ“œλ‘œ λŒ€μ‹ μ„..

맨 μ²˜μŒμ—λŠ” ν•΄λ‹Ή μ²΄μŠ€νŒμ— λŒ€ν•œ μ μ ˆν•œ μ²˜λ¦¬λΌ ν•˜λŠ” 것 λΆ€ν„° μ ‘κ·Όν•΄ λ‚˜μ•„κ°”λ‹€. νŒμ— 퀸을 λ†“λŠ” 것 λΆ€ν„° μ‹œμž‘.
~cpp 
    def testBoardEmpty (self):
        self.assertEquals (self.bd.GetData (2,2), 0)

    def testSetQueen (self):
        self.bd.SetQueen (2,2)
        self.assertEquals (self.bd.GetData (2,2) ,1)

    def testPrintBoard (self):
        self.bd.SetQueen (1,1)
        self.bd.SetQueen (2,2)
        self.bd.SetQueen (7,7)
        self.assertEquals (self.bd.PrintBoard (), '''00000000\n01000000\n00100000\n00000000\n00000000\n00000000\n00000000\n00000001\n''')

κ·Έ λ‹€μŒμ—λŠ” '퀸을 놓을 수 μžˆλŠ” μœ„μΉ˜κ°€ μ•ˆμ „ν•œ 곳일까?' ν•˜λŠ” 점에 λŒ€ν•΄ μ ‘κ·Ό. μ΄λΌ SelftyZone 이라 μΉ­ν–ˆλ‹€. μ΄λΌ μ²΄ν¬ν•˜κΈ° μœ„ν•΄μ„œλŠ” κ°€λ‘œ/μ„Έλ‘œ/λŒ€κ°μ„ λ°©ν–₯을 λͺ¨λ‘ 체크해야 ν•˜λ€λ‘œ λ‹€μ‹œ 4개의 μž‘μ€ λͺ¨λ“ˆλ‘œ λ‚˜λˆ„μ–΄μ‘Œλ‹€. 그쀑 λŒ€κ°μ„  체크의 경우 처음 λΉ„κ΅λΌ μ‹œμž‘ν•  μœ„μΉ˜λΌ μΈ‘μ •ν•˜κΈ° μœ„ν•œ λͺ¨λ“ˆμ„ ν•˜λ‚˜ 더 μΆ”μΆœν•˜κ²Œ λ˜μ—ˆλ‹€.
~cpp 
    def testIsSelftyZone (self):
        self.bd.SetQueen (2,2)
        self.assertEquals (self.bd.IsSelftyZone (3,3), 0)
        self.assertEquals (self.bd.IsSelftyZone (1,5), 1)

    def testFindQueenInSameVertical (self):
        self.bd.SetQueen (2,2)
        self.assertEquals (self.bd.FindQueenInSameVertical (2), 1)
        self.assertEquals (self.bd.FindQueenInSameVertical (3), 0)

    def testFindQueenInSameHorizonal (self):
        self.bd.SetQueen (2,2)
        self.assertEquals (self.bd.FindQueenInSameHorizonal (2), 1)
        self.assertEquals (self.bd.FindQueenInSameHorizonal (3), 0)

    def testFindQueenInSameCrossLeftTopToRightBottom (self):
        self.bd.SetQueen (2,2)
        self.assertEquals (self.bd.FindQueenInSameCrossLeftTopToRightBottom (3,3), 1)
        self.assertEquals (self.bd.FindQueenInSameCrossLeftTopToRightBottom (1,1), 1)
        self.assertEquals (self.bd.FindQueenInSameCrossLeftTopToRightBottom (4,1), 0)

    def testFindQueenInSameCrossLeftBottomToRightTop (self):
        self.bd.SetQueen (2,2)
        self.assertEquals (self.bd.FindQueenInSameCrossLeftBottomToRightTop (3,3), 0)
        self.assertEquals (self.bd.FindQueenInSameCrossLeftBottomToRightTop (3,1), 1)
        self.assertEquals (self.bd.FindQueenInSameCrossLeftBottomToRightTop (1,3), 1)

~cpp 
    def testGetFirstCornerInCrossLeftTopToRightBottom (self):
        self.assertEquals (self.bd.GetFirstCornerInCrossLeftTopToRightBottom (3,3), (0,0))
        self.assertEquals (self.bd.GetFirstCornerInCrossLeftTopToRightBottom (4,3), (1,0))
        self.assertEquals (self.bd.GetFirstCornerInCrossLeftTopToRightBottom (1,5), (0,4))
        self.assertEquals (self.bd.GetFirstCornerInCrossLeftTopToRightBottom (0,0), (0,0))

    def testGetFirstCornerInCrossLeftBottomToRightTop (self):
        self.assertEquals (self.bd.GetFirstCornerInCrossLeftBottomToRightTop (2,2), (0,4))
        self.assertEquals (self.bd.GetFirstCornerInCrossLeftBottomToRightTop (3,5), (1,7))
        self.assertEquals (self.bd.GetFirstCornerInCrossLeftBottomToRightTop (7,7), (7,7))

ν•΄λ‹Ή μžλ¦¬μ— λ†“μ•˜μ„ 경우. λ‹€λ₯Έ 퀸을 곡격할 수 μžˆλŠ” μœ„μΉ˜μ— λŒ€ν•΄ μ•Œμ•„λ³΄κΈ° μœ„ν•œ 뢀뢄에 λŒ€ν•΄ μƒκ°ν–ˆλ‹€.
~cpp 
    def testIsAttackableOthers (self):
        self.bd.SetQueen (2,2)
        self.assertEquals (self.bd.IsAttackableOthers (3,3),1)
        self.bd.SetQueen (7,1)
        self.assertEquals (self.bd.IsAttackableOthers (7,1),0)
        self.assertEquals (self.bd.IsAttackableOthers (4,4),1)

ν•΄λ‹Ή level (0번째μ„~7번째μ„) 에 λŒ€ν•΄μ„œ κ³΅κ²©λ‹Ήν•˜μ§€ μ•ŠλŠ” μœ„μΉ˜λΌ μ–»μ–΄λ‚΄κΈ° μœ„ν•œ 리슀트 (μ •ν™•νžˆλŠ” νŠœν”Œ)λΌ μ–»μ–΄λ‚΄λŠ” λΆ€λΆ„.
~cpp 
    def testGetUnAttackablePositon (self):
        self.bd.SetQueen (0,0)
        self.assertEquals (self.bd.GetUnAttackablePosition (1), ((2,1),(3,1),(4,1),(5,1),(6,1),(7,1)))
        self.assertEquals (self.bd.GetUnAttackablePosition (2), ((1,2),(3,2),(4,2),(5,2),(6,2),(7,2)))

ν•΄λ‹Ή μ•Œκ³ λ¦¬μ¦˜μ„ κ΅¬ν˜„ν•˜κΈ° μœ„ν•œ 기반이 λ˜λŠ” 체크 κ΄€λ ¨ 뢀뢄에 λŒ€ν•΄ (μ—¬κΈ°κΉŒμ§€) λ§Œλ“œλŠ”λ°λŠ” 52λΆ„μ •λ„κ°€λŸ‰μ΄ κ±Έλ Έλ‹€. ν•˜μ§€λ§Œ, μ •μž‘ Queen 을 λ°°μ—΄ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜μ„ μƒκ°ν•΄λ‚΄λŠ”λ° 3μ‹œκ°„ κ°€λŸ‰μ΄ κ±Έλ Έλ‹€. --;

  • Feelings - λŠλ‚€μ : μ‹œκ°„μ΄ λ„˜ μ˜€λž˜κ±Έλ €μ„œ ν•œνŽΈμœΌλ‘œλŠ” μͺ½νŒ”리긴 ν•˜λ‹€. -_-; 뭐.. μ•Œκ³ λ¦¬μ¦˜ 뢀뢄에 λŒ€ν•΄μ„œ λ„ˆλ¬΄ μ‹œκ°„μ„ 였래 λŒμ—ˆλ‹€. μ™œ κ·Έλž¬μ„κΉŒ μƒκ°ν•˜λŠ”λ°.. μ•„λ§ˆ νŠΉμ • μ•Œκ³ λ¦¬μ¦˜λ“€μ΄ λ¨Όμ € 머릿속에 λ– μ˜¬λΌμ„œκ°€ μ•„λ‹κΉŒ ν•œλ‹€. (이 뢀뢄에 λŒ€ν•΄μ„œλŠ” stack을 μ“ΈκΉŒ recursive 둜 λŒ€μ‹ ν• κΉŒ μ΄λ¦¬μ €λ¦¬κ΅°μ‹œλ κ΅°μ‹œλ ) 이런 뢀뢄에 λŒ€ν•΄μ„œλŠ” μ–΄λ–»κ²Œ testκ°€λŠ₯ν•œ λΆ€λΆ„μœΌλ‘œ μ ‘κ·Όν•΄λ‚˜κ°ˆμˆ˜ μžˆμ„κΉŒ.

-- μ„μ²œ

μ„μ²œκ΅°μ—κ²Œ.

μžμ‹ μ—κ²Œ 항상 "What is the simplest thing that could possibly work?"λΌλŠ” μ§ˆλ¬Έμ„ ν•˜λ©΄μ„œ TestDrivenDevelopmentλΌ ν–ˆλ‚˜μš”? ν…ŒμŠ€νŠΈ/μ½”λ“œ 사이클을 μ§„ν–‰ν•˜λ©΄μ„œ μŠ€ν…μ„ μž‘κ²Œ ν•˜λ €κ³  λ…Έλ ₯ν–ˆλ‚˜μš”? 쀑간에 진척이 λ³„λ‘œ μ—†λŠ” 경우, μ–΄λ–€ μ•‘μ…˜μ„ μ·¨ν–ˆλ‚˜μš”? κ·Έ λ•Œ ν…ŒμŠ€νŠΈ μ‚¬μ΄ν΄μ˜ μŠ€ν…μ„ 더 μž‘κ²Œν•˜λ €κ³  ν–ˆλ‚˜μš”? λ§Œμ•½ λ‹€μ‹œ 같은 λ¬Έμ œλΌ μƒˆλ‘œ ν‘Όλ‹€λ©΄ μ–΄λ–€ μˆœμ„œλ‘œ ν…ŒμŠ€νŠΈλΌ ν•˜κ³  μ‹Άλ‚˜μš”? (직접 λ‹€μ‹œ ν•œλ²ˆ μƒˆλ‘œ μ‹œμž‘ν•˜λŠ” 것도 κ°•λ ₯ μΆ”μ²œ) μ™œ λ‹€λ₯Έ μ‚¬λžŒλ“€μ— λΉ„ν•΄ μ‹œκ°„μ΄ μƒλŒ€μ μœΌλ‘œ 많이 κ±Έλ Έμ„κΉŒμš”? ν…ŒμŠ€νŠΈ μ½”λ“œλΌ μ‚¬μš©ν•œ 것이 κ·Έ μ‹œκ°„λ§ŒνΌμ˜ 이득이 μžˆμ—ˆλ‚˜μš”? TestDrivenDevelopmentλΌ ν•΄λ‚΄κ°€λ©΄μ„œ ν˜„μž¬ νŒ¨μŠ€ν•˜λ €κ³  ν•˜λŠ” ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ—μ„œ 무엇을 λ°°μ› λ‚˜μš”? μΌ„νŠΈλ²‘μ΄ λ§ν•˜λŠ” κ²ƒμ²˜λŸΌ μ‚¬κ³ μ˜ 도ꡬ가 λ˜μ–΄ μ£Όμ—ˆλ‚˜μš”? 참고둜 μ €λŠ” EightQueenProblem을 파이썬으둜 μ•½ 30λΆ„ 정도 μ‹œκ°„μ— 50 라인 μ΄λ‚΄λ‘œ(ν…ŒμŠ€νŠΈ μ½”λ“œ μ œμ™Έ) ν’€μ—ˆμŠ΅λ‹ˆλ‹€. TestDrivenDevelopmentλ‘œμš”. --κΉ€μ°½μ€

.

직접 λ‹€μ‹œ μƒˆλ‘œ μ‹œμž‘ν•˜λŠ” 것에 λŒ€ν•΄μ„œλŠ” 비ꡐ계산을 내리기 νž˜λ“€κ²ƒ κ°™λ„μš”. (더 쒋은 λ””μžμΈμ„ μ–»μ–΄λ‚΄λŠ” 것과 ν›ˆλ ¨λΌλŠ” μ μ—μ„œλŠ” λ¬Όλ‘  저도 μΆ”μ²œ) μ œκ°€ 잘λͺ»ν–ˆλ‹€κ³  μƒκ°λ˜λŠ” 뢀뢄은, 퀸을 λ°°μ—΄ν•˜λŠ” 방법 μ•Œκ³ λ¦¬μ¦˜ 뢀뢄에 λŒ€ν•΄ TestDrivenDevelopment λΌ μ§€ν‚€μ§€ λͺ»ν–ˆλ‹€λŠ” 점이죠. (머릿속에 λ¨Όμ € μž¬κ·€ν•¨μˆ˜ 호좜 λ“±μ˜ νŠΉμ • μ•Œκ³ λ¦¬μ¦˜λ“€μ΄ λ¨Όμ € λ– μ˜€λ₯Έμ§€λΌ. )

μ•Œκ³ λ¦¬μ¦˜ ꢁ리 뢀뢄에 λŒ€ν•΄μ„œλ„ 80/20 법칙이 ν†΅μš©λ˜λ €λ‚˜μš”. :) 3μ‹œκ°„μ΄ κ±Έλ¦° 뢀뢄이 λ°”λ‘œ λ‹€μŒ λΆ€λΆ„μ΄μ˜€λŠ”λ°μš”.
~cpp 
    def DefineQueen (self, Level):
        if Level == 8:
            self.Count = self.Count + 1
            print "%d. level : %d \n" % (self.Count, Level)
            print self.PrintBoard ()
            return 0
        
        PositionList = self.GetUnAttackablePosition (Level)

        for position in PositionList:
            self.SetQueen (position[0], position[1])
            Ret = self.DefineQueen (Level + 1)
            if not Ret:
                self.SetData (position[0],position[1], 0)
즉, μ‹€μ œ Queen의 μœ„μΉ˜λ“€μ„ μ •μ˜ν•˜λŠ” μž¬κ·€ν˜ΈμΆœ μ½”λ“œμΈλ°μš”. 이 뢀뢄에 λŒ€ν•œ TestCase λŠ” μ΅œμ’…μ μœΌλ‘œ μ–»μ–΄λ‚Έ νŒμ— λŒ€ν•΄ μ˜¬λ°”λ₯Έ Queen의 배열인지 ν™•μΈν•˜λŠ” 뢀뢄이 λ˜μ–΄μ•Ό κ² μ£ . μ—°μŠ΅μž₯에 계속 μ˜μ‚¬μ½”λ“œλΌ μ μ–΄λ†“κΈ΄ ν–ˆμ—ˆλŠ”λ°, 적어놓고 λ§žμ„κ²ƒμ΄λ‹€λΌλŠ” 확신을 계속 λͺ»ν–ˆμ£ . 확신을 μœ„ν•΄μ„œλŠ” ν…ŒμŠ€νŠΈμ½”λ“œλ‘œ 뽑아낼 수 μžˆμ–΄μ•Ό 할텐데, κ·Έλ•Œλ‹Ήμ‹œ 이 뢀뢄에 λŒ€ν•΄μ„œ ν…ŒμŠ€νŠΈμ½”λ“œλΌ λͺ»λ§Œλ“€μ—ˆμ£ .

μ§€κΈˆμ΄λΌλ©΄ 'Level 8μΌλ•Œ λ°”λ‘œ νŒμ„ 찍지 μ•Šκ³ , μ € μƒν™©μ˜ λ°μ΄ν„°κ΅¬μ‘°μ²΄λΌ κ·ΈλŒ€λ‘œ λ³΅μ‚¬ν•΄μ„œ 결과만 λ„£μ–΄λ†“λŠ” λ¦¬μŠ€νŠΈλΌ ν•˜λ‚˜ 더 λ§Œλ“€κ³ , κ·Έ 결과듀에 λŒ€ν•΄ μ˜¬λ°”λ₯Έ 배열을 ν–ˆλŠ”μ§€ ν…ŒμŠ€νŠΈν•˜λŠ” μ½”λ“œλΌ λ½‘μ•„λ‚Ό 수 μžˆκ² λ‹€' λΌλŠ” 아이디어가 λ– μ˜€λ₯΄κΈ΄ ν•˜λ„μš”. (그렇더라도 100라인은 λ„˜μ–΄κ°ˆκ²ƒ κ°™κΈ΄ ν•˜λ„μš”. ^^;)

μ‚¬κ³ μ˜ λ„κ΅¬λ‘œμ¨λŠ” μ—°μŠ΅μž₯κ³Ό TFP λ‘˜ λ‹€ μ΄μš©ν–ˆμ§€λ§Œ, μˆœμˆ˜ν•˜κ²Œ μ μš©ν•˜μ§€λŠ” μ•Šμ•˜μŠ΅λ‹ˆλ‹€. (μœ„μ˜ Queen을 λ†“λŠ” 뢀뢄에 λŒ€ν•œ μž¬κ·€ν˜ΈμΆœλΆ€λΆ„μ—μ„œλŠ” 적용λͺ»ν•¨) ν…ŒμŠ€νŠΈμž‘μ„±μ‹œκ°„/μ½”λ“œμž‘μ„±μ‹œκ°„ 등에 λŒ€ν•œ κ΄€λ¦¬λŠ” ν•˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€. (이 뢀뢄에 λŒ€ν•΄μ„œλŠ” λ°˜μ„±μ„. ^^;) 흠.. 그리고 'The Simplest Thing'을 μ°Ύμ•„λ‚˜κ°”λ‹€κΈ° 보닀도, μ΄λΈ ν•΄λ‹Ή λ¬Έμ œμ— λŒ€ν•΄μ„œ μ˜μ‚¬μ½”λ“œλΌ μƒκ°ν•˜κ³ , ν•΄λ‹Ή μ½”λ“œμ— λŒ€ν•΄ Top-Down ν˜•νƒœλ‘œ λͺ¨λ“ˆμ„ λ‚˜λˆˆλ’€μ— λͺ¨λ“ˆμ— λŒ€ν•΄ ν…ŒμŠ€νŠΈλΌ λ§Œλ“€μ–΄κ°”λ‹€λŠ” 생각이 λ“œλ„μš”. --μ„μ²œ

μ§€κΈˆκ°€μ§€ λͺ¨λ‘ C++, Python, Java λ“± OOPL을 μ΄μš©ν–ˆλŠ”λ° κ·Έ 쀑 OOP둜 ν‘Ό μ‚¬λžŒμ€ 아무도 μ—†λ„μš” -- class ν‚€μ›Œλ“œκ°€ μžˆλ‹€κ³  OOP라고 ν•˜κΈ΄ νž˜λ“€κ² μ£ . μ‚¬λžŒμ€ μ‹œκ°„μ΄ κΈ‰ν•˜λ‹€κ³  생각이 λ“€μˆ˜λ‘ ν‰μ†Œ μ΅μˆ™ν•œ 도ꡬ와 λ©˜νƒˆλ¦¬ν‹°λ‘œ λŒμ•„κ°€λ €κ³  ν•˜μ£ . μ–΄μ©Œλ©΄ OOPκ°€ νŽΈν•˜κ³  μˆ˜μ›”ν•˜λ‹€κ³  λŠλΌλŠ” μ‚¬λžŒμ΄ μ—†λ‹€λŠ” 이야기가 될지도 λͺ¨λ₯΄κ² λ„μš”. λ¬Όλ‘  λͺ¨λ“  λ¬Έμ œλΌ ν‘ΈλŠ”λ° OOPκ°€ μ’‹λ‹€λŠ” μ΄μ•ΌκΈ°λΌ ν•˜λ €λŠ” 것은 μ•„λ‹™λ‹ˆλ‹€λ§Œ. --κΉ€μ°½μ€

이런 μ•”ν˜Έκ°™μ€ ν”„λ‘œκ·Έλž¨λ„ μžˆλ‹€λŠ”..

Eight Queens program written by Marcel van Kervinck
~cpp 
/* Marcel van Kervinck <xxxxxxx@xxxxx.xxx.xxx.xx> */
t(a,b,c){int d=0,e=a&~b&~c,f=1;if(a)for(f=0;d=(e-=d)&-e;f+=t(a-d,(b+d)*2,(
c+d)/2));return f;}main(q){scanf("%d",&q);printf("%d\n",t(~(~0<<q),0,0));}

When the program is run, one has to give a number n (smaller than 32), and the program will return in how many ways n Queens can be put on a n by n board in such a way that they cannot beat each other.
Note that the d=(e-=d)&-e; statement can be compiled wrong on certain compilers. The inner assignment should be executed first. Otherwise replace it with e-=d,d=e&-e;.


μ‹€νŒ¨ν•œ 이유
  • 문제 인식 잘λͺ», 풀이 κ³„νš 잘λͺ». μ™„μ„±λ˜μ—ˆλ‹€κ³  μƒκ°ν•œ μˆœκ°„μ—, ν¬λ‚˜ν° μ‹€μˆ˜κ°€ μžˆμ—ˆμŒ μΈμ§€ν•˜μ˜€λ‹€. 닡이 μ—†λŠ” μ„ μ•Œμ•˜λ‹€. TT
  • 말에 λŒ€ν•œ μ •λ³΄λΌ μ²΄μŠ€νŒμ—λ§Œ κ°€μ§€κ²Œ ν•˜μ˜€λ‹€. (문제 뢄석 μ†Œν™€νžˆν•œ λŒ“κ°€ TT)
  • TFD둜 μ‹œλ„ν•˜μ˜€λŠ”λ°. test와 codeκ°„ 이동이 λΉ λ₯΄μ§€ λͺ»ν•˜μ˜€λ‹€. 즉, test뢀뢄이 μΆ©λΆ„νžˆ μž‘μ•„μ§€μ§€ λͺ»ν•œ 것 κ°™λ‹€.

내일 λ‹€μ‹œ λ„μ „ν•˜μž...μ‘°μ˜λ΄‰
DeleteMe) μ•—.. 뢉은λΈλ₯΄λ‹˜λ„ λ“€λ¦¬μ…¨κ΅°μš”..~ ^^ --1002

ThreeFs
μ΄μŠΉν•œκ³Ό PairProgramming을 ν•˜λ©° λ¬Έμ œλΌ ν’€μ—ˆμŠ΅λ‹ˆλ‹€. TDDλΌ ν•˜μ§€ μ•Šκ³  30뢄을 μž‘μ„±ν–ˆκ³  λ‚˜λ¨Έμ§€ 1μ‹œκ°„30뢄을 TDD둜 ν–ˆμŠ΅λ‹ˆλ‹€.

μ λ‹Ήν•œ μžλ£Œκ΅¬μ‘°λΌ λκΉŒμ§€ 찾지 λͺ»ν•΄ ν—€λ§Έλ‹€λŠ” λŠλ‚Œμž…λ‹ˆλ‹€. 처음 TDDλΌ μ ‘ν•˜λŠ” νŒŒνŠΈλ„ˆλ‘œμ„œλŠ” ν…ŒμŠ€νŠΈλΌ λΉ¨λ¦¬ 이해할 수 μ—†μ–΄μ„œ ν•œ λ™μ•ˆ νŽ˜μ–΄ 사이에 곡백이 λŠκ»΄μ‘ŒμŠ΅λ‹ˆλ‹€. μ†λ„λΌ λŠ¦μΆ”κ³  νŒŒνŠΈλ„ˆμ— λ§žμΆ”μž, νŒŒνŠΈλ„ˆκ°€ λ“œλΌμ΄λΈŒλΌ ν•˜λŠ” μ˜μš•μ„ λ³΄μ˜€μŠ΅λ‹ˆλ‹€. μ™„μ„±ν•˜μ§€ λͺ»ν•΄ λ‹€λ₯Έ 이의 μ½”λ“œμ™€ λΉ„κ΅ν•˜λŠ” μ‹œκ°„μ΄ μ—†μ–΄μ„œ μ•ˆνƒ€κΉμŠ΅λ‹ˆλ‹€.

μ λ‹Ήν•œ μžλ£Œκ΅¬μ‘°λΌ μƒκ°ν•˜λŠ” μ‹œκ°„μ΄ μ΄ˆλ°˜μ΄λ“ , μ€‘λ°˜μ΄λ“  κΌ­ ν•„μš”ν•˜λ‹€λŠ” 생각이 λ“­λ‹ˆλ‹€. --Leonardong
Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:23:11
Processing time 0.0426 sec