알고리즘

픽셀 수 세기

개발 초보 2023. 6. 19. 01:00

"구름 에듀의 10주 완성 알고리즘 코딩테스트" 강추

너무 좋습니다. 강사님이 시나리오를 하나씩 분해해서, 더 쉽고 효율적인 방법으로 코드를 작성하십니다. 강의를 통해 배울 수 있다는 것이 감사할 따름입니다. 알고리즘 공부를 고민하고 계신 분들이시라면 위 강의 한 번 찜해보시는 것도 좋을 것 같습니다.

import java.io.*;
import java.lang.*;
import java.util.*;


public class Main {
	public static final Scanner scanner = new Scanner(System.in);

	/**
	 * 왼쪽 아래 좌표가 (x,y)인 픽셀이 반지름 R인 원(정확히는 1사분면)에 포함되는가?
	 * --> 원점과 중점이 같다면, 원을 4등분해서 1사분면의 픽셀 수만 구하면 된다.
	 * @param x
	 * @param y
	 * @param R
	 * @return  포함된다면 true, else false
	 */
	public static boolean isInside(long x, long y, long R){
		long sqd = x*x + y*y;
		return sqd < R*R;
	}

	public static void testCase(int caseIndex) {
		long R = scanner.nextLong();
		long sum = 0;
		long y = R;
		
		for(int x=0; x<=R; x+=1){
			for(; y>=0; y-=1){
				if(isInside(x,y,R)){
					//y := x좌표에서 위에서부터 내려오다가 최초로 원에 포함되는 픽셀의 y 좌표
					long h = y+1;
					sum += h;
					break;
				}
			}
		}

		System.out.printf("#%d\n", caseIndex);
		System.out.println(sum*4);
	}

	public static void main(String[] args) throws Exception {
		int caseSize = scanner.nextInt();

		for (int caseIndex = 1; caseIndex <= caseSize; caseIndex += 1) {
			testCase(caseIndex);
		}
	}

}