U E D R , A S I H C RSS

Eight Queen Problem/kulguy

λŠλ‚Œμ 

λ¬Έμ œμ— λŒ€ν•œ 개랡적인 μ΄ν•΄λ§Œ ν•˜κ³ μ„œ 마치 κ·Έ μ•Œκ³ λ¦¬μ¦˜μ„ μ™„μ „νžˆ μ΄ν•΄ν•œ λƒλ¬΄ν„±λŒ€κ³  코딩에 λ“€μ–΄κ°”λ‹€κ°€ 정닡이고 뭐고 μ™„μ „νžˆ μ—‰μΌœλ²„λ ΈμŠ΅λ‹ˆλ‹€. κ²°κ΅­ μ²˜μŒλΆ€ν„° λ‹€μ‹œ μ½”λ”© 이전 단계뢀터 차근히 μ€λΉ„ν•˜μ—¬ 겨우 문제λ₯Ό ν•΄κ²°ν•  수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€. μ½”λ”© μ΄μ „μ˜ μ—¬λŸ¬ ν”„λ‘œκ·Έλž˜λ° λ‹¨κ³„λŠ” ν•¨λΆ€λ‘œ κ±΄λ„ˆλ›Έ 단계가 μ•„λ‹ˆλž€ 것을 λ‹€μ‹œ ν•œλ²ˆ 뼈 속 깊이 κΉ¨λ‹¬μ•˜μœΌλ©° μ„±λŠ₯을 μœ„ν•΄ μ‹œκ³΅ κ΅ν™˜ 법칙을 λ‚˜λ¦„λŒ€λ‘œ μ μš©ν•΄ λ³΄μ•˜λŠ”λ° κ·Έ 효과의 상당함을 κ²½ν—˜ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

  • μ•Œκ³ λ¦¬μ¦˜μ΄ μ€‘μš”ν•˜λ‹€
  • λ””μžμΈλ„ μ€‘μš”ν•˜λ‹€.
  • μ„±λŠ₯을 λ†’μ΄κ³ μž ν•œλ‹€λ©΄ μš°μ„  μ‹œκ³΅ κ΅ν™˜ 법칙을 μ΄μš©ν•˜μž.
    μ‹œκ³΅ κ΅ν™˜ 법칙이 뭐죠?
    μ„±λŠ₯μ΄λž€ 것을 크게 μˆ˜ν–‰ μ‹œκ°„(ζ™‚)κ³Ό μˆ˜ν–‰μ‹œ ν•„μš”ν•œ λ©”λͺ¨λ¦¬(η©Ί)λΌλŠ” 2κ°€μ§€ μΈ‘λ©΄μ—μ„œ λ³Έλ‹€λ©΄ λ©”λͺ¨λ¦¬μͺ½μ˜ μ„±λŠ₯을 ν¬μƒν•΄μ„œ μˆ˜ν–‰ μ‹œκ°„μ„ λŒμ–΄μ˜¬λ¦¬λŠ” 것을 λ§ν•©λ‹ˆλ‹€. 즉, 자주 쓰일 것 같은 계산 κ²°κ³ΌλŠ” 맀번 κ³„μ‚°ν•˜μ§€ μ•Šκ³  λ©”λͺ¨λ¦¬μ— λ‹΄μ•„λ‘κ±°λ‚˜ 외뢀에 μ €μž₯ν–ˆλ‹€κ°€ κ°€μ Έμ˜€λŠ” 식이 λ˜λŠ” κ±°μ£ . 저같은 경우 문제λ₯Ό ν’€κΈ° μœ„ν•΄ 체슀판 μœ„μ— ν€Έ ν•˜λ‚˜κ°€ 놓일 λ•Œλ§ˆλ‹€ λ‹€μŒ 퀸이 놓일 수 μžˆλŠ” "κ°€λŠ₯ν•œ 자리λ₯Ό 계산"ν•΄μ„œ κ·Έ λ‹€μŒ 퀸을 λ°°μΉ˜ν•˜λŠ” 방식을 μ‚¬μš©ν–ˆμŠ΅λ‹ˆλ‹€. 이 λ•Œ "κ°€λŠ₯ν•œ 자리λ₯Ό 계산"ν•œ κ²°κ³Όλ₯Ό λ©”λͺ¨λ¦¬μ— 담아두고 계속 μ΄μš©ν•˜μ˜€μ£ . 참고둜 이 μš©μ–΄μ™€ κ°œλ…λ“€μ€ κΉ€μ°½μ€λ‹˜μ΄ λ§ˆμ†Œμ— κΈ°κ³ ν•˜μ‹  파이썬 κ΄€λ ¨ κΈ°μ‚¬μ—μ„œ λΉ„μŠ€λ€λ¦¬ μΈμš©ν•œ 것 μž…λ‹ˆλ‹€. μΈμš©μ΄λž€ 본래 κ·Έ λ‚΄μš©μ„ μ •ν™•νžˆ 전달해야 ν•˜λŠ”λ° -_-;;; λ§ˆμ†Œ 기사λ₯Ό 직접 μ°Έκ³ ν•΄λ³΄μ‹œκΈ° λ°”λžλ‹ˆλ‹€ :)

  • See Also λ§ˆμ†Œ2001λ…„ 4μ›” About Python 기사 - 파이썬 μ΅œμ ν™”λ‘ 

