메모리 관리

운영체제(OS)의 메모리 관리란 컴퓨터 시스템의 메모리 자원을 효율적으로 관리하고, 프로그램들이 안정적이고 효율적으로 실행되도록 지원하는 기능을 의미합니다.
메모리 관리는 다음과 같은 주요 기능으로 구성됩니다.


1. 메모리 관리의 목적

프로세스 격리

각 프로세스가 서로의 메모리에 영향을 주지 않도록 보호.

효율적인 자원 활용

메모리의 사용을 최적화하여 시스템 성능을 극대화.

빠른 접근

프로그램이 메모리에 빠르게 접근할 수 있도록 지원.

안정성 및 보안

메모리 관리 오류로 인한 시스템 불안정성 및 보안 문제 방지.


2. 메모리 관리 기법

2.1 물리적 메모리와 논리적 메모리

물리적 메모리 (Physical Memory)

실제 RAM의 주소 공간.

논리적 메모리 (Logical Memory)

프로그램이 사용하는 가상 주소 공간.

 

2.2 메모리 할당 방식

연속 메모리 할당 (Contiguous Memory Allocation)

단일 분할: 전체 메모리를 하나의 프로세스가 사용.
다중 분할: 메모리를 여러 프로세스가 연속적으로 사용.
단점: 외부 단편화(프로세스가 종료된 후 남은 작은 메모리 공간)

분할 메모리 할당 (Partitioned Allocation)

고정 분할: 메모리를 크기가 고정된 여러 분할로 나눔.
가변 분할: 필요에 따라 크기가 다른 분할로 나눔.
단점: 고정 분할의 경우 내부 단편화(분할 크기보다 작은 메모리 사용)

 

2.3 가상 메모리 (Virtual Memory)

페이징 (Paging)

메모리를 같은 크기의 페이지로 나누어 관리.
페이지 테이블: 논리적 페이지 번호와 물리적 프레임 번호를 매핑.
장점: 외부 단편화 문제 해결, 메모리 효율성 향상.
단점: 페이지 테이블 관리의 오버헤드.

세그멘테이션 (Segmentation)

메모리를 논리적 단위(세그먼트)로 나누어 관리.
세그먼트 테이블: 세그먼트 번호와 물리적 주소를 매핑.
장점: 프로그램 논리 구조 반영, 효율적 메모리 사용.
단점: 외부 단편화 발생 가능.

페이징과 세그멘테이션 혼합 (Segmented Paging)

세그먼트를 페이지로 나누어 관리.
장점: 세그멘테이션의 논리적 구조와 페이징의 효율성 결합.


3. 메모리 관리 전략

3.1 교체 알고리즘
메모리가 부족할 때, 어떤 페이지를 교체할지 결정하는 방법입니다.

FIFO (First In First Out)

가장 먼저 들어온 페이지를 교체.

LRU (Least Recently Used)

가장 오랫동안 사용되지 않은 페이지를 교체.

LFU (Least Frequently Used)

가장 적게 사용된 페이지를 교체.

Optimal Page Replacement

앞으로 가장 오랫동안 사용되지 않을 페이지를 교체 (이론적 모델).

3.2 스와핑 (Swapping)
프로세스를 메모리에서 디스크로, 디스크에서 메모리로 옮기는 작업.
메모리가 부족할 때 프로세스를 임시로 디스크로 이동시켜 메모리를 확보.

3.3 캐시 메모리
CPU와 메인 메모리 사이에 위치한 고속 메모리.
자주 사용되는 데이터나 명령어를 저장하여 접근 속도를 향상.


4. 메모리 보호

가상 메모리

프로세스가 자신에게 할당된 메모리 외부를 접근하지 못하도록 보호.


5. 메모리 단편화

내부 단편화

고정 크기의 블록 할당 시, 사용되지 않는 공간이 발생.

외부 단편화

가변 크기의 블록 할당 시, 사용되지 않는 작은 블록들이 메모리 공간에 흩어져 발생.

해결 방법

