StudyServer
web, server, java, spring 등.. 공부한 것을 기록하는 장소 입니다. 공부하면서 정리하였기 때문에 틀린 내용이 있을 수 있습니다. 이야기 해주시면 수정하겠습니다.

Star Draw(별 그리기2)

2018-10-31 00:00:00 +0000

문제

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

결과

       *
      **
     ***
    ****
   *****

문제풀이

pos = count. // pos는 별* 그릴 위치 시작점을 의미한다

if(j >= pos) print(“*”) // j가 pos 위치보다 크거나 같으면 *을 그린다

else print(“ “)

다음행으로 이동하면 별 위치가 한칸 앞으로 당겨지므로 –pos 를 한다

소스

mport java.util.Scanner;
public class Main {
     public static void main(String[] args) {         
//       *
//      **
//     ***
//    ****
//   *****
     Scanner sc = new Scanner(System.in);
     int count = sc.nextInt();
     int pos = count;
     for(int i = 0; i < count; ++i)
     {
           for(int j = 1; j <=count; ++j)
           {
                if(j >= pos)
                {
                      System.out.print("*");
                }
                else
                {
                      System.out.print(" ");
                }
           }
           System.out.print("\n");
           --pos;
     }
     }
}

Star Draw(별 그리기1)

2018-10-31 00:00:00 +0000

문제

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

문제풀이

starCount는 행(row) 겸 *갯수를 의미한다

다음 행으로 갈때마다 *개수가 1씩 늘어나므로 row와 같다

소스

package algo;
import java.util.Scanner;
public class Main {
     public static void main(String[] args) {         
     Scanner sc = new Scanner(System.in);
     int count = sc.nextInt();
     
     for(int starCount = 1; starCount <= count; ++starCount)
     {
           for(int col = 1; col <= starCount;++col)
           {
                System.out.print("*");
           }
           System.out.print("\n");
     }
    }
}

Loop(While, For)

2018-10-30 00:00:00 +0000

반복문

while

  • (세로)초기식 -> 조건식 -> 명령문 -> 증감식 : 수직방향으로 처리

do while

  • 명령을 먼저 실행 후 나중에 조건 체크. 적어도 한번은 실행. 어떤명령을 실행했는데 될 때까지 계속 실행하도록 하고 싶을 때 사용

while

  • (세로) 초기식 -> 조건식 -> 명령문 -> 증감식 : 수평방향으로 처리

break outerloop

    • 중첩 for문에서 사용. 내부 for문에서 중첩 for문 밖으로 나가게 해주는 키워드
  • 중첩 for문 위에 outerloop 라벨을 붙여준다
  • 중첩 for문을 탈출하고 싶은 위치에 break outerloop를 사용한다
  • while문 중첩 시에도 탈출한다
  • outerloop 라벨 추가 다음에 바로 반복문이 있어야 한다.(안그러면 에러남)
outerloop:
             for(int i = 0; i < 3; ++i)
             {
                    for(int j = 0; j < 3; ++j)
                    {
                           if(j == 1)
                                 break outerloop;
                           
                           System.out.println("print!!");
                    }
                    System.out.println(i+"바퀴");
              }

결과

print!!

continue outerloop

  • 중첩 for문에서 사용.
  • 내부for문에서 continue 사용 시 내부 증감연산으로 간다
  • 내부for문에서 continue outerloop 사용 시 외부 증감 연산으로 간다
outerloop:
             for(int i = 0; i < 3; ++i)
             {
                    for(int j = 0; j < 3; ++j)
                    {
                           if(j == 1)
                                 continue outerloop;
                           
                           System.out.println("print!!");
                    }
                    System.out.println(i+"바퀴");
             }

결과 print!! print!! print!!

자바 데이터 타입, 데이터 연산

2018-10-30 00:00:00 +0000

Java의 플랫폼 독립성

  • ‘플랫폼 독립성’은 특정 플랫폼에 의존적이지 않다는 것을 의미
  • Java는 컴파일하면 .class 파일을 생성하고 JVM 위에서 실행된다. 그래서 운영체제가 달라도 실행가능하다
  • 하지만 C++은 컴파일하면 어셈블리어->기계어->실행파일이 나오는데 해당 플랫폼의 어셈블리어에 맞게 변환되어 다른 플랫폼에선 실행이 안된다
  • 예를 들어 windows 실행파일은 linux에서 사용안되고 그 반대도 마찬가지 이다
  • Java의 단점은 JVM 위에 있어서 느리다. 그래서 플랫폼과 상관없는 웹에서 사용된다