μ†ŒμŠ€ 파일

QueensProblem.java

~cpp 
public class QueensProblem
{
	// to run, prompt>java QueensProblem x
	public static void main(String[] args)
	{
		QueensProblem problem = new QueensProblem(Integer.parseInt(args[0]));
		long start = System.currentTimeMillis();
		problem.locate(0);
		System.out.println("μ†Œμš”μ‹œκ°„(ms) = " + String.valueOf(System.currentTimeMillis() - start));
		System.out.println("κ°€λŠ₯ν•œ ν•΄λ‹΅ = " + String.valueOf(problem.getSuccessNum()));
	}

	public QueensProblem(int queensNum)
	{
		this.queensNum = queensNum;
		board = new Chessboard(queensNum);	
	}

	public int getSuccessNum()
	{
		return successNum;
	}
	
	public boolean locate(int index)
	{
		if (index == queensNum)
		{
			++successNum;
		//	System.out.println("성곡 " + String.valueOf(++successNum));
		//	System.out.println(board);
			return true;
		}
	
		Chessboard.PointList points = board.getAvailablePoints();
		Point point = null;
		while ((point = points.nextPoint()) != null)
		{
			if(point.getY() == index + 1)
				return false;

			Queen queen = new Queen(point);
			board.locate(queen);
			if (locate(index + 1))
			{
		//		return true;
				board.rollback();
			}
			else
			{
				board.rollback();
			}
		}
		
		return false;
	}	

	private Chessboard board;
	private int queensNum;
	
	private int successNum;
}

Chessboard.java

~cpp 
import java.util.*;

public class Chessboard
{
	public Chessboard(int size)
	{
		this.size = size;
		queens = new Stack();
		availablePointsStack = new Stack();
		List availablePoints = new ArrayList();
		for (int y = 0; y < size; ++y)
			for (int x = 0; x < size; ++x)
				availablePoints.add(new Point(x, y));
		availablePointsStack.push(new PointList(availablePoints));
	}

	public void locate(Queen queen)
	{
		List availablePoints = new ArrayList();
		List points = ((PointList)availablePointsStack.peek()).getPoints();
		Iterator pointsIter = points.iterator();
		while (pointsIter.hasNext())
		{
			Point point = (Point)pointsIter.next();
			if (!queen.canAttack(point))
				availablePoints.add(point);
		}
		
		queens.push(queen);
		availablePointsStack.push(new PointList(availablePoints));
	}

	public void rollback()
	{
		queens.pop();
		availablePointsStack.pop();
	}

	public PointList getAvailablePoints()
	{
		return (PointList)availablePointsStack.peek();
	}	

	public String toString()
	{
		StringBuffer buff = new StringBuffer();
		Iterator iter = queens.iterator();
		while (iter.hasNext())
		{
			Queen queen = (Queen)iter.next();
			buff.append(queen.getPoint().toString());
			buff.append("\n");
		}

		return buff.toString();
	}
	
	private int size;
	private Stack queens;
	private Stack availablePointsStack;

	public static class PointList
	{
		public PointList(List points)
		{
			this.points = points;
			index = 0;
		}
		
		public Point nextPoint()
		{
			Point point = null;
			if (index < points.size())
			{
				point = (Point)points.get(index);
				++index;
			}
			return point;
		}

		public List getPoints()
		{
			return points;
		}

		public String toString()
		{
			StringBuffer buff = new StringBuffer();
			Iterator iter = points.iterator();
			while (iter.hasNext())
			{
				Point point = (Point)iter.next();
				buff.append(point);
				buff.append("\n");
			}

			return buff.toString();
		}


		private int index;
		private List points;
	}
}

Queen.java

~cpp 
public class Queen
{
	public Queen(Point point)
	{
		this.point = point;
	}

	public boolean canAttack(Point p)
	{
		return point.equalsX(p) || point.equalsY(p) || point.isLocatedCrossly(p);
	}

	public Point getPoint()
	{
		return point;
	}

	private Point point;
}

Point.java

~cpp 
public class Point
{
	public Point(int x, int y)
	{
		this.x = x;
		this.y = y;
	}

	public boolean equalsX(Point point)
	{
		return point.x == x;
	}

	public boolean equalsY(Point point)
	{
		return point.y == y;
	}

	public boolean isLocatedCrossly(Point point)
	{
		int diffX = Math.abs(point.x - x);
		int diffY = Math.abs(point.y - y);

		return diffX == diffY;
	}

	public int getX()
	{
		return x;
	}

	public int getY()
	{
		return y;
	}

	public String toString()
	{
		return "(" + String.valueOf(x) + ", " + String.valueOf(y) + ")";
	}

	private int x;
	private int y;
}





Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:23:12
Processing time 0.0134 sec