본문 바로가기
정보처리기사

정보처리기사 실기 프로그래밍 문제 Java 기출 풀이 모음

by 셈이 2022. 10. 14.
728x90
반응형

2022년 정보처리기사 실기 2회차를 보고 느낀 점은 '코딩 문제는 일단 다 맞아야겠다' 였어요. 용어를 묻는 문제가 너무 지엽적으로 나와서 답을 적어내기가 어렵더라고요.

 

특히나 2020년도 이후에 ncs 기반 개편 이후, 코딩 문제가 8문제 까지도 나오고 있습니다. 60점이 합격점수고 12문제만 맞으면 되니까, 코딩 문제 8문제 다 맞추고 다른 거 4개 더 맞겠다 라는 생각으로 공부를 해야 하는 것 같아요.

 

코딩 문제는 C언어, 자바, 파이썬, SQL 이렇게 4개의 부분에서 나옵니다. 저는 정리하면서 공부가 되는 편이어서, 하나 하나 기출문제와 모의고사를 분석해 보려고 합니다. 

 

 

C언어와 관련된 기출문제 풀이는 제가 블로그에 따로 포스팅해 두었습니다!

 

정보처리기사 실기 프로그래밍 문제 C언어 기출 모음

정보처리기사 시험을 보고 난 뒤 느낀점은 '20문제 중에 코딩 문제는 일단 다 맞아야겠다' 였어요. 용어를 서술하는 문제는 너무 지엽적으로 나와서 맞추기가 어렵더라구요. 특히나 2020년도 이후

roadtofree.tistory.com

 

 

 

 

정보처리기사 실기 Java 기출 문제 (2020년~ 2022년도/ 9회분)

대부분의 문제가 결과값이나 빈칸에 들어갈 알맞은 말을 쓰는 것이여서 문제 부분은 생략하겠습니다.

 

 

 

1.  2022년 2회차 7번

 

public static void main(String args[])
{ 
    int i = 3; int k = 1;  
    switch(i) 
    { 
        case 1: k += 1; 
        case 2: k++; 
        case 3: k = 0;
        case 4: k += 3;
        case 5: k -= 10;
        default: k--;  
    } 
    System.out.print(k);  
    }

 

더보기

답) -8

 

switch 문은 case에 해당하는 로직 이후 모든 case를 실행합니다.

break를 만나면 switch문을 중단하지만, 해당 문제에는 break가 없습니다.

또 주어진 casw가 없는 경우 default문이 실행됩니다.

 

그래서 i가 3인 것 부터시작하면 k=0 / k=3/ k= -7/ k= -8

 

∴ k=-8

 

 

 

2.  2022년 2회차 8번

struct A
{
   int n; int g;      
};  
      
int main()
{ 
	A a = new A[2]
   
    for(i=0; i <2; i++) 
    { 
    	a[i].n = i;
        a[i].g=i+1;
    } 

	System.out.printf(a[0].n + a[1].g);   
}

 

더보기

답) 2

struct 나 class 는 설계도이고, 이 설계도를 구체적인 제품으로 만들어야 합니다. 이때 사용하는 키워드가 바로 new 입니다.

 

new를 이용하여 만든 변수를 a에 담고 있는 거죠.

 

 A[2]는 아래와 같은 배열을 의미합니다.   

 

a[0] a[1] a[2]

a[0].n = 0 / a[0].g = 1 / a[1].n =1 / a[1].g =2

 

∴ 0+2 =2

 

 

 

 

3.  2022년 2회차 17번

public class Conv
{  
    public Conv(int a) 
    {
       this.a = a; 
    }  
    int func() 
    { 
    	int b =1;  
	for (int i=1; i<a; i++){  
	b = a * i + b  
    } 
    return a +b; 
	} 
    int a;  
} 

public static void main(String[] args)
{ 
    Conv obj = new Conv(3); 
    obj.a=5;  
    int b = obj.func(); 
    system.out.print(obj.a + b); 
    i 
 }

 

