Algorithm/Problem

[BOJ]1380 귀걸이(S5, C++)

검은 까마귀 2024. 2. 27. 10:36

📋 개요 

하루정도 휴식기를 갖고 감잡기 문제 Silver문제를 풀기로 했다. 일단 낮은 난이도의 단계부터 천천히 올라가야겠다. 저번에 푼 브1문제 이후로는 막힘없이 풀고 있다. 이번 풀이에도 걸린 시간은 30min 정도였다.

 

이번에는 문자열과 구현 문제였다. cin으로 개행문자(\n)인 제거하기 부터 공백있는 문자열 받기와 같은 입력과 같은 문제도 나왔다.

 


🧩 문제

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

 

1380번: 귀걸이

입력은 번호를 가진 시나리오들로 구성됩니다. 시나리오 번호는 1부터 순서대로 증가하고, 각 시나리오는 아래의 내용을 포함합니다. 한 줄에 귀걸이를 압수당한 여학생의 수, n (1 ≤ n ≤ 100)이

www.acmicpc.net

📝  형식 

📥 입력 📤 출력
입력은 번호를 가진 시나리오들로 구성됩니다. 시나리오 번호는 1부터 순서대로 증가하고, 각 시나리오는 아래의 내용을 포함합니다.
  • 한 줄에 귀걸이를 압수당한 여학생의 수, n (1 ≤ n ≤ 100)이 주어집니다.
  • 다음 n줄에 걸쳐 여학생들의 이름(최대 60자)이 주어집니다.
  • 다음 2n − 1줄에 여학생 번호와 'A' 또는 'B'가 공백을 사이에 두고 주어집니다. 번호는 교감선생님의 여학생 이름 리스트와 순서가 일치합니다. 즉, 1은 첫 번째로 압수당한 여학생입니다. 여학생 번호는 최대 2번 등장하며, 두 번째로 등장할 때는 첫 번째 경우와 다른 'A' 또는 'B'가 뒤에 적힙니다.
    번호가 처음 등장하는 것은 압수되었음을, 두 번째로 등장하는 것은 돌려받았음을 의미합니다.
'0'을 마지막 줄로 하여 입력이 종료됩니다. '0'은 처리하지 않습니다.
시나리오 번호와 귀걸이를 돌려받지 못한 여학생의 이름을 공백으로 구분하여 한 줄씩 출력하십시오.

💡  예제

🔢 번호 📥 입력 📤 출력
1 3
Betty Boolean
Alison Addaway
Carrie Carryon
1 B
2 A
3 B
3 A
1 A
2
Helen Clark
Margaret Thatcher
1 B
2 B
2 A
0
1 Alison Addaway
2 Helen Clark

 

🥕 내 코드가 정답코드


📖  해설 및 느낀점

# 구현

아이디어는 그렇게 어렵지 않았다. 문제를 자세히 읽어보면 알겠지만 어찌되었던 한명의 여학생만 귀걸이를 받지못한다(2n-1에, 여학생 번호는 최대 2번까지 등장)

 

이러한 조건때문에 t/f로 풀어도 풀린다. 여학생의 수를 주어진 제한사항인 101로 array를 만들어서 기본을 false로 두고 한번 들어오면 true, 두번 들어오면 false로 해서 다시 원상태로 돌려두면 true인 여학생이 딱 한명이 나오게 된다.

 

문제 지문중에 "A,B를 마음대로 선택한다"라는게 있는데 그래서 그런건지 모르겠는데 A,B에 대한 flag는 받기만하지 굳이 사용할 필요가 없었다. 충분히 t/f로 풀이할 수 있는 문제라고 생각했다.

 

일단, STL 컨테이너에 의존하지 않고 풀이하려고 노력 중이다.

 

# C++ 문법

cin.ignore(); //개행처리!!

for(int i = 1 ; i <=  n ; i ++){
    string student;
    getline(cin, student); //string형을 받을때 사용
    sArr[i] = student;
}

/*
cin.ignore() 개행문자(\n)을 무시한다. 내가 작성하면서 발생한 오류는 아래와 같다.

ex)
3 (\n)
Betty Boolean
Alison Addaway
Carrie Carryon
1 B
2 A
3 B
3 A
1 A
0

3이라는 인원수를 받는 n다음에 개행문자가 포함되어있어 아래에 이름들을 문자열을 위한
배열에 담을때 처음 인덱스에 \n라인이 포함되어있어서 이름을 받을때 한칸씩 밀렸다.

이를 해결하기위해 cin.ignore()로 직전에 들어온 개행문자를 무시한다.
*/ 


/*
cin은 자체적으로 구분자를 공백(" ")으로 처리해서 입력을 받지 않는다.
ex) input: Betty Boolean / output: Betty

하지만 문제에서 사용자의 fullname을 입력 받아야했기때문에 내가 원하는 값은 아래와 같다.
ex) input: Betty Boolean / output: Betty Boolean

getline은 구분자를 공백(" ")이 아닌 개행문자(\n)로 구분자를 사용한다.
*/

 

 

 

반응형

'Algorithm > Problem' 카테고리의 다른 글

[BOJ]1059 좋은구간(S4, C++)  (0) 2024.03.07
[BOJ]1057 토너먼트(S4, C++)  (0) 2024.03.07
[BOJ]1524 뒤집힌 덧셈(B1, C++)  (0) 2024.02.23
[BOJ]1524 세준세비(B1, C++)  (0) 2024.02.23
[BOJ]1292 쉽게 푸는 문제(B1, C++)  (0) 2024.02.22