메모리 압축 (Compaction)

메모리 블록을 모아서 연속된 공간을 만듦.

페이징

메모리를 고정 크기의 페이지로 나누어 외부 단편화 문제 해결.

버디 시스템 (Buddy System)

메모리를 2의 제곱 크기로 나누어 효율적으로 할당.


운영체제의 메모리 관리는 복잡하고 중요한 작업으로, 효율적인 메모리 사용과 프로그램 간의 보호를 위해 다양한 기법과 전략이 사용됩니다. 
이러한 기술들은 시스템의 성능과 안정성을 보장하며, 메모리 자원을 최대한 효율적으로 활용할 수 있도록 합니다.

 

프로그래머스의 올바른 괄호 문제를 풀어봤습니다.

 

링크

https://school.programmers.co.kr/learn/courses/30/lessons/12909

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제

 

풀이

괄호가 올바르게 만들어지면 true
괄호가 올바르게 만들어지지 않으면 false

올바른 경우
'()'  true

올바르지 않은 경우
')('  false
')'  false
'('  false


스택을 사용하여 문제를 풀었습니다.
'(' 는 추가시키고 ')' 는 제거하였습니다.
최종적으로 Stack에 아무것도 남아있지 않아야 올바른 괄호라고 판단했습니다.
최초에 ')' 가 먼저 들어오면 올바른 괄호가 아닙니다.

boolean solution(String s) {
    Stack<Character> stack = new Stack<>();
    for (int i = 0; i < s.length(); i++) {
        char c = s.charAt(i);
        if ('(' == c) {
            stack.add(c);
            continue;
        }
        if (')' == c) {
            if (stack.empty()) return false;
            stack.pop();
            continue;
        }
    }
    return stack.empty();
}

 

후기

* 난이도 (5점 만점)

5 : 풀 줄 알면 기업 코딩 테스트는 문제없음.

4 : 평균적인 기업 코딩 테스트의 중간 이상.

3 : 평균적인 기업 코딩테스트의 쉬운 문제.

2 : 알고리즘 문제를 연습하고 있다면 풀 수 있는 문제.

1 : 시간이 오래 걸리지 않고, 누구나 풀 수 있는 문제.

 

프로그래머스 올바른 괄호 문제는 stack, queue 문제로 분류되어 있어서 해당 자료구조를 사용했습니다.

프로그래머스 소수 찾기를 풀어보았습니다.

 

링크

https://school.programmers.co.kr/learn/courses/30/lessons/42839

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제

 

풀이


모든 수의 조합을 만들고 그 중에서 소수 갯수를 반환합니다.
1. 모든 수의 조합 생성
2. 소수 갯수 반환

 


 

1. 모든 수의 조합 생성
createdNumber 함수에 모든 수의 조합을 생성하는 로직을 만들었습니다.
재귀함수를 이용하여 모든 수의 조합을 만들었습니다.

HashSet<Integer> set = new HashSet<>();

public void createdNumber(String com, String numbers) {
    if (!"".equals(com)) set.add(Integer.parseInt(com));
    for (int i = 0; i < numbers.length(); i++) {
        if (!"".equals(com)) set.add(Integer.parseInt(com));
        createdNumber(com + numbers.charAt(i), numbers.substring(0, i) + numbers.substring(i+1));
    }
}

....
....

반복문을 사용하여 모든 경우의 수를 생성합니다.
이 때 중복되는 수가 있으니 set을 이용하여 중복은 제거합니다.

con 값이 공백이 아닐경우 set에 담아줍니다.

if (!"".equals(com)) set.add(Integer.parseInt(com));

이 if문이 두 번 똑같이 나와서 setCom 함수로 따로 만들었습니다.

public void setCom(String com) {
    if (!"".equals(com)) set.add(Integer.parseInt(com));
}
public void createdNumber(String com, String numbers) {
    setCom(com);
    for (int i = 0; i < numbers.length(); i++) {
        setCom(com);
        createdNumber(com + numbers.charAt(i), numbers.substring(0, i) + numbers.substring(i+1));
    }
}

 

 