더보기

답) 61

 

Conv(3)을 통해서 a=3 이 되었지만, 바로 뒤에 obj.a=5 를 통해서 a=5가 되었습니다.

 

그래서 메소드 func()를 풀어보면 for( int i=0; i<5 ; i++)가 됩니다.

 

b= 5*1 + 1 = 6

b= 5*2 + 6 = 16

b=5*3 + 16 = 31

b= 5*4 + 31 = 51

 

그런데 a+ b 값을 return 하라고 했으니, return값은 56

 

int b = obj.func() 니까 b의 최종 값은 56

 

obj.a + b = 5+ 56 = 61

 

 

 

 

 

4.  2022년 1회차 3번

 

class A 
{
    int a;
    int b;
}
  
public class Main 
{ 
    static void func1(A m)
    {
    	m.a *= 10;
	}
  
    static void func2(A m)
    {
        m.a += m.b;
    }
  
    public static void main(String args[])
    {
        A m = new A();

        m.a = 100;
        func1(m);
        m.b = m.a;
        func2(m);

        System.out.printf("%d", m.a);
    }
}

 

더보기

답) 2000

 

m.a = 100 * 10 = 1000 = m.b

m.a + m.b = 2000

 

 

 

 

 

5.  2022년 1회차 11번

Q) 밑줄에 들어갈 알맞은 말을 적으시오

class Car implements Runnable
{
  int a;
  
  public void run()
  {
     system.out.println("message")
  }
}
  
public class Main
{
  public static void main(String args[])
  {
    Thread t1 = new Thread(new __________());
    t1.start();
  }
}

 

더보기

답) Car

 

Class라는 설계도를 new를 이용해 객체를 생성하기 때문에, new 뒤에는 클래스 이름이 옵니다.

 

 

 

 

6.  2021년 3회차 1번

 

class Connection {
    private static Connection _inst = null;
    private int count = 0;

    static public Connection get() 
    {
        if(_inst == null) 
        {
            _inst = new Connection();
            return _inst; 
        }
        return _inst;
    }
    public void count() { count ++; }
    public int getCount() { return count; }
}
 
public class testcon 
{
  public static void main(String[] args) 
  {
    Connection conn1 = Connection.get();
    conn1.count();
    Connection conn2 = Connection.get();
    conn2.count();
    Connection conn3 = Connection.get();
    conn3.count();
    
    System.out.print(conn1.getCount());
  }
}

 

더보기

답) 3

Connection.get() 메소드를 실행해보면 _in 이 null 일 때 _inst값을 return 하겠다는 뜻입니다.

근데 _in 값이 Null이니까 _in이라는 객체를 생성하여 conn1에 담겠다는 뜻입니다.

 

conn1.count() 에 count++ 하여 count는 1

 

근데 이번에는  _in이 Null이 아니니까 _inst값을 retrrn 즉 기존에 가지고 있던 _in을 넘긴다는 뜻입니다.

 

conn2.count()에 count++ 하여 count는 2

 

conn3.count()에 count++ 하여 count는 3

 

즉, 변수 conn1, conn2, conn3 은 모두 객체 _in을 담고 있는 겁니다.

 

그래서 conn1.getCount()를 하면 count 값인 3 출력.

conn2.getCount()를 해도 3 출력

conn3.getCount()을 해도 3이 출력됩니다.

 

 

 

 

 

7.  2021년 3회차 11번

 

public class testco 
{
     public static void main(String[] args) 
     {
           int a = 3, b = 4, c = 3, d = 5;
           if((a == 2 | a == c) & !(c > d) & (1 == b ^ c != d)) 
           {
               a = b + c;
                   if(7 == b ^ c != a) { System.out.println(a); }
                   else { System.out.println(b); }
           } 

           else
           {
               a = c + d;
               if(7 == c ^ d != a) { System.out.println(a); }
               else { System.out.println(d); }
           }
      }
}

 