데이터 기본 리터럴

  • 10 => int
  • 3.14 => double
  • ’ ‘ => char
  • ” “ => String ( 기본적인 자료형이 아니다. char로 문자열 사용하기 불편해서 사용 )
  • float value = 3.14; 하면 에러가 나서 3.14f처럼 형변환을 해야한다.
  • 그런데 short, long 변수에 정수값을 줄 땐 형변환 에러 안나는데 왜 float만 난다.
  • 아마 소수점끼리 형변환하면 소실되는 값이 있으니까 에러 내는 듯 하다.
  • double에 정수 대입은 에러 안남
double d = 3.14+1;

System.out.println(d);
if(a == 4.14)
{
	System.out.println("같다");
}
else
{
	System.out.println("다르다");			
}
  • 결과는 다르다 출력.
  • d를 출력하면 4.140000000000001 이 나온다

데이터타입에 따른 출력 결과

데이터타입에 따라 결과가 달라질 수 있다

char c = 'A'
System.out.println(c); 결과 A
System.out.println((int)c); 결과 65

소수점 둘째자리까지 실수를 표현하고 싶다면?

System.out.printf("평균:%.2f", avg);

casting(형변환)

  • byte < short < int < long < float < double < String
  • 큰자료형 = 큰 자료형+작은 자료형(묵시적 형변환)
  • 큰자료형과 작은자료형을 더하면 큰 자료형이 된다.
  • 아래처럼 연산결과를 작은자료형으로 받으면 에러난다.
int n1 = 10;
double n2 = 3.14;
int re = n1+n2;
		
short b1 = 10000;
byte a = 1 + b1;

casting String <=> 정수형, 실수형

  • 모든 정수는 String과 연산하면 String이 된다
String n3 = 10 + 5 + "0";
System.out.println(n3);

결과 150

final 변수

  • 변수에 값을 딱 한번만 대입할 수 있다(값변경x)

증감 연산자 우선순위

int n7 = 10;
int n8 = 2;
int n9 = n7-- - n8;		// 10 - 2 한다음 n7은 1뺀다
System.out.println(n9);
  • 연산자 우선순위대로 연산한다.
  • –가 모든 연산이 끝난 후 실행하는 후위연산자이기 때문에 10 - 2 를 해서 n9는 8이 되고 n7은 9가 된다

String 비교

  • String 값이 같은지 비교할 땐 == 연산자가 아닌 String.equals 함수 사용
  • == 연산자는 주소값이 같은지 비교
String str1 = "abc";
String str2 = "abc";
  • str1 == str2는 true이다. 처음 abc 글자를 str1에 대입하면 “abc” 단어가 없으므로 등록된다.
  • str2값에 “abc”를 넣으면 메모리에 “abc” 글자가 있는지 찾아보고 있으므로 같은 메모리 주소를 전달한다.

시계방향 달팽이 그리기

2018-10-30 00:00:00 +0000

문제

시계방향으로 달팽이를 그려라

결과값

   1    2    3    4    5
   16   17   18   19    6
   15   24   25   20    7
   14   23   22   21    8
   13   12   11   10    9
   

참고

http://gompangs.tistory.com/24

  • 방향을 바꿀 때 마다 x, y열의 그리기는 한칸 씩 줄어든다.
  • 방향을 바꾸는 변수 필요

문제풀이


package algo;

public class banggle {

	public static void main(String[] args)
	{
		int count = 5;							// 한줄에 몇번 돌 것인가
		int max_size = count;
		int value = 0;
		int arr[][] = new int[count][count];
		int x = -1;								// 좌표 0,0 ~ 0,4 까지 그리고 나서 다음 y줄을 그리려고 하면 0,5 좌표라서 												  // 되어서 array size 초과 에러가 되므로
												// 배열초과 에러난다. x시작값이 -1인게 중요하다.
		int y = 0;
		
		int pos = 1;
		for(int i = 0; i < max_size; ++i)
		{	
			for(int xx = 0; xx < count; ++xx)
			{
				x+=pos;							// pos는 방향을 정하는 변수다
				++value;
				arr[y][x] = value;				
			}
			
			--count;							// 한줄에 그리는 횟수를 줄인다.
			
			for(int yy = 0; yy < count; ++yy)
			{
				y+=pos;
				++value;
				arr[y][x] = value;
			}
			
			// 방향 바꾸기
			pos = (pos == 1) ? -1 : 1;
			
		}
			
		// 2차원 배열 출력
		for(int i = 0; i < max_size; ++i)
		{
			for(int j = 0; j < max_size; ++j)
			{
				System.out.printf("%5d", arr[i][j]);
			}
			
			System.out.print("\n");
		}
	}

}

Posts

subscribe via RSS