2. 소수 갯수 반환
중복을 제거한 수의 조합 중에 소수인 수의 갯수를 반환합니다.
스트림의 filter를 이용하여 소수인 수만 count 하였습니다.


// 2. 소수 갯수 반환
return (int) set.stream().filter(n -> isPrime(n)).count();

 

isPrime 함수는 소수인지 판별해주는 함수입니다.

public boolean isPrime(int num) {
    if (num < 2) return false;

    int limit = (int) Math.sqrt(num);

    for (int i = 2; i <= limit; i++)
        if (num % i == 0)
            return false;

    return true;
}

 

전체코드

HashSet<Integer> set = new HashSet<>();

public boolean isPrime(int num) {
    if (num < 2) return false;

    int limit = (int) Math.sqrt(num);

    for (int i = 2; i <= limit; i++)
        if (num % i == 0)
            return false;

    return true;
}

public void setCom(String com) {
    if (!"".equals(com)) set.add(Integer.parseInt(com));
}

public void createdNumber(String com, String numbers) {
    setCom(com);
    for (int i = 0; i < numbers.length(); i++) {
        setCom(com);
        createdNumber(com + numbers.charAt(i), numbers.substring(0, i) + numbers.substring(i+1));
    }
}

public int solution(String numbers) {
    // 1. 모든 수의 조합 생성
    createdNumber("", numbers);

    // 2. 소수 갯수 반환
    return (int) set.stream().filter(n -> isPrime(n)).count();
}

 

후기

* 난이도 (5점 만점)

5 : 풀 줄 알면 기업 코딩 테스트는 문제없음.

4 : 평균적인 기업 코딩 테스트의 중간 이상.

3 : 평균적인 기업 코딩테스트의 쉬운 문제.

2 : 알고리즘 문제를 연습하고 있다면 풀 수 있는 문제.

1 : 시간이 오래 걸리지 않고, 누구나 풀 수 있는 문제.

 

프로그래머스의 소수 찾기 문제는 완전탐색에 대해 공부가 필요한 문제입니다.
완전탐색을 공부하여 모든 수의 조합을 생성하고 소수를 판별하여 갯수만 반환해주면 됩니다.
완전탐색 + 소수판별.

 

링크

https://programmers.co.kr/learn/courses/30/lessons/17682

 

코딩테스트 연습 - [1차] 다트 게임

 

programmers.co.kr


 

문제

 