더보기

답)7

 

(a == 2 | a == c)

3==2 or 3==3 / F or T = T

 

 !(c > d)

3>5 는 F 의 부정이니까 T

 

(1 == b ^ c != d)

1==4 xor 3!=5 / F xor T = T

T&T&T 가 되는 거니까 if문 실행하면 a=4+3=7

 

(7 == b)

7==4  / F

 

(c != a)

3!=3 / F

 

F^F / xor은 다르면 T 같으면 F 니까 T

 

그래서 a를 출력해서 답은7

 

 

 

 

 

8.  2021년 2회차 17번

 

public class Test 
{
   public static void main(String[] args)
   {
      system.out.print(test.check(1));
   }
   
   (____________)  String check (int num) 
   {
      return (num >= 0) ? "positive" : "negative";
   }
}

[출력결과]
positive

 

더보기

답) static

 

public static String A() 

 

return out

 

이라는 메소드를 보았을때 String은 반환값의 변수 out의 데이터형을 뜻합니다.

 

그걸 static이라는 메모리에 저장한다. 라는 뜻입니다. 메모리 구조할때 heap, static, stack 이렇게 있잖아요.

그래서 static 메소드는 객체 생성 없이 호출 할 수 있습니다.

 

문제에서 Test a = new Test() 와 같은 객체 생성을 한 코드가 없기 때문에, 객체 생성 없이 메소드를 호출할 수 있는 static이 정답입니다.

 

public, private, protected는 접근 제한자입니다.

 

 

 

 

 

9.  2021년 2회차 19번

 

public class over1 
{
	public static void main(String[] args)
    {
    	ovr a1 = new ovr1();
        ovr a2 = new ovr2();
        System.out.println(a1.sun(3,2) + a2.sun(3,2));
    }
    
    int sun(int x, int y)
    {
    	return x + y;
    }
}

class ovr2 extends ovr1 
	{

	int sun(int x, int y)
    {
    	return x - y + super.sun(x,y);
    }
}

 

더보기

답) 11

a1.sun(3,2) = 3+2 =5

 

a2.sun(3,2)= 3-2 + 3+2 =6

 

여기서 super()은 상위 클래스를 호출하는 예약어입니다.

 

상속과 관련된 예약어 4가지

 

1. extends - 부모의 모든 권한을 가져오는 것 (상속+내용까지 모두) 클래스 한 개만 상속 가능.

 

2. implements​ - 인터페이스 (상속은 하지만, 내용은 비어있음, 추상) 다중 상속가능.

 

3. interface​ - 일종의 추상클래스, 상속을 목적으로 만들어지며 다중상속가능상수와 추상메소드만​ 가짐 (내용선언안함) 상속은 implements 로 한다.

 

 interface 인터페이스이름 { public static final 타입 이름 = ; public abstract 메소드이름(매개변수); }

 

4. Super - 상위 클래스의 생성자를 호출할때 또는상위 클래스의 멤버변수 또는 메소드에 접근할때 사용됨. ​super 로 호출하기 위해선 해당 멤버변수,메소드 가 protected,public 이여야함.

 

 

 

 

 

 

10.  2021년 1회차 7번

 

public class good{
	public static void main(String[] args){
    	int[][]arr = new int[][]{{45,50,75},{89}};
        System.out.println(arr[0].length);
        System.out.println(arr[1].length);
        System.out.println(arr[0][0]);
        System.out.println(arr[0][1]);
        System.out.println(arr[1][0]);

 

더보기
답) 
3
1
45
50
89


0 1
47 50 75 89

주의해야할점은 println은 개행을 하면서 출력을 하기때문에 정답을 쓸때도 세로로 적어주셔야 합니다.

 

 

 

 

11.  2021년 1회차 17번

 

public class good {
	public static void main(String[] args)
    {
        int i, j;
        for(j=0, i=0; i<=5; i++)
        {
            j+=i;
            System.out.print(i);
            if(i==5)
            {
                System.out.print("=");
                System.out.print(j);
            }
            else
            {
            System.out.print("+");
            }
        }
     }
 }

 

더보기

답) 1+2+3+4+5=15

 