풀이
  1. 다트 게임은 총 3번의 기회로 구성된다.
  2. 각 기회마다 얻을 수 있는 점수는 0점에서 10점까지이다.
  3. 점수와 함께 Single(S), Double(D), Triple(T) 영역이 존재하고 각 영역 당첨 시 점수에서 1제곱, 2제곱, 3제곱 (점수1 , 점수2 , 점수3 )으로 계산된다.
  4. 옵션으로 스타상(*) , 아차상(#)이 존재하며 스타상(*) 당첨 시 해당 점수와 바로 전에 얻은 점수를 각 2배로 만든다. 아차상(#) 당첨 시 해당 점수는 마이너스된다.
  5. 스타상(*)은 첫 번째 기회에서도 나올 수 있다. 이 경우 첫 번째 스타상(*)의 점수만 2배가 된다. (예제 4번 참고)
  6. 스타상(*)의 효과는 다른 스타상(*)의 효과와 중첩될 수 있다. 이 경우 중첩된 스타상(*) 점수는 4배가 된다. (예제 4번 참고)
  7. 스타상(*)의 효과는 아차상(#)의 효과와 중첩될 수 있다. 이 경우 중첩된 아차상(#)의 점수는 -2배가 된다. (예제 5번 참고)
  8. Single(S), Double(D), Triple(T)은 점수마다 하나씩 존재한다.
  9. 스타상(*), 아차상(#)은 점수마다 둘 중 하나만 존재할 수 있으며, 존재하지 않을 수도 있다.

 

조건을 하나씩 적용하겠습니다.

1. 다트 게임은 총 3번의 기회로 구성된다.

총 3개의 값을 구합니다.

 

2. 각 기회마다 얻을 수 있는 점수는 0점에서 10점까지이다.

입력 받는 점수 범위는 0~10 입니다.

 

3. 점수와 함께 Single(S), Double(D), Triple(T) 영역이 존재하고 각 영역 당첨 시 점수에서 1제곱, 2제곱, 3제곱 (점수1 , 점수2 , 점수3 )으로 계산된다.

S : 1제곱 

D : 2제곱

T : 3제곱

 

4. 옵션으로 스타상(*) , 아차상(#)이 존재하며 스타상(*) 당첨 시 해당 점수와 바로 전에 얻은 점수를 각 2배로 만든다. 아차상(#) 당첨 시 해당 점수는 마이너스된다.

* : 현재 점수, 이전 점수 X 2

# : 현재 점수 X (-1)

 

5. 스타상(*)은 첫 번째 기회에서도 나올 수 있다. 이 경우 첫 번째 스타상(*)의 점수만 2배가 된다.

* : 이전 점수가 없다면 현재 점수만 X 2

 

6. 스타상(*)의 효과는 다른 스타상(*)의 효과와 중첩될 수 있다. 이 경우 중첩된 스타상(*) 점수는 4배가 된다.

4, 5번 조건을 적용해주면 6번도 해결됩니다.

 

7. 스타상(*)의 효과는 아차상(#)의 효과와 중첩될 수 있다. 이 경우 중첩된 아차상(#)의 점수는 -2배가 된다.

4, 5번 조건을 적용해주면 7번도 해결됩니다.

 

8. Single(S), Double(D), Triple(T)은 점수마다 하나씩 존재한다.

3번의 다트 점수 중 S, D, T 은 하나씩 존재하므로 중복 체크 없이 구현하면 됩니다.

 

9. 스타상(*), 아차상(#)은 점수마다 둘 중 하나만 존재할 수 있으며, 존재하지 않을 수도 있다.

3번의 다트 점수 중 *, # 조건이 있을때 적용하면 됩니다.


위의 설명대로 하나씩 구현하면 됩니다.

dartResult : 1S2D*3T

받은 dart 값을 나눠보면

1S

2D* (현재 점수와 이전 점수 X 2) -> 위의 1S도 X 2 

3T

이렇게 볼 수 있고

1^1 * 2

2^2 * 2

3^3

이렇게 완성됩니다.

반환은 3개 점수 합 입니다.


 

위의 로직 구현

class Solution {
	
	/**
	 * 카카오 다트 게임
	 * @param dartResult
	 * @return
	*/
	public int solution(String dartResult) {

		int count	= dartResult.length();
		int bonus 	= 0;
 		int[] arr 	= new int[3];
		int arrCnt 	= 0;
		for (int i = 0; i < count; ++i) {
			char ch =  dartResult.charAt(i);
			if (ch == 49) {
 				if (dartResult.charAt(i+1) == 48) {
					ch = 58;
					++i;
				}
			}
    		
			//옵션 로직
			switch(ch) {
			case '*':
				arr[arrCnt-1] *= 2;
				if (arrCnt-1 > 0) arr[arrCnt-2] *= 2;
				continue;
			case '#':
				arr[arrCnt-1] *= (-1);
				continue;
			}
    		
			//제곱 로직
			switch(dartResult.charAt(i+1)) {
			case 'S':
				bonus = 1;
				break;
			case 'D':
				bonus = 2;
				break;
			case 'T':
				bonus = 3;
				break;
			}
    		
			arr[arrCnt] = (int) Math.round(Math.pow(ch-'0', bonus));
			++arrCnt;
			++i;
		}
		return arr[0]+arr[1]+arr[2];
	}  
}


후기

* 난이도 (5점 만점)

5 : 풀 줄 알면 기업 코딩테스트는 문제 없음.

4 : 평균적인 기업 코딩테스트의 중간 이상.

3 : 평균적인 기업 코딩테스트의 쉬운 문제 .

2 : 알고리즘 문제를 연습하고 있다면 풀 수 있는 문제.

1 : 시간이 오래 걸리지 않고, 누구나 풀 수 있는 문제.

 

난이도는 생각보다 쉬운 편이었으며 문제를 이해하고 천천히 풀면 충분히 풀 수 있다.

어려운 기술이 들어간 것은 없고, 말 그대로 문제 내용을 하나씩 구현한 것이다.

 

 

링크

 

https://programmers.co.kr/learn/courses/30/lessons/17681

 

코딩테스트 연습 - [1차] 비밀지도

비밀지도 네오는 평소 프로도가 비상금을 숨겨놓는 장소를 알려줄 비밀지도를 손에 넣었다. 그런데 이 비밀지도는 숫자로 암호화되어 있어 위치를 확인하기 위해서는 암호를 해독해야 한다. 다

programmers.co.kr


 

문제

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


 

풀이

 

n = 5

arr1 = [9, 20, 28, 18, 11]

arr2 = [30, 1, 21, 17, 28]

배열의 값을 2진수로 변환 후 지도에 표시

2진수는 1과 0으로 구성.

1과 0은 각각 지도 표기 방법으로 바꿔준다.

1 = "#"

0 = " "  (공백)

 

9를 2진수로 변환하면 1001 라는 값이 나온다.

 

20을 2진수로 변환하면 10100

 

위의 9와 20을 2진수로 변환한 값을 보면 자릿수가 다르다.

자릿수를 맞춰주기 위해서는 처음에 받은 n 만큼 자릿수를 채워준다.

그럼 밑의 내용처럼 9를 2진수로 변환한 내용도 바뀐다. 

1001 -> 01001

위의 내용대로 arr1 의 값을 2진수로 모두 변환시키면

arr1 = [9, 20, 28, 18, 11]

이렇게 된다.

이 것을 지도로 변환시키면

이렇게 표기가 된다.

 

 

arr2도 2진수로 변환

arr2 = [30, 1, 21, 17, 28]

이렇게 된다.

이 것을 지도로 변환시키면

이렇게 표기된다.

 

그럼 arr1 지도와 arr2 지도의 # 부분을 합집합으로 보여주면 된다.

비밀지도가 완성되었다.

return 방식은 String 배열에 담아서 해준다.

["#####","# # #", "### #", "# ##", "#####"]

 

 


 

위의 로직 구현

 

class Solution {
    
	/**
	 * 각 배열의 지도 합치기
	 * @param str1
	 * @param str2
	 * @param n
	 * @return
	*/
	public String sumArr(String str1, String str2, int n) {
		StringBuilder sb = new StringBuilder(); 
		for (int i = 0; i < n; ++i) {
			sb.append(((str1.charAt(i) + str2.charAt(i)) == 96)? " ":"#");
		}
		return sb.toString();
	}
	
	/**
	 * 각 배열의 자릿수 채워주기
	 * @param str
	 * @param n
	 * @return
	*/
	public String lpad(String str, int n) {
		int size		= n - str.length();
		StringBuilder sb	= new StringBuilder();
		for (int i = 0; i < size; ++i) {
			sb.append("0");
		}
		return sb.toString()+str;
	}
    
	/**
	 * 카카오 비밀지도
	 * @param n
	 * @param arr1
	 * @param arr2
	 * @return
	*/
	public String[] solution(int n, int[] arr1, int[] arr2) {
		int arrCount	= arr1.length;
		String[] arrStr	= new String[arrCount];
		String[] answer	= new String[arrCount];
        
		for (int i = 0; i < arrCount; ++i) {
			String str		= lpad(Integer.toBinaryString(arr1[i]), n);
			StringBuilder sb	= new StringBuilder();
			for (int j = 0; j < str.length(); ++j) {
				sb.append(str.charAt(j));
			}
			arrStr[i] = sb.toString();
		}
		
		for (int i = 0; i < arrCount; ++i) {
			String str	= lpad(Integer.toBinaryString(arr2[i]), n);
			answer[i]	= sumArr(arrStr[i], str, n);
		}
		return answer;
	}
}


 

후기

* 난이도 (5점 만점)

5 : 풀 줄 알면 기업 코딩테스트는 문제 없음.

4 : 평균적인 기업 코딩테스트의 중간 이상.

3 : 평균적인 기업 코딩테스트의 쉬운 문제 .

2 : 알고리즘 문제를 연습하고 있다면 풀 수 있는 문제.

1 : 시간이 오래 걸리지 않고, 누구나 풀 수 있는 문제.

 

난이도는 생각보다 쉬운 편이었으며 문제를 이해하고 천천히 풀면 충분히 풀 수 있다.

어려운 기술이 들어간 것은 없고, 말 그대로 문제 내용을 하나씩 구현한 것이다.

링크

 

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

 

18406번: 럭키 스트레이트

첫째 줄에 점수 N이 정수로 주어진다. (10 ≤ N ≤ 99,999,999) 단, 점수 N의 자릿수는 항상 짝수 형태로만 주어진다.

www.acmicpc.net


문제

 


풀이

 

* 입력 받는 자릿수는 짝수 형태로만 주어진다.

짝수라는 말은 전체 수가 짝수가 아니라 자릿수가 짝수 입니다.

 

 

첫 번째 예제

123402를 입력 받았을 때

123402 의 자릿수는 6 이라서 짝수.

입력 받은 자릿수를 반반 나누어 합산.

 

*절반 왼쪽

1 + 2 + 3 = 6

 

*절반 오른쪽

4 + 0 + 2 = 6

 

왼쪽과 오른쪽 합이 둘 다 6이므로 결과는 같다.

결과가 같으면 "LUCKY" 라는 문자열 반환.

 

 

 

두 번째 예제

7755 의 자리수는 4 라서 짝수

입력 받은 자릿수를 반반 나누어 합산.

 

*절반 왼쪽

7 + 7 = 14

 

*절반 오른쪽

5 + 5 = 10

 

왼쪽 합 : 14

오른쪽 합 : 10

 

14 와 10은 같지 않음.

왼쪽 합과 오른쪽 합이 같지 않으면 "READY" 라는 문자열 반환.

 


받은 숫자 자릿수를 절반씩 나누어서 합산을 한 뒤 비교해보는 방식으로 풀었습니다.

 

위의 로직 구현

 

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
 
public class Main {
 
	/**
	 * 럭키 스트레이트
	 * @param args
	 * @throws IOException
	 */
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String str 	= br.readLine();
		int count 	= str.length();
		int left	= 0;
		int right	= 0;
		for (int i = 0; i < count/2; ++i) {
			left += (str.charAt(i));
		}
		for (int i = count/2; i < count; ++i) {
			right += (str.charAt(i));
		}
		System.out.println((left == right ? "LUCKY":"READY"));
	}
}

 

후기

* 난이도 (5점 만점)

5 : 풀 줄 알면 기업 코딩테스트는 문제 없음.

4 : 평균적인 기업 코딩테스트의 중간 이상.

3 : 평균적인 기업 코딩테스트의 쉬운 문제 .

2 : 알고리즘 문제를 연습하고 있다면 풀 수 있는 문제.

1 : 시간이 오래 걸리지 않고, 누구나 풀 수 있는 문제.

 

난이도는 매우 쉬운 편이었으며 for문을 사용할 때 길이를 지정해서 사용할 줄 알면 어렵지 않다.

링크

 

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

 

2675번: 문자열 반복

문자열 S를 입력받은 후에, 각 문자를 R번 반복해 새 문자열 P를 만든 후 출력하는 프로그램을 작성하시오. 즉, 첫 번째 문자를 R번 반복하고, 두 번째 문자를 R번 반복하는 식으로 P를 만들면 된다

www.acmicpc.net


 

문제

 

 


풀이

 

2          -> 출력할 로우 개수

3 ABC   -> 첫 번째 로우

5 /HTP  -> 두 번째 로우

 

출력할 로우는 총 2번 이며

 

* 첫 번째 로우는 3번씩 ABC 를 각각 출력하면 된다.

결과 : AAABBBCCC

 

* 두 번째 로우는 5번씩 /HTP 를 각각 출력하면 된다.

결과 : /////HHHHHTTTTTPPPPP

 


어떤 알고리즘인지 파악하면 푸는데 어려움이 없다.

앞에 받은 숫자만큼 뒤에있는 문자열을 1개씩 읽어서 반복문들 실행시키면 된다.

 

위의 로직 구현

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {

	/**
	 * 문자열 반복
	 * @param args
	 */
	public static void main(String[] args) throws IOException {		
		BufferedReader br	= new BufferedReader(new InputStreamReader(System.in));
		int cnt 			= Integer.parseInt(br.readLine());
		StringBuilder sb 	= new StringBuilder();
		
		for (int k = 0; k < cnt; ++k) {
			String[] reqStrArr 	= br.readLine().split(" ");
			int loopCnt 		= Integer.parseInt(reqStrArr[0]);
			String str 			= reqStrArr[1];
			int strCnt 			= str.length();
			
			for (int i = 0; i < strCnt; ++i) {
				for (int j = 0; j < loopCnt; ++j) {
					sb.append(str.charAt(i));
				} //for -3
			} //for -2
			sb.append("\n");
		} //for -1
		System.out.println(sb.toString());
	}
}


 

후기

* 난이도 (5점 만점)

5 : 풀 줄 알면 기업 코딩테스트는 문제 없음.

4 : 평균적인 기업 코딩테스트의 중간 이상.

3 : 평균적인 기업 코딩테스트의 쉬운 문제 .

2 : 알고리즘 문제를 연습하고 있다면 풀 수 있는 문제.

1 : 시간이 오래 걸리지 않고, 누구나 풀 수 있는 문제.

 

난이도는 매우 쉬운 편이었으며 반복문을 이용하면 쉽게 풀 수 있다.

 

 

 

 

 

링크

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

 

11720번: 숫자의 합

첫째 줄에 숫자의 개수 N (1 ≤ N ≤ 100)이 주어진다. 둘째 줄에 숫자 N개가 공백없이 주어진다.

www.acmicpc.net


문제

 


 

풀이

 

1. 받은 문자열을 1자리씩 배열로 나눔

2. 반복문으로 배열의 모든 값 더하기

 

"1234" 라는 값을 받음

{1,2,3,4} 1자리씩 배열로 나눔

반복문으로 배열의 모든 값 더하기

+1  -> 1

+2  -> 3

+3  -> 6

+4  -> 10

결과 : 10

 


위의 로직 구현

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {

	/**
	 * 숫자의 합
	 * @param args
	 */
	public static void main(String[] args) throws IOException {		
		BufferedReader br 	= new BufferedReader(new InputStreamReader(System.in));
		int cnt 			= Integer.parseInt(br.readLine());
		String[] arr 		= br.readLine().split("");
		int sum 			= 0;
		for (int i = 0; i < cnt; ++i) {
			sum += Integer.parseInt(arr[i]);
		}
		System.out.print(sum);
	}
}

 

후기

* 난이도 (5점 만점)

5 : 풀 줄 알면 기업 코딩테스트는 문제 없음.

4 : 평균적인 기업 코딩테스트의 중간 이상.

3 : 평균적인 기업 코딩테스트의 쉬운 문제 .

2 : 알고리즘 문제를 연습하고 있다면 풀 수 있는 문제.

1 : 시간이 오래 걸리지 않고, 누구나 풀 수 있는 문제.

 

난이도는 매우 쉬운 편이었으며 문자열을 1개씩 읽을 수 있는 방법만 알면 풀 수 있는 문제이다.

 

 

 

 

 

 

 

 

 

 

 

 

+ Recent posts