답 작성하실때 1+2 ... 이렇게 더하기(+), 등호(=) 모두 작성하셔야 합니다. 그냥 15만 적으면 틀린 답입니다.

 

 

 

 

12.  2020년 4회차 5번

 

class good 
{
	public static void main (String[] args) 
    {
    	int[]a = new int[8];
        int i=0; int n=10;
        
        while (  1.  ) 
        {
        	a[i++] = (  2.  );
            n /= 2;
        }
        
        for(i=7; i>=0; i--)
        {
         System.out.print(a[i]);
        }
     }
  }
  
  출력결과 : 00001010

 

더보기

답)

1. n>0 or n>= 1 or i<8 or i <=7 (넷중 아무거나 써도 정답)

2. n%2

 

출력문을 보시면 배열 a[i]를 출력하는 것을 볼 수 있습니다. 그런데 조건분을 보면 7부터 시작해서 i--, 한개씩 줄어듭니다. 즉 배열을7번부터 출력을 하라는 뜻입니다.

 

new를 통해 8칸인 배열을 만들고, 그 안에 while문의 결과를 담습니다. 

 

while문을 살펴보면, 조건이 실행되는 동안 n을 2로 나누라고 합니다. 대입해봅시다.

 

10 /2 = 5 ...0

5/ 2 = 2 ...1

2/ 2= 1...0

1/2 = 0...1

 

여기서 나머지 값을 보시면 출력값인 1010과 같은 숫자를 가진걸 알 수 있습니다. 그래서 while문에서는 2로 나눈 나머지 값을 조건으로 지정해야하는구나! 라고 유추 할 수 있고, 2번의 답은 n%2가 되는 겁니다.

 

그리고 배열이 8칸이 만들어졌기 때문에 while 문이 8번실행될 수 있는 조건으로 만들면 1번의 정답입니다. i를 기준으로 한다면 i<8 or i <=7, n을 기준으로 한다면 n>0 or n>= 1 가 됩니다.

 

 

 

 

 

 

 

13.  2020년 4회차 6번

[출력 결과]

1 4 7 10 13

2 5 8 11 14

3 6 9 12 15 

public class good 
{
	public static void main(String[] args) 
    {
    	int[][]a = new int[(1.)][(2.)];
        for(int i = 0; i <3; i++)
        {
            for(int j=0; j < 5; j++)
            {
            	a[i][j] = j*3+(i+1);
                System.out.print(a[i][j]+"");
             }	
        System.out.println();
        }
     }
}

 

더보기

1. 3 / 2. 5 

 

자바의 배열과 초기화를 살짝 설명해보자면 아래의 형태를 가집니다.

 

1차원배열 : int arr [] = { v1, v2}

2차원배열 : int arr [][]= new int [][]

 

for문을 살펴보면 3행5열의 배열이기 때문에 1번과 2번에 각각 3과 5를 넣어줍니다.

 

 

 

 

 

14.  2020년 4회차 19번

 

class parent
{
	public int compute(int num)
    {
    	if(num <=1) return num;
        return compute(num-1) + compute(num-2);
    }
 }
 
 class Child extends parent 
 {
 	public int compute(int num)
    {
    	if(num<=1) return num;
        	return compute(num-1) + compute(num-3);
    }
}
   
  class good
  {
  	public static void main (String[] args)
    {
        parent obj = new Child();
        System.out.print(obj.compute(4));
    }
 }

 

더보기

답)1

 

상속은 상위 클래스의 기능을 하위클래스에 물려주는기능입니다. 그렇다고 하위 클래스가 상위클래스를 그대로 사용해야 할 필요는없습니다.

 

하위클래스에서 상위클래스와 동일한 메소드를 사용하면 상속으로 물려받은 기본동작을 변형하는 효과를 갖게 됩니다. 이렇게 하여기본동작은 폭넓게 적용되고, 변경된 동작이 더 높은 우선순위를 가집니다. 이것을 overrinding이라고 합니다.

 

overriding에는 3가지 조건이 있습니다. 상위클래스와 하위클래스의 메소드의 이름, 데이터타입, 리턴값이 같아야 합니다.

 

overriding을 하게 되면 하위클래스가 실행되는 순간, 상위클래스는 출력이 되지 않습니다.

 

코드를 분석해보면 child는 parent로 부터 상속을 받고 있고 compute()라는 같은 메소드를 쓰고 있어 overriding이 됩니다.

 

근데 아까 오버라이딩이 되려면 return값이 같아야 한다고 했는데 지금은 retrun값이 다른거 아니야? 라고 생각할실 수 도 있는데, 코드를 자세히 보시면 해당 return은 조건문 if의 retuen입니다.

 

compute(num-1) + compute(num-3);를 실행하면

 

com(3) + com(1) = com(2) + com(0) +1 = com(1) + com(-1) + 0 +1 = 1+-1+0+1 = 1

 

따라서 답은 1

 

 

 

 

 

15.  2020년 3회차 15번

 

abstract class vehicle
{
	private String name;
    abstract public String getName(String val);
    public String getName()
    {
    	return "vehicle name:" + name;
    }
	public void setName(String val)
    {
    	name = val;
    }
}

class Car extends Vehicle
{
	public Car(String val)
    {
    	setName(val);
    }
    public String getName(String val)
    {
        return "Car name : " + val;
	}
    public String getName(byte val[])
    {
        return "Car name : " + val;
	}
}

public class good 
{
	public Static void main(String[] args)
    {
        Vehicle obj = new Car("Spark");
        System.out.print(obj.getName());
    }
}

 

더보기

답) Vehicle name : Spark

 

Class 앞에 abstact가 붙으면 우리는 추상클래스라고 합니다. 더 자세히 말하자면, 내부에 추상메소드를 하나 이상 가지고 있는 클래스를 우리는 추상클래스라고 합니다. 즉, 추상 메소드 때문에 추상 클래가 되는 거죠

 

메소드는 헤더와 바디가 있지만, 추상메소드는 헤더만 있습니다. 중괄호{}의 바디가 있으면 오류가 납니다. 즉 나는 바디는 없지만 이런 기능을 가진 메소드야! 라고 말하는 것이 바로 추상메소드입니다. 

 

이렇게 바디가 없기 때문에 추상메소드는 무조건 부모클래스가 되어야 합니다. 즉 반드시 오버라이드 되어야만 하는거죠. 

 

overloading은 매개변수에 따라 메소드의 이름을 다르게 할 필요가 없는것이 가장 큰 특징입니다.  즉 set(1) , set(1,2)처럼 이름이 같아도 매개변수가 다르면 다른 메소드입니다.

 

overriding 과 overloading의 차이가 참 헷갈립니다.  한문장으로 요약하자면 overriding은 부모클래스의 메소드를 변경하고, overloading은 같은 이름, 다른 매게변수를 가진 메소드를 만들 수 있다는 뜻입니다.

 

그래서 출력문의 getName() 과 getName(String val)은 다른 메소드입니다.

 

Vehicle obj = new Car("Spark"); 에서 원래는 vehicle 자리에 car가 오죠. 이 문장의 뜻은 자식의 객체 obj이지만 부모형으로 obj를 활용할 수 있다는 뜻입니다.

 

그래서 답이  Vehicle name : Spark 입니다.

 

 

 

 

 

 

16.  2020년 3회차 17번

 

public class good 
{
	public static void main(String[] args)
    {
        int i=0;
        int sum=0;
        while (i<10)
        {
            i++;
            if(i%2 ==1)
                continue;
            sum += i;
        }
        System.out.println(sum);
        }
}

 

더보기

답) 30

 

반복문을 제어하는 키워드는 2개가 있습니다. breakcontinue.

 

0<i<10 의 범위를 가지고 i=5일때 제어키워드를 만난다고 가정하면

 

break는 만나는 즉시 탈출합니다. 그래서 1,2,3,4를 출력합니다.

continue는 명령이 나타내는 이후의 로직을 수행하지 않습니다. 하지만 반복문을 계속 수행하죠. 그래서 1,2,3,4,6,7,8,9를 출력합니다. 5는 출력 안합니다.

 

그래서 문제에 숫자를 대입해보면

 

i=0일때 i++로 증가해서 i=1이어서 continue

i=1일때 i++로 증가해서 i=2이어서 sum에 저장

.

.

i=9일때 i++로 증가해서 i=10이어서 2+4+6+8+10=30

 

 

 

 

 

 

17.  2020년 2회차 5번

 

class parent
	public void show()
    {
    	system.out.println("Parent");
    }
}

class Child extends Parent
{
	public void show()
    {
    	system.out.println("Child");
    }
}

public class good
{
	public static void main(String[] args)
    {
    	Parent pa = ______________  Child();
        pa.show();
    }
}

 

더보기

답) new

 

자바에서 생성자를 만드는 기본 문법은 A a = new A()입니다. A는 클래서 이름이고, A라는 설계도를 new를 이용해서 인스턴스를 만들고, 그 인스턴스를 변수a에 저장한다는 뜻입니다.

 

 

 

 

 

 

18.  2020년 2회차 19번

 

class A
{
    private int a;
    public A(int a)
    {
    	this.a = a;
    }
    public void display()
    {
    	system.out.println("a=" + a);
    }
}

class B extends A 
{
	public B(int a)
    {
    	super(a);
        super.display();
    }
}


public class good 
{
	public static void main(String[] args)
    {
    	B obj = new B(10);
    }
}

 

더보기

답) a=10

 

<상속과 관련된 예약어 4가지>

 

1. extends 2. implements​ 3. interface 

4. Super - 상위 클래스의 생성자를 호출할때 또는상위 클래스의 멤버변수 또는 메소드에 접근할때 사용됩니다. ​super 로 호출하기 위해선 해당 멤버변수,메소드 가 protected,public 이여야합니다.

 

 

 

 

 

19.  2020년 1회차 13번

 

public class good 
{
	public static void main(String[] args)
    {
    	int i;
        int a[4] = {0,1,2,3};
        for(i=0; i<4; i++)
        {
        	system.out.print(a[i] + " ");
        }
     }
 }

 

더보기

답) 0 1 2 3

 

 


 

 

정보처리기사 실기 프로그래밍 문제 C언어 기출 모음

정보처리기사 시험을 보고 난 뒤 느낀점은 '20문제 중에 코딩 문제는 일단 다 맞아야겠다' 였어요. 용어를 서술하는 문제는 너무 지엽적으로 나와서 맞추기가 어렵더라구요. 특히나 2020년도 이후

roadtofree.tistory.com

 

정보처리기사 실기 프로그래밍 문제 파이썬 기출 풀이 모음

2022년 정보처리기사 실기를 보고 느낀 점은 '코딩 문제를 일단 다 맞자!' 였어요. 용어를 묻는 문제가 너무 지엽적으로 나오기도 했고, 그 많은 방대한 범위를 정확하게 써 내려갈 정도로 공부를

roadtofree.tistory.com

 

정보처리기사 실기 프로그래밍 문제 SQL 기출 풀이 모음

정보처리기사 실기 2회차를 보고, 또 떨어지고 나서 느낀점은 '코딩 문제는 일단 다 맞아야 겠구나!' 였어요. 용어를 묻는 문제가 생각보다 너무 많이 나오기도 했고, 그 내용이 너무 지엽적이여

roadtofree.tistory.com

 

